寫完前兩步測試步驟,現在就該寫驗證查詢的核心代碼了。我們先整理整理思路,思考下面兩個問題:
1. 數據是否全面?首先打開數據集文件TCTIMES-1.xls,這是我們提前準備好的,其實到了這步再做第二個sheet里的數據集也可以。文件里面有4個員工,其中3個有工時表,Tester Four沒有。之所以這樣設計數據集文件就是要把沒有返回結果的情況也考慮進去;
2. 這里的查詢需要有幾個檢查點呢?我覺得應該是兩個。第一個是有沒有返回結果;第二個是如果有返回結果,結果是否正確。
這兩個問題都得到答案后,開始動手。還是老方法,先寫查詢的函數,然后把函數放到test case里調用。打開RIDE,右擊Pages -> Timesheet.html -> New UserKeyword新建函數,起名Search Timesheet By Employee Name,接受員工姓,員工名,以及期望結果總共三個參數 - ${first},${last},和${expectedTimesheetNum}。先別管${expectedTimesheetNum},看前兩個參數。TCTIMES-1.xls文件里員工姓和名是分開的。但是,我搜索的時候是姓和名一起敲進框框里的,后面的驗證中也是驗證整個名字存不存在,不會把姓和名單獨考慮。所以當它們分別傳入到函數中時,我先要把倆字符串合成一個:
連接兩個字符串的關鍵字是Catenate,它屬于RF自帶的類庫,有以下幾種使用方法:
默認情況下接受兩個參數,得到的是“${first} ${last}”,也就是中間會有一個空格。如果加一個參數SEPERATOR就可以自定義中間分隔符。很顯然我們這里用的是默認方法,不過一會兒我們就會用到另外的方法。姓和名組成一個字符串后被賦給一個叫${searchkeyword}的變量,我把它定義成了局部變量,沒聲明在ObjRepository -> timesheet.html里,因為除了這個函數再沒有別的地方會用到它了:
有了名字就好辦了,接下來在按下圖把輸入名字的操作寫在第二行,把點擊查詢按鈕的操作寫在第三行:
可以看到,現在輸入到搜索框的內容已經是姓名的整個字符串。注意,在第四行要有一個等待過程,為網頁搜索留出時間。有時候網速太慢或內容太多導致搜索時間很長,如果搜索還沒完成就開始驗證勢必會影響結果。
做完這步之后我們開始驗證第一個檢查點–看有沒有返回結果。輸入字符串以后如果有匹配的話就應該返回結果了,比如Tester One。我們在火狐瀏覽器里打開Firebug來看看工時表的xpath有什么變化:
只有關于員工Tester One的兩條工時記錄代碼段還顯示出來,別的都不存在了。這樣題目就容易了,在輸入姓名后,我們讓程序檢查員工工時代碼段的數目和預期結果是不是一樣不就得了么?換句話說,就是比較含有該姓名的xpath數量和預期的值是否一樣。我們之前已經把預期結果寫到了TCTIMES-1.xls的employee sheet里,現在可以用到了。對于Tester One來說,有2條就證明和預期結果一樣,測試通過。代碼如下第4步到第8步:
第4步沒什么可說的,一個小注釋,沒必要顯示在最后報告里,因為我只想告訴自己現在開始執行第一個檢查點看看有沒有返回結果,僅此而已。
第5步和第6步里出現了三次${locTSTable_Records_EmployeeName},它代表員工工時的xpath。我們先在ObjRepository -> Timesheet.html里創建出來,值是//table/tbody/tr/td[contains(text(),'||EMPLOYEE NAME||')]:
這個變量看起來有點特殊,||EMPLOYEE NAME||不是個定值,是個可替換的字符串,大家可以像理解函數一樣理解這個變量,||EMPLOYEE NAME||就相當于變量中的參數。這么寫的原因是我們的測試數據里有4位員工,每個員工的工時xpath都不一樣,而不一樣的地方就是姓名。比如Tester One的xpath是//table/tbody/tr/td[contains(text(),'Tester One')],Tester Two的xpath是//table/tbody/tr/td[contains(text(),'Tester Two')],以此類推。所以我們不能把這個變量寫死,要讓程序每次執行時都臨時把||EMPLOYEE NAME||替換成我們在搜索框中輸入的員工姓名。第5步就是在執行替換過程,用到的關鍵字是Replace String。它接受三個參數 – 要被替換的元素位置,被替換的是什么,以及替換成什么。
替換完了我們就可以數一數總共有多少個了,第6步里使用Get Matching Xpath Count,這是個非常重要的語句,就不說三遍了。它在很多驗證的步驟里都出現過,得到的就是在當前頁面中有多少個可見的xpath,再賦給另一個局部變量${timesheetCount}。這個關鍵字接受一個參數,就是某個xpath,直截了當。
寫到這里我們應該意識到,在我們的例子中,對于Tester One來說${timesheetCount}應該等于2,而對于Tester Four來說${timesheetCount}應該是0,也就是沒有返回任何工時記錄。第7步就是執行比較的過程,用到的語句是Should be Equal as Strings。它默認讓兩個字符串參數進行比較,${timesheetCount}雖然代表一個數量,但其數據類型是字符串。參數${expectedTimesheetsNum}也是個字符串,這就解釋了為什么之前我要在數據集中把期望結果那列轉換成字符串格式,就是方便在此進行比較。如果你之前寫成了numbers的格式那對不起了,您還得在這兒轉成字符串格式,否則字符串和numbers強行比較肯定會失敗。Should be Equal as Strings返回的是一個true或false的布爾值,如果true就代表測試通過。
測試通過后,第8步在報告里寫一個log,告知測試完畢,如果測試通過了這條log會顯示出來。這樣,第一個檢查點的函數我們就寫完了。
這篇文章的源代碼在[Test9](https://github.com/cslm/cslm.robotframework/tree/master/Test9)中。