上兩篇我們結(jié)合數(shù)據(jù)驅(qū)動討論了page object模型儒搭,分別用了Excel和csv進行演示。其中Excel參與的演示項目叫SeleniumExcelDataDrivenPOM芙贫,現(xiàn)在打開這個項目搂鲫,看Test.java文件:
雖然我們已經(jīng)把object,測試步驟和驗證過程都加到了LoginPage.java中磺平,可現(xiàn)在這個主類還是很長魂仍。關(guān)鍵問題不是長拐辽,而是非常冗余。比如我現(xiàn)在再寫一個關(guān)于登錄模塊的用例擦酌,比如驗證登錄失敗吧俱诸,除了測試步驟和驗證過程不一樣之外,你要把開頭的driver初始化仑氛,打開網(wǎng)頁乙埃,最大化網(wǎng)頁,讀取測試數(shù)據(jù)源等等等等重寫一遍锯岖。有多少個測試用例你就得寫多少遍這些步驟介袜,非常麻煩。所以出吹,我們需要把一個更加標準的系統(tǒng)來簡化我們的工作量遇伞。從這篇開始,我就帶著大家繼續(xù)一點點改進我們的數(shù)據(jù)驅(qū)動測試系統(tǒng)捶牢,搭建一個框架雛形鸠珠。
所謂的自動化測試框架,我理解就是一個標準化的測試系統(tǒng)秋麸,其特征是一致渐排、復用、擴展性強:
我先不解釋這幾個詞灸蟆,大家可以隨著程序的改進慢慢體會這幾個詞驯耻。其實市面上已經(jīng)有不少自動化的測試框架,很多還是開源的炒考,比如Robot Framework等等可缚,有的公司用現(xiàn)成的框架,有的公司在其基礎(chǔ)上擴展改進斋枢。不得不說現(xiàn)在純寫代碼搞框架已經(jīng)是越來越少了帘靡,因為維護起來有些困難。這一點隨著程序改進大家也能慢慢體會瓤帚。有些人問那為什么你不直接討論現(xiàn)成框架呢描姚?知其然知其所以然,之所以我一定要帶著各位一點一點改進缘滥,嘗試搭建框架過程轰胁,就是想讓大家熟悉一個自動化測試系統(tǒng)的內(nèi)部結(jié)構(gòu),便于以后大家理解其它的現(xiàn)成框架朝扼,同時也鍛煉了寫代碼的能力赃阀,有助于未來在現(xiàn)成框架的基礎(chǔ)上進行小規(guī)模擴展。當然,我也分別寫了Robot Framework榛斯,TestNG观游,和Cucumber的教程供大家學習。不過我強烈建議你們先別走驮俗,先跟著我把框架的結(jié)構(gòu)搞清楚:)
我們開始改懂缕,因為讀取數(shù)據(jù)源大多數(shù)測試用例都需要,所以我先把讀取數(shù)據(jù)源的步驟封裝在一個方法里王凑,并寫到另一個類中搪柑。從現(xiàn)在開始我也要規(guī)范包名,之前介紹過包名的規(guī)范索烹,用的是“所在公司的互聯(lián)網(wǎng)域名.公司名.項目名.功能名”這個格式工碾,我新增一個包命名為叫com.testalliance.hrsystem.test,里面專門放測試過程中需要的一些前提或條件:
然后在該包下創(chuàng)建一個叫Test.java的文件百姓,把讀取數(shù)據(jù)源的步驟放進去渊额。因為com.test里已經(jīng)有一個叫Test.java的文件了,一個項目里最好不要有兩個同名文件垒拢,把com.test改成com.testalliance.hrsystem.managers(為什么起名為managers一會兒再說)旬迹,然后它下面的Test.java改成TestRunner.java:
讀取數(shù)據(jù)源的步驟封裝在Test.java的getTestData()方法中:
第33行我修改了一下,以前testDataCell位置是直接寫死了兩列求类,但這里我動態(tài)求了列數(shù)奔垦,因為有些用例的測試數(shù)據(jù)Excel表格可能是兩列,有些可能是多列尸疆,我們不好把握宴倍。那么現(xiàn)在TestRunner就可以簡化一些了,直接調(diào)用方法仓技。這樣,以后寫其它test case需要測試數(shù)據(jù)時直接調(diào)用就行了俗他,唯一注意的地方就是傳入的文件不一樣罷了脖捻。還一點,以前我們用的都是文件的絕對路徑兆衅,這回我改成了相對路徑地沮。System.getProperty("user.dir")返回的是項目的路徑,你只需要在后面加上剩余的部分就行了羡亩。這么做的好處就是一不用寫大長串摩疑,二如果項目的路徑改了你也不用修改,System.getProperty("user.dir")會自動定位到新的項目畏铆。我們以后最好使用相對路徑雷袋。
順帶著把另外兩個包名也改過來:
接下來就該把另一部分重復的代碼挪出去了,也就是driver初始化辞居,打開網(wǎng)頁楷怒,最大化網(wǎng)頁蛋勺,關(guān)閉driver這幾步,每個測試用例都會用到鸠删。仔細想一下抱完,初始化driver屬于一個測試過程的準備步驟,而關(guān)閉driver屬于掃尾步驟刃泡,嚴格說它們都是在控制管理driver實例巧娱,那可不可以單獨創(chuàng)建一個管理driver的類,然后把它們也封裝到相應的方法里呢烘贴?我們在com.testalliance.hrsystem.managers中新建一個類叫DriverManager.java:
然后粘貼如下代碼:
初始化和關(guān)閉driver分別封裝在preTest()和cleanUp()里禁添。同樣,未來使用它們時直接調(diào)用即可庙楚。打開網(wǎng)頁和最大化網(wǎng)頁這兩步其實可以放在LoginPage.java中上荡,因為我們一般都把網(wǎng)址當作是一個特殊的object并寫在object repository中。打開loginPage.properties馒闷,把網(wǎng)址填進去:
然后把這兩步寫入LoginPage.java:
回到TestRunner.java中酪捡,對它們分別調(diào)用:
現(xiàn)在問題來了,TestRunner.java里面目前只有一個測試用例纳账,如果我想再加一個呢逛薇?TestRunner.java已經(jīng)是主類了,我總不能再繼續(xù)追加吧疏虫?那所有的用例豈不都寫在一起了永罚?所以,測試用例也要挪出去卧秘。我再建一個包com.testalliance.hrsystem.tests.login呢袱,目的是裝所有和login相關(guān)的測試用例。再新建一個類叫TCLogin1.java(同時也把存數(shù)據(jù)的文件名稱改成TCLogin1.xlsx):
把TestRunner.java里面的內(nèi)容全部挪到TCLogin1.java里翅敌,注意把路徑中的文件名也改過來:
封裝的方法叫test()羞福,這樣我們只用在TestRunner.java中直接實例化TCLogin1并調(diào)用test()方法即可:
這篇的改進就到這兒。如果這時你再給登錄模塊添加一個測試用例蚯涮,起名為TCLogin2.java治专,那它也可以被TestRunner類調(diào)用、控制遭顶,有幾個管幾個张峰。TestRunner類就好像一個中控一樣管理著測試用例的調(diào)度:
這下明白為什么把TestRunner.java和DriverManager.java所在的包叫做managers了吧?一個管理測試用例棒旗,一個管理其核心driver喘批。下一篇我們新增幾個登錄模塊的用例,大家再體會一下。
這篇文章的源代碼在SeleniumExcelDataDrivenFrame1項目里邊谤祖。