這篇文章介紹怎樣用java對測試用例進行斷言。斷言英文是assertions,其實就是執行test case后驗證期望結果和實際結果是否一致的一個過程。
前幾篇文章我們主要講的是元素的操作,元素操作只能返回測試的實際結果。這時假如你還有個期望結果,把二者一對比,一樣就pass,不一樣就fail,這就是一個簡單的斷言。一般來說,斷言過程記一個小口訣 -“在不在是不是相等不相等”。
第一個,在不在,就是查看某個元素是否顯示在當前網頁上,或是frame/iframe上。檢查在不在用的是isDisplayed()方法。注意,這個方法只有在該元素已經存在的情況下才可以放心使用,如果元素不存在你還用就會拋異常。確定存在的方法是用findElements()先取個數,看個數大不大于0,大于就證明存在,就可以接著用isDisplayed()。為什么可以用findElements()?因為它不拋異常。isDisplayed()和findElements()怎么使用其實在之前普通文本操作那篇的后半段有涉及,不太清楚的朋友去參考一下。
第二個,是不是,就是查看某個值是不是和期望值相等/不相等/比它大/比它小。我們現在還沒講類似Junit或TestNG之類的測試框架,所以只能用純java語法來做,也就是用if語句配合條件運算符來做。簡單演示一下“在不在”和“是不是”,打開示例網頁assertions.html:
這是我隨便做的一個用于演示斷言的小網頁,里面有個模擬用戶注冊的小界面,邏輯很簡單,輸入用戶名和密碼,然后點注冊按鈕。因為只是個演示,你隨便輸什么值能注冊成功,但前提是兩個文本框必須都要輸入東西時才能注冊成功,缺一個就報錯:
我們的test case就像上面那幅圖一樣:
1. 輸入用戶名marco;
2. 密碼為空,點擊注冊按鈕;
3. 驗證:1)密碼錯誤信息在不在;2)實際錯誤信息和期望值相等不相等。
給大家提個醒,寫自動化測試test case之前務必把步驟寫下來,然后再對照著一步一步寫代碼。別懶,有時候一個復雜case十幾步二十步,光憑大腦記憶萬一中間漏寫了一步代碼呢?那你還得重新梳理你腦子里的步驟,浪費時間。這都是我曾經跌過的坑摔過的傷流過的淚以及掉過的頭發,太痛苦,所以我祝你們今生再不重蹈覆轍。簡單演示一下,新建一個叫SeleniumAssertions的java項目 -> 包com.test -> Test.java,添加selenium jar包,把driver聲明配置好。先上代碼:
你看,這就是個典型的“在不在”和“是不是”結合的寫法。點擊注冊按鈕后,因為要驗證密碼錯誤信息“在不在”,我怕它不在會報錯,所以我先用findElements()查看個數,如果大于0證明存在,然后我再用isDisplayed()看它顯示不顯示。在顯示的前提下再驗證“是不是”,也就是判斷測試實際值和期望值相等不相等,其實就是字符串的比較。注意這里一定要用equals,因為比較的是字符串的內容,千萬別用“==”,倆等號比的是字符串的地址,別搞混了。
再看一個例子,assertions.html上還有個生成隨機數的例子,每點一次文本框中都會產生一個0到100的整數(包括0):
我們的test case如下:
1. 點擊按鈕;
2. 驗證:出現的數值大于等于0并且小于100
代碼如下:
點擊id=button那個按鈕會得到一個隨機生成的值,從文本框中把它取出來。因為默認是字符串,需要轉成整型,然后比較,整個過程很容易理解。你如果有時間還可以試試其它的條件表達式,我這兒就不再舉了。
第三個,相等不相等,這個用的比較靈活,不需要期望值。咱們看assertions.html的復選框案例:
有四個復選框,每一個旁邊都有名稱。我現在想判斷復選框個數是不是和名稱個數相等。你當然可以分別計算個數再比較,但其實用不著。這時就可以用第三個斷言過程,因為我發現復選框和名稱一定是成對出現的,如果雙方數量不相等肯定是網頁有問題。所以在我的test case中不需要分別設置期望值,直接比較兩者即可。代碼如下:
求個數當然就還得用findElements()配合size(),別的沒什么可說的。還有一點,這個例子中沒必要設置期望值還有一個原因,就是需求。大家想想,設計復選框的目的本來就是讓人選好幾個,那有沒有可能會隨著網站開發的不斷完善添加更多的選項呢?很有可能。十年前沒微博沒微信,當時寫的網站里關于社交的選項也就是人人網開心網,現在不就井噴了很多嗎?比如陌陌對不對?好了,不開車。反正這種情況下期望值有可能根據需求慢慢增加,但標簽和復選框卻始終成對出現,所以直接對比即可。當然,如果你實在害怕它們個數雖然相等但個數有誤,那多寫幾行代碼也沒什么。
這就是斷言的“在不在是不是相等不相等”,記住這個口訣。這篇文章的源代碼在SeleniumAssertions里。