上篇我們開始用關(guān)鍵字驅(qū)動修改框架爹殊,定位了項(xiàng)目目錄铆农,還修改了測試文件雏吭,這篇我們繼續(xù)修改測試過程。和數(shù)據(jù)驅(qū)動框架版本一樣淮悼,測試過程的控制器還是TestRunner.java這個(gè)文件咐低,而且也分測試準(zhǔn)備、測試中袜腥、測試收尾渊鞋,相似度可以說是90%了。但鑒于關(guān)鍵字驅(qū)動讀取文件原理的不一樣瞧挤,所以唯一一點(diǎn)我們需要改的地方就是就是測試中這部分:
先回憶一下關(guān)鍵字驅(qū)動的特點(diǎn):在測試文件中按順序?qū)憸y試步驟锡宋,然后在程序中羅列操作,掃描文件時(shí)根據(jù)步驟判斷該執(zhí)行哪個(gè)操作:
但是特恬,上篇文章我們已經(jīng)修改了測試文件执俩,里面包含了login和logout兩個(gè)generic functions,我們上一篇介紹關(guān)鍵字驅(qū)動時(shí)的條件判斷中并沒有包括generic functions癌刽,按理說我們應(yīng)該把它們加進(jìn)去役首。不過等等,現(xiàn)在我們只有兩個(gè)generic functions显拜,但隨著test case越來越多未來還可能有很多很多個(gè)衡奥,問題是你真的要一個(gè)一個(gè)的加到條件判斷里嗎?這樣的話會不會使得判斷語句變得很長很長很長远荠?
所以矮固,這么做不太聰明,還得想別的辦法譬淳。既然這些新的都是generic functions档址,那我就把它們?nèi)珮?biāo)成一類操作,如果我把上圖中的switch-case語句變成if-else邻梆,那我是不是只需要多加一個(gè)else語句就行了守伸?指的是只要掃描到文件中的generic function,就執(zhí)行else:
再結(jié)合我們上篇修改的文件浦妄,是不是明白了點(diǎn)什么尼摹?以登錄成功的test case為例见芹,執(zhí)行過程大體畫張圖就是這樣:
圖畫得有點(diǎn)亂,別嚇著蠢涝。其實(shí)也沒那么亂玄呛,帶大家梳理一遍就清楚了。左邊部分是條件語句惠赫,右邊是涉及到的兩個(gè)測試文件 - tcLogin1.xlsx和login.xlsx把鉴。執(zhí)行過程如下:
第1步:程序開始執(zhí)行時(shí)先掃描tcLogin1.xlsx,遇到的第一個(gè)關(guān)鍵是login儿咱,隨即執(zhí)行最后一個(gè)else語句庭砍;
第2步:通過else里的種種操作使得程序開始掃描login.xlsx,執(zhí)行從Open Browser到Click Element之間的步驟混埠;
第3步:返回tcLogin1.xlsx怠缸;
第4步:繼續(xù)執(zhí)行下一個(gè)關(guān)鍵字Verify Element Text;
第5步:執(zhí)行關(guān)鍵字logout钳宪,再一次執(zhí)行了最后一個(gè)else語句揭北;
第6步:再一次通過else里的種種操作使得程序開始掃描login.xlsx,執(zhí)行Click Element;
第7步:返回tcLogin1.xlsx吏颖;
第8步:執(zhí)行最后一個(gè)關(guān)鍵字Verify Element Display搔体,結(jié)束。
這樣半醉,雖然看起來是掃描了一個(gè)測試文件tcLogin1.xlsx疚俱,但其實(shí)是一環(huán)套一環(huán),每次執(zhí)行完generic function后都要回到原來的地方繼續(xù)缩多。明白了這些呆奕,我們開始寫掃描文件中的測試步驟,這步是由Test.java完成衬吆。我給這個(gè)方法起個(gè)名叫stepThrough()梁钾,把測試文件作為參數(shù)傳進(jìn)去,然后把除最后一個(gè)else之外的條件語句都寫好:
理解起來沒什么難度逊抡,基本上就是關(guān)鍵字驅(qū)動這篇例子的翻版姆泻,我們先留著else里面不寫。除此之外秦忿,因?yàn)闇y試數(shù)據(jù)有時(shí)不止一組麦射,所以在掃描文件的測試步驟前還需先獲取數(shù)據(jù)集,這步也放在Test.java里灯谣,方法叫g(shù)etTestData():
有了數(shù)據(jù)源和測試步驟掃描,測試過程才完整蛔琅。為了看起來方便我們再寫一個(gè)叫executeTest()的方法把它們都放進(jìn)來:
當(dāng)然胎许,page objects也不能落下。先不用管executeTest()里面接了四個(gè)參數(shù),分別是driver辜窑,文件名钩述,文件的sheet,以及module穆碎,也就是模塊牙勘。前面三個(gè)好理解,為什么最后還要有個(gè)模塊呢所禀?先跳過這個(gè)問題方面,一會兒就明白了。很明顯色徘,executeTest()就是我們的測試過程恭金,我們只需要在TestRunner.java中調(diào)用它就可以了:
現(xiàn)在還不能執(zhí)行,別忘了褂策,Test.java里邊還有個(gè)else沒寫呢横腿,應(yīng)該寫什么呢?再看一遍上面的執(zhí)行流程斤寂,剛才說了耿焊,這個(gè)過程看起來是掃描了一個(gè)測試文件tcLogin1.xlsx,但其實(shí)是一環(huán)套一環(huán)遍搞,每次執(zhí)行完generic function后都要回到原來的地方繼續(xù)罗侯。你體會一下,不管是掃描一個(gè)測試文件尾抑,還是它的generic functions歇父,執(zhí)行方式感覺都是一樣的,逐步遞進(jìn)再愈,按步回歸榜苫。這點(diǎn)像什么?是不是像我們之前介紹java時(shí)說的遞歸方法翎冲?所以垂睬,我們只需要在else語句中重復(fù)這個(gè)過程即可:
里面我設(shè)置了一個(gè)module參數(shù),指的是訪問哪個(gè)包含generic functions的文件】购罚現(xiàn)在明白當(dāng)初為什么要在測試文件上加一列module了吧驹饺?就是要作為參數(shù)傳進(jìn)這里邊的。程序本身不難理解缴渊,把參數(shù)想成實(shí)際值帶入一下就好了赏壹。
這就是把數(shù)據(jù)驅(qū)動框架改成關(guān)鍵字驅(qū)動框架的一個(gè)例子。還是那句話衔沼,框架的設(shè)計(jì)方式成千上萬蝌借,你也可以設(shè)計(jì)自己喜歡的昔瞧,只要解決問題就可以了。我個(gè)人感覺關(guān)鍵字驅(qū)動設(shè)計(jì)起來還是挺費(fèi)事的菩佑,咱們現(xiàn)在程序簡單自晰,只測了登錄功能,但隨著其它功能的引入稍坯,很可能你會發(fā)現(xiàn)原來的測試文件需要添加其它信息酬荞,一個(gè)module已經(jīng)不好使了。而且越來越復(fù)雜瞧哟,一個(gè)人寫起來很困難混巧。所以,市面上有很多現(xiàn)成的以關(guān)鍵字為驅(qū)動的框架我們可以直接拿來用绢涡,不少還是開源的牲剃,你一看就知道不是一個(gè)人開發(fā)的,需要一整個(gè)團(tuán)隊(duì)雄可。其中一個(gè)叫Robot Framework凿傅,很流行,我也寫了簡單的入門材料数苫,大家有時(shí)間可以看一下聪舒。
這篇文章的源代碼是SeleniumKeywordDrivenFramework項(xiàng)目。