Robot Framework + Selenium2Library自動化測試系列(12) - 日期和條件語句:遲到早退判斷

不知道上一個test case大家都懂了沒,理解起來或許有一點難度,但還是要搞懂。因為搜索查詢是測試中經常會遇到的情況。同時,寫代碼時我們用到了for循環語句,熟悉編程語言的人應該理解起來沒問題,畢竟Robot Framework雖然是用關鍵字,但它們的背后還是用代碼驅動的。這次我們再加強一下關于字符串轉換,連接以及判斷語句IF的用法。

還是那個員工工時記錄表,我們做一個關于員工遲到早退的判斷練習。大家請看下面幾列:

考勤狀態的格式分為遲到和早退兩部分,中間用逗號間隔:前者標識是否遲到,Late Start代表遲到,Normal代表正常;后者標識是否早退,Early Finish代表早退,Normal代表正常。所以,考勤狀態的組合如下:

我設計的Test case也很簡單,總共3步,步驟如下:

1. 打開網站并登錄;

2. 轉到Timesheet;

3. 驗證考勤狀態是否正確。

右擊Tests -> Timesheets.html新建測試用例TCTIMES-2。第1步和第2步不說了,很簡單,和上一個TCTIMES-1一樣,直接調用函數就可以,我就直接上圖了:

寫完前兩步就要準備數據集TCTIMES-2.xls了。我們發現這個例子只需要登錄時提供用戶名密碼,后面用不到,比上個測試用例簡單,很好,就一個sheet:

第3步,考勤的狀態無非是計劃時間與實際時間的比較,如果比較結果和最后一列的結果一致,則測試通過,反之則失敗。判斷過程如下:

1. 實際上班時間比計劃上班時間晚(Roster Start < Actual Start),狀態就應該是Late Start;

2. 實際上班時間比計劃上班時間早或是一樣(Roster Start >= Actual Start),狀態就應該是Normal;

3. 實際下班時間比計劃下班班時間早(Roster Start > Actual Start),狀態就應該是Early Finish;

4. 實際下班時間比計劃下班時間晚或是一樣(Roster Start <= Actual Start),狀態就應該是Normal。

分析完畢,開始寫函數。右擊Pages -> Timesheets.html -> New User Keyword創建Compare Timesheet函數:

既然要對工時表上每一條員工記錄進行判斷,那當然就離不開循環嘍。再稍微提醒一下,雖然我們這個例子中有4條記錄,但把循環的終值寫成4是個很不好的習慣,因為在實際情況下員工的工時記錄數量是經常變動的,也許你永遠不知道當前有多少條記錄。有人說,那我一條一條數,那行,你去數吧,反正我不數。我們RF中有個利器語句– Get Matching Xpath Count。只要有員工記錄的xpath,這個關鍵字可以動態獲取當前的記錄數目。好,我們馬上新建變量存儲每一條記錄的xpath:右擊ObjRepository -> Timesheet.html –> New Scalar

那么Compare Timesheet函數循環的頭部就出來了:

循環開始后就該進行時間的比較過程了。首先要繼續通過xpath獲取時間信息,以第1條記錄為例:

工作日期://table/tbody/tr[1]/td[2] = 03/10/2017

計劃開始時間://table/tbody/tr[1]/td[3] = 9:00

計劃結束時間://table/tbody/tr[1]/td[4] = 17:00

實際開始時間://table/tbody/tr[1]/td[5] = 9:30

實際結束時間://table/tbody/tr[1]/td[6] = 17:00

考勤狀態://table/tbody/tr[1]/td[7] = Late Start,Normal

我們發現,上面每個值的xpath都含有“//table/tbody/tr[1]/td”,只是后面的索引值不一樣。所以,我們繼續用${locTSTable_Records_Fields}變量,第3步將循環變量${i}轉成字符串,因為要用它作為||ROW NUMBER||替換的值:

這樣,在第一次循環的第4步結束后局部變量${locTSTable_Records_Fields_Row}的值就應該為我們想要的//table/tbody/tr[1]/td。

然后就可以通過字符串連接變量和列的索引值了,上一個test case也演示過。因為代碼量比較多,截圖出來字實在太小,我就截了一部分。下圖中畫紅框的是計劃開始時間的xpath字符串連接以及取值過程。剩余部分大家請參考源代碼。

注意,比較的時候不僅僅是時間之間進行比較,還需要加入日期才完整。我們需要得到的時間格式是dd/MM/yyyy hh:mm。很明顯,這里需要把剛才得到的日期和時間字符串進行連接:

還是拿第一條記錄為例,各個值應該是:

連接完了呢?有人說那就開始比吧。可仔細想想,這個時候比得了嗎?現在的時間看上去只是時間的格式,但其本質還是字符串。字符串怎么比大小?所以我們需要將字符串轉換成時間格式。字符串與時間格式轉換屬于DateTime類,用之前注意在ApplicationSpecific.html中引入DateTime Library。它的API文檔中有如下描述:

日期都轉換完后我們接下來就要做最后一步了– 驗證考勤狀態,看看我得到的考勤狀態和已知的是否相等。如下圖:

第29和第30步Set Variable If是RF中判斷語句if的一個重要使用方法。第三列是比大小,注意變量前后要用單引號,它的意思是如果滿足條件,則把第四列的值賦給第一列的局部變量,不滿足則把第五列的值賦給第一列的局部變量。接著看第35行,把得到的值拼在一起,就得到了實際結果。

取完實際結果就該取期望結果了。看第31步到第33步,還是字符串連接操作。以第一條記錄為例,得到的結果是:${expectedStatus} = “Late Start,Normal”。

有了期望結果和實際結果直接比較就好,第37行還是用Should be Equal As Strings。最后,在TCTIMES-2中加入該函數,別忘了把:

點擊運行,測試通過。

這篇文章的源代碼在[Test11](https://github.com/cslm/cslm.robotframework/tree/master/Test11)里。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容