Selenium Web Driver自動(dòng)化測(cè)試(java版)系列下半部分(35) - 關(guān)鍵字驅(qū)動(dòng)

上幾篇利用數(shù)據(jù)驅(qū)動(dòng)配合POM搭建了一個(gè)自動(dòng)化測(cè)試框架雛形,其實(shí)目前已經(jīng)滿足我們的需要了。但除了數(shù)據(jù)驅(qū)動(dòng)之外,測(cè)試界還有一種廣泛利用的驅(qū)動(dòng)方式,叫做關(guān)鍵字驅(qū)動(dòng)。這篇我們就討論一下它。

先說(shuō)什么是關(guān)鍵字。在寫(xiě)測(cè)試程序時(shí),我們免不了要對(duì)頁(yè)面上的元素進(jìn)行操作,比如輸入、點(diǎn)擊、刷新等等。之前我們都是以代碼的形式表現(xiàn)這些操作的,輸入是調(diào)用sendKeys()方法,點(diǎn)擊是click(),刷新是refresh()。通常執(zhí)行一個(gè)test case經(jīng)常需要調(diào)用這幾個(gè)方法。比如我們還是用示例網(wǎng)站演示一下登錄步驟,測(cè)試步驟如下:

1. 打開(kāi)http://cslm-test.com/hrsystem/index.php
2. 輸入用戶名"1001";
3. 輸入密碼"123";
3. 點(diǎn)擊登錄按鈕(斷言點(diǎn):home按鈕出現(xiàn)在home.php頁(yè));
4. 退出(斷言點(diǎn):登錄按鈕出現(xiàn)在index.php頁(yè))。

程序如下:

sendKeys()和click()各調(diào)用兩次。這還是一個(gè)很簡(jiǎn)單的測(cè)試程序,試想如果測(cè)試步驟足夠多,那我們會(huì)一直不停地來(lái)回使用它們。有人就覺(jué)得煩了,他們想如果每種操作只寫(xiě)一遍就好了,這樣只要根據(jù)不同情況傳入不同的參數(shù)就行。比如上面例子中的兩次輸入操作,它們都用sendKeys(),只不過(guò)參數(shù)不同,一個(gè)是員工代號(hào),一個(gè)是密碼。這兩個(gè)參數(shù)的元素位置不同,使用的測(cè)試數(shù)據(jù)也不同:

注意劃紅線的部分,咱們介紹POM那篇說(shuō)過(guò),我們用object來(lái)表示網(wǎng)頁(yè)元素的定位過(guò)程,所以我就也把object標(biāo)上了。除了object和測(cè)試數(shù)據(jù)不同,定位器也有可能不一樣,只不過(guò)這個(gè)例子中恰好都用id定位器。看出點(diǎn)端倪來(lái)了吧,只要根據(jù)不同情況替換這三個(gè)地方的東西就可以了。總結(jié)一下,一個(gè)相同點(diǎn):它們都是輸入操作;三個(gè)不同點(diǎn): 定位器,object,和測(cè)試數(shù)據(jù)。

如果把這一個(gè)相同點(diǎn)三個(gè)不同點(diǎn)提取出來(lái)放在一個(gè)文件里并寫(xiě)成程序,是不是可以用下面這個(gè)格式表達(dá)呢?

我們的做法是逐行掃描文件,如果第一列是“輸入操作”,則把后三列的值拿出來(lái)拼到下面的driver.findElement()語(yǔ)句中,如果不是則跳過(guò)。很明顯,這兩行都滿足條件,第一行讀完后輸入了員工代號(hào),第二行讀完后輸入了密碼。整個(gè)過(guò)程中我們把重復(fù)調(diào)用sendKeys()的過(guò)程替換成了讀文件的過(guò)程,然后根據(jù)情況傳參數(shù)而已,這樣driver.findElement(...).sendKeys()只用寫(xiě)一遍。是不是我們的目的達(dá)到了?文件中第一列的條件,也可以說(shuō)指令,就是所謂的關(guān)鍵字。

這兩行數(shù)據(jù)順序不能亂,顛倒了就變成先輸密碼再輸員工代碼了,就不對(duì)了。所以,設(shè)計(jì)一個(gè)關(guān)鍵字驅(qū)動(dòng)的文件一定要遵循test case的執(zhí)行順序。我現(xiàn)在把例子中所有的操作都變成關(guān)鍵字寫(xiě)在文件里:

從第二行打開(kāi)瀏覽器,一直到最后一行的驗(yàn)證,每一行都是一個(gè)操作,而且它們都按照順序?qū)懴聛?lái)。注意,不是每個(gè)關(guān)鍵字都需要后面三列,有些操作比如像點(diǎn)擊,就不需要最后一列測(cè)試數(shù)據(jù),因?yàn)椴恍枰斎肴魏螙|西;打開(kāi)最大化瀏覽器窗口這些操作甚至什么參數(shù)都不用。設(shè)計(jì)文件時(shí)要具體步驟具體分析。按照這種思路,我們可以把它變成代碼:

