假設環境已經搭建好了。這里用RIDE( Robot Framework Test Data Editor)工具來編寫用例。下面我們對Robot Framework簡稱rf。
我們先考慮下一個最基本的登錄功能的測試用例。
一、自動化測試 與 人工測試
在開始編寫用例之前,我們先來思考下自動化測試和人工測試的區別。對於web頁面的人工測試,我們想下,如果去測試,怎么操作呢?不外乎如下的基本動作:
1)打開瀏覽器
2)輸入url (前提web服務器要正常啟動運行着)
3)等待頁面顯示出來
4)用眼睛看頁面顯示的內容是否與自己想象的一致,如果一致,認為功能正常,否則,會認為程序有問題。
5)通過鼠標、鍵盤執行相關的操作,通過頁面的變化和內容顯示繼續進行檢查功能是否正常。
那么什么是自動化測試呢?其本質就是將人的操作過程(打開瀏覽器、輸入url、鼠標點擊、鍵盤輸入等)以及驗收標准(在人腦中驗收)轉換為測試代碼。
有了測試代碼,就可以讓其自動運行了。
二、登錄用例設計
一個登錄功能,想象下如果是人工測試,那基本的測試過程一般如下:
1)打開瀏覽器、輸入登錄url
2)輸入用戶名、密碼(也許還有別的輸入項,如驗證碼,則取決於程序本身),點擊登錄按鈕
3)如果是正確的用戶名密碼,應該出來相應的頁面;如果是錯誤的,應該出來錯誤頁面或錯誤提示信息。
那我們看看利用Robot Framework怎么寫用例。
三、 用例編寫
1、成功登陸的用例1
successLogin
open browser http://localhost/nau/login ff
input text id=userid xxx
input password id=password yyy
click button id=loginBtn
Wait Until Element Is Visible id=userid
close browser
下面我們看下上面代碼的含義
1)successLogin是用例名,是自己取的
2)后面的語句,每句都是 “關鍵字+參數(0個或多個)”的格式,其中藍色的詞組就是關鍵字。這個例子的關鍵字是rf框架中的內置關鍵字。
用戶可以定義自己的關鍵字。
open browser http://localhost/nau/login ff
這句代碼的含義,其實看上去就能理解。open browser是關鍵字,表示打開瀏覽器;http://localhost/nau/login 是第一個參數,是要打開的頁面url;ff是第二個參數,代表要用的瀏覽器類型,其中ff表示是firefox瀏覽器,gc表示是chrome瀏覽器,ie表示是Internet Explorer瀏覽器。這里我們用的是firefox瀏覽器。
input text id=userid xxx
這句代碼,input text 是關鍵字,表示要在html組件(如文本框)中輸入信息, id=userid 是 第一個參數,用於定位用來輸入的html組件,這里的id表示通過元素的id來定位,userid就是元素的id值。如果頁面中存在一個id為userid的輸入框,則就能找到。 xxx是第二個參數,表示要輸入的值。想象下,如果是人工操作,就是在界面中找到這個輸入框,敲擊鍵盤輸入xxxx這幾個字符。
看到這里,我們可以把關鍵字當作一個函數(其實它本質上就是一個函數),后面跟的是函數參數,有的關鍵字有參數,有的沒有。
input password id=password yyy
這句代碼,也非常好理解了,就是在密碼框中輸入密碼了。其中input password為關鍵字。
click button id=loginBtn
這句代碼,看上去也明白了,click button 是關鍵字,表示點擊按鈕;id=loginBtn是第一個參數,用於定位要點擊的按鈕,這里也是用id來定位的。
Wait Until Element Is Visible id=userid
前面的幾句代碼,進行的相關的操作,這句代碼就是檢查操作結果。如果登錄成功,會出現新的頁面,並且頁面上應該有個元素會顯示用戶的登錄名。
這里的Wait Until Element Is Visible 是關鍵字,顧名思義,就是等待元素可見; id=userid就是要顯示的元素,這里同樣是通過id定位。
實際上這個檢查是不完善的,這里只是檢查了是否有id為userid的元素,但元素的內容呢(正常內容應該是xxx),沒有檢查。這點我么在下個用例介紹。
close browser
上面是這個用例的最后一個語句。這很好理解了,就是關閉瀏覽器。close browser是關鍵字,該關鍵字沒有參數。
執行該用例。如果系統存在用戶名為xxx和密碼為yyy的用戶,則該用例就會成功。
2、成功登陸用例2
上面是一個最基本的用例。上面用例存在一個問題,就是檢查用例成功的標准是看希望的html元素是否存在。但很多時候不僅需要判斷希望的元素是否存在,還需要判斷元素的內容是否符合預期。就上面這個用例,希望 id為userid的元素的內容是xxx。那用例應該如何寫呢?
successLogin2
open browser http://localhost/nau/login ff
input text id=userid xxx
input password id=password yyy
click button id=loginBtn
${value} get text id=userid
Should Be Equal ${value} xxx
close browser
和上個用例相比,區別就是檢查語句(上面紅色的2行)。
其中${value} get text id=userid的含義是 利用關鍵字 get text 獲取id為userid元素的內容放到變量${value}中。
而 Should Be Equal ${value} xxx 語句,Should Be Equal 是關鍵字,用來斷言兩個參數的值是否相等,如果不等,則表示失敗。
3、失敗登錄用例
上面是驗證成功登錄的用例。那應該也有驗證登錄失敗的用例。其思路差不多,就是當登錄失敗后的頁面是啥。通過代碼來進行檢查。
我們假設登錄失敗后會出現一個新的頁面,頁面中有文本 “用戶名或密碼錯誤”字樣。那么用例就可以這么寫。
errorLogin
open browser http://localhost/nau/login ff
input text id=userid xxx
input password id=password yyy123
click button id=loginBtn
Wait Until Page Contains 用戶名或密碼錯誤
close browser
相比前面的用例,區別還是驗收語句。上面的驗收語句一看就明白,Wait Until Page Contains 是關鍵字,用於檢查頁面中是否包含預期的信息。
4、自定義關鍵字
可以看出,上面3個用例,前面的4個語句,區別只是輸入的參數 用戶名和密碼的值區別,我們自然會想到,可以把這4個語句封裝成一個關鍵字,包含兩個參數用戶名和密碼。
關鍵字定義如下:
login
[Arguments] ${username} ${password}
open browser http://localhost/boot/login ff
input text id=userid ${username}
input password id=password ${password}
click button id=loginBtn
使用該關鍵字的用例如下
loginSuccessWithKeywords
login xxx yyy
${value} get text id=userid
Should Be Equal ${value} xxx
close browser
loginErrorWithKeywords
login xxx yyy123
Wait Until Page Contains 用戶名或密碼錯誤
close browser
5、用例的setup和teardown
每個用例,從整個實現講。一般包括如下三大部分:
1)執行條件設置部分(setup部分):因為用例的執行,通常需要一些條件。如前面的登錄成功用例,需要用戶已經存在。
2)用例執行部分:包括該用例進行的操作,對結果的驗證
3)清理部分(teardown部分):在自動化測試中,我們希望用例執行后,對當前環境不會有任何破壞。因此一般需要做些清理工作,包括第一部分條件設置對系統造成的影響和用例執行過程中對系統造成的影響。
rf對這也提供了支持,可以把一個用例分成三部分。雖然我們寫成一部分,從最終效果上講沒區別。但分開了,會更加符合邏輯,用例也非常清楚。
對於我們這個登錄用例,可以看出,每個用例完成的最后一步都要關閉瀏覽器,這里用的是close browser。
因為各個用例都是公共的,我們可以把這放到用例包的teardown中。
*** Settings ***
Test Teardown close browser
這樣每個用例的最后語句close browser都不需要了。
把一些語句放到teardown中,還有一個好處是,無論用例執行部分出現什么問題,最后的teardown都會保證被執行。
三、小結
本篇文章,我們通過一個登錄例子來介紹了rf在web界面自動化測試上的基本應用。雖然比較簡單,但已經把用例編寫最核心的概念和步驟做了介紹。其它功能的用例與之區別在於用例的復雜程度區別(比如准備測試條件、用例執行步驟、結果驗證的復雜性、用例執行影響的清理)。