上兩篇文章演示了怎樣用Excel配合Page Object Model來(lái)實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)。Excel功能很強(qiáng)大,自帶的POI插件用起來(lái)很方便,沒(méi)有什么問(wèn)題。但是,現(xiàn)在越來(lái)越多的公司都在用各式各樣的版本控制系統(tǒng)來(lái)管理項(xiàng)目,比如git,功能非常強(qiáng)大,假如你現(xiàn)在服務(wù)器上有一個(gè)項(xiàng)目,它允許多人下載這個(gè)項(xiàng)目然后同時(shí)各自修改,然后把改完的推送至服務(wù)器端再整合成一個(gè)。
這就帶來(lái)一個(gè)問(wèn)題:每個(gè)人改的地方不一樣還好說(shuō),但假如有A,B兩個(gè)人改了同一處代碼勢(shì)必會(huì)產(chǎn)生沖突,其中A就得再下載一份包含B改動(dòng)的項(xiàng)目然后再解決沖突。不過(guò)git也很聰明,能很方便的解決沖突,不會(huì)讓A重新寫(xiě)一遍。可惜的是,不是每個(gè)項(xiàng)目里的文件有了沖突都可以被輕松解決,Excel就不幸成為了其中一員。一旦A,B兩人修改了同一個(gè)Excel文件產(chǎn)生了沖突問(wèn)題,解決起來(lái)很麻煩。
由于這個(gè)原因,如果可以選擇,我們可以選擇用excel的變種csv文件來(lái)存放測(cè)試數(shù)據(jù)。csv文件可以用純文本形式存儲(chǔ)信息,以逗號(hào)來(lái)分隔字符,非常適合放有一定格式要求的文字。比如我們的測(cè)試數(shù)據(jù)是用戶(hù)名和密碼,放在csv文件里就是按照“用戶(hù)名,密碼”一行一行顯示。演示一下,新建一個(gè)空的.xlsx或.xls的Excel文件 ->另存為–>選擇csv(comma delimiter )。然后按照下面格式輸入:
關(guān)閉csv文件,用記事本打開(kāi),會(huì)發(fā)現(xiàn)它們用逗號(hào)隔開(kāi):
csv默認(rèn)情況下是用逗號(hào)進(jìn)行分割,當(dāng)然你也可以把逗號(hào)改成別的符號(hào),比如"|"或空格之類(lèi)的,有興趣的朋友做完項(xiàng)目可以去改改試試。再看一遍T(mén)est case,步驟如下:
1. 打開(kāi)http://localhost:8081/selenium/hrsystem/index.php;
2. 輸入用戶(hù)名和密碼;
3. 點(diǎn)擊登錄按鈕(斷言點(diǎn):home按鈕出現(xiàn)在home.php頁(yè));
4. 退出(斷言點(diǎn):登錄按鈕出現(xiàn)在index.php頁(yè))。
項(xiàng)目的結(jié)構(gòu)保持不變,還是POM的結(jié)構(gòu):
由于只是改的數(shù)據(jù)源文件格式,所以只用修改Test.java中讀取數(shù)據(jù)源的步驟就可以了,loginPage.properties和LoginPage.java都不用改。直接粘上來(lái):
loginPage.properties:
LoginPage.java:
因?yàn)閏sv文件里的是字符,所以這里我用緩沖字符流的方式讀,不太清楚緩沖流怎么回事的請(qǐng)復(fù)習(xí)文件與字符流那篇的內(nèi)容。我們先上代碼,然后按行講解:
我在第42行用while循環(huán)讓緩沖字符流對(duì)象br每次讀一行,第一行只是個(gè)標(biāo)題,不重要,重要的后面幾行。比如現(xiàn)在讀出了第一行”1001,123”,我一看,這逗號(hào)真討厭,我只需要這兩個(gè)數(shù),怎樣才能把它去掉呢?之前講字符串操作那節(jié)說(shuō)過(guò)我們可以用一個(gè)叫split()的方法,它以一個(gè)字符為基準(zhǔn)把該字符串拆成若干部分,并把它們用一個(gè)字符串?dāng)?shù)組裝起來(lái)。現(xiàn)在就可以用了。因?yàn)閏sv文件的分隔符是個(gè)逗號(hào),而且代表每一行的字符串變量是line,所以我在第45行用line.split(“,”)來(lái)根據(jù)逗號(hào)拆分。每一行里只有一個(gè)逗號(hào),顯然只能拆成前后兩部分,返回的就是一個(gè)長(zhǎng)度為2的字符串?dāng)?shù)組,我用arr_loginDetails代表它。0號(hào)位置放”1001”,1號(hào)位置放”123”,以此類(lèi)推:
如果剛讀完第一行就直接進(jìn)行下一次循環(huán),第二次arr_loginDetails就會(huì)存”1002,456”,第一次的值就丟了,所以該到用ArrayList存數(shù)據(jù)的時(shí)候了。我在第26行創(chuàng)建的叫al的ArrayList<String[]>,然后在第48行來(lái)存每一次循環(huán)完的字符串?dāng)?shù)組。最后循環(huán)完畢al就會(huì)變成<[EmpCode,Password],[1001,123],[1002,456],[1003,789]>。
從al中取數(shù)組時(shí)還是使用遍歷,在第77行,注意循環(huán)從1號(hào)位置開(kāi)始,因?yàn)?號(hào)位置的數(shù)組是[EmpCode,Password],是表頭,用不著。然后arr_loginDetails[0]取出的是用戶(hù)名,arr_loginDetails[1]取出的是密碼。剩下的就是把數(shù)據(jù)用在登錄和斷言步驟中,和上篇用Excel的例子一致。這樣,每次循環(huán)都用了不同的參數(shù)來(lái),以此來(lái)達(dá)到數(shù)據(jù)驅(qū)動(dòng)的目的。
執(zhí)行一下,沒(méi)問(wèn)題:
這就是用csv文件承載測(cè)試數(shù)據(jù)的一個(gè)簡(jiǎn)單演示。Excel和csv演示數(shù)據(jù)驅(qū)動(dòng)就都說(shuō)完了,其實(shí)txt/xml等文件格式也可以用來(lái)存數(shù)據(jù)源,道理大同小異,大家可以任選,不過(guò)真正工作的時(shí)候還是根據(jù)老板的要求來(lái)寫(xiě)。
這篇文章的源代碼是SeleniumCsvDataDrivenPOM項(xiàng)目。