看這段偽代碼。在一行一行讀文件時(shí),如果當(dāng)前行的第一列關(guān)鍵字是“Input Text”,那就調(diào)用enter方法,該方法傳遞四個(gè)參數(shù),后三個(gè)正好是文件后三列的數(shù)據(jù),也就是定位器、object、測(cè)試數(shù)據(jù)。因?yàn)槎ㄎ黄骺赡苁?種中的任意一種,所以需要用條件語(yǔ)句再進(jìn)行判斷。同理,如果當(dāng)前行的第一列是別的關(guān)鍵字,那就調(diào)用別的相關(guān)方法。看到了吧,這里面最關(guān)鍵的就是關(guān)鍵字與元素操作的匹配:

所以,最終程序如下:

第50行開(kāi)始對(duì)文件進(jìn)行逐行掃描,每次取一行查看第一列,我用變量keyword表示。如果keyword匹配下面任意一個(gè)關(guān)鍵字,則調(diào)用相關(guān)操作的方法。所有操作方法在第117行到第165行。注意第168行,由于每個(gè)關(guān)鍵字觸發(fā)的操作都需要判斷定位器,所以我把定位器判斷的過(guò)程單獨(dú)提出來(lái)放到getObject()方法中,返回元素對(duì)應(yīng)的object。執(zhí)行一下:

這就是一個(gè)簡(jiǎn)單的關(guān)鍵字驅(qū)動(dòng)示例,你可以用把自動(dòng)化測(cè)試中任何一個(gè)操作寫(xiě)成一個(gè)關(guān)鍵字。看完這個(gè)例子,想必大家也明白了關(guān)鍵字驅(qū)動(dòng),原理無(wú)非是把元素操作與關(guān)鍵字匹配,然后根據(jù)test case的步驟在文件中羅列需要的關(guān)鍵字,最后根據(jù)不同的操作分別處理。牢記兩個(gè)關(guān)鍵點(diǎn):第一,用關(guān)鍵字驅(qū)動(dòng)時(shí)文件中裝的是test case,關(guān)鍵字排列順序要與測(cè)試步驟一致;第二,關(guān)鍵字與元素操作匹配。

討論數(shù)據(jù)驅(qū)動(dòng)時(shí)還介紹了page object model,關(guān)鍵字驅(qū)動(dòng)也可以用POM設(shè)計(jì)模式。我們給它改一下。首先項(xiàng)目結(jié)構(gòu)如下:

先把元素的object提取出來(lái)寫(xiě)在LoginPage.properties中:

然后把讀取object、定位器判斷、操作方法都挪到LoginPage.java中:

主類(lèi)Test.java中只剩下讀取關(guān)鍵字和關(guān)鍵字匹配過(guò)程:

通過(guò)實(shí)例化LoginPage得到的對(duì)象調(diào)用相關(guān)方法完成test case。再次執(zhí)行一下:

以上就是關(guān)鍵字驅(qū)動(dòng)的介紹,原理就是把元素操作與關(guān)鍵字匹配,然后根據(jù)test case的步驟在文件中羅列需要的關(guān)鍵字,最后根據(jù)不同的操作分別處理。數(shù)據(jù)驅(qū)動(dòng)和關(guān)鍵字驅(qū)動(dòng)各有各的特點(diǎn),數(shù)據(jù)驅(qū)動(dòng)通過(guò)把測(cè)試數(shù)據(jù)從test case中分離避免了test case的重寫(xiě),而關(guān)鍵字驅(qū)動(dòng)則通過(guò)把元素操作與關(guān)鍵字匹配從而減少了測(cè)試步驟了重寫(xiě),代碼量大大下降。市面上用得比較多的測(cè)試框架就是基于關(guān)鍵字驅(qū)動(dòng)設(shè)計(jì)的,有些甚至不用你寫(xiě)代碼就可以使用,因?yàn)槊恳粋€(gè)關(guān)鍵字背后的代碼人家都替你寫(xiě)好了。比如有一個(gè)叫Robot Framework的框架就能實(shí)現(xiàn)這點(diǎn),而且還很受歡迎。如果感興趣請(qǐng)看我的Robot Framework + Selenium2Library文集繼續(xù)。

這篇文章的源代碼是SeleniumExcelKeywordDrivenPOM項(xiàng)目。

本篇知識(shí)點(diǎn)及注意事項(xiàng):
1. 關(guān)鍵字驅(qū)動(dòng)測(cè)試的原理就是把元素操作與關(guān)鍵字匹配,然后根據(jù)test case的步驟在文件中羅列需要的關(guān)鍵字,最后根據(jù)不同的操作分別處理。
2. 用關(guān)鍵字驅(qū)動(dòng)時(shí)文件中裝的是test case,關(guān)鍵字排列順序要與測(cè)試步驟一致。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容