本系列所有代碼?https://github.com/zhangting85/simpleWebtest
?
本文將介紹一個(gè)Java+TestNG+Maven+Selenium的web自動(dòng)化測(cè)試腳本環(huán)境下testNG的Dataprovider的使用和數(shù)據(jù)驅(qū)動(dòng)的自動(dòng)化測(cè)試的實(shí)現(xiàn),并提供全部代碼。
?
?
首先,DataProvider是什么?
這是testNG提供的一個(gè)做數(shù)據(jù)驅(qū)動(dòng)的自動(dòng)化測(cè)試時(shí)用到的標(biāo)簽。詳見testNG官網(wǎng)文檔。
?
很多人會(huì)在使用testNG的時(shí)候把測(cè)試數(shù)據(jù)文件獨(dú)立出來,有的人會(huì)自己去寫讀文件的方法,在測(cè)試方法里去調(diào)用。這樣寫不一定不好,但有時(shí)我們?nèi)绻私鈚estNG提供的方法,就多了一種選擇。而且通常DataProvider是比較好的一種選擇。
?
DataProvider有兩種寫法:
?
一種是返回一個(gè)Iterator的泛型對(duì)象,代碼如下:
1
package
simplewebtest.test.testcases.sample.jd;
2
3
import
java.util.ArrayList;
4
import
java.util.Arrays;
5
import
java.util.Iterator;
6
import
java.util.List;
7
8
import
org.testng.annotations.DataProvider;
9
import
org.testng.annotations.Test;
10
11
import
simplewebtest.core.TestCase;
12
import
simplewebtest.core.page.sample.jd.JDHomepage;
13
14
public
class
TestJDDataDriven
extends
TestCase {
15
16
17
18
19
/**
20
* JD首頁上搜索一個(gè)商品 主要介紹定位某個(gè)商品名稱的N種寫法
21
* 這里用了DataProvider
22
* (不會(huì)用DataProvier不要說自己懂testNG)
23
*/
24
@Test(dataProvider="product_to_search"
)
25
public
void
searchProduct(String keyword)
throws
InterruptedException {
26
27
log.info("keyword="+
keyword);
28
//
方法鏈。方法鏈并不會(huì)導(dǎo)致調(diào)試?yán)щy,因?yàn)槲沂窍葘懢€性腳本后重構(gòu)成這種腳本this is a method chain
29
String actual_procut_name=
new
JDHomepage().init().searchHeader.search(keyword).getProductNameByIndexMethodTwo(1
);
30
log.info("actual_procut_name="+
actual_procut_name);
31
assert
(actual_procut_name.contains(keyword));
32
log.info("--------------------------------"
);
33
}
34
35
/**
36
* 一個(gè)返回iterator的的DataProvider
37
*/
38
@DataProvider(name="product_to_search"
)
39
public
Iterator<Object[]>
createData1() {
40
//
一個(gè)Array
41
String[] astringarray={"巧克力","餅","糕","蛋"
};
42
//
轉(zhuǎn)成一個(gè)String的List
43
List<String> lines=
Arrays.asList(astringarray);
44
45
//
一個(gè)Object的空的List
46
List<Object[]> data =
new
ArrayList<Object[]>
();
47
48
//
往空List里放東西,然后返回
49
for
(String line :lines )
50
{
51
data.add(
new
Object[]{line});
52
}
53
return
data.iterator();
54
55
}
56
57
}
?
另一種是返回一個(gè)Object的二維數(shù)組,代碼如下:
1
package
simplewebtest.test.testcases.sample.jd;
2
3
import
org.testng.annotations.DataProvider;
4
import
org.testng.annotations.Test;
5
6
import
simplewebtest.core.TestCase;
7
import
simplewebtest.core.page.sample.jd.JDHomepage;
8
9
public
class
TestJDDataDriven2
extends
TestCase {
10
11
12
13
14
/**
15
* JD首頁上搜索一個(gè)商品 主要介紹定位某個(gè)商品名稱的N種寫法
16
* 這里用了DataProvider
17
* (不會(huì)用DataProvier不要說自己懂testNG)
18
*/
19
@Test(dataProvider="product_to_search"
)
20
public
void
searchProduct(String keyword)
throws
InterruptedException {
21
22
log.info("keyword="+
keyword);
23
String actual_procut_name=
new
JDHomepage().init().searchHeader.search(keyword).getProductNameByIndexMethodTwo(1
);
24
log.info("actual_procut_name="+
actual_procut_name);
25
assert
(actual_procut_name.contains(keyword));
26
log.info("--------------------------------"
);
27
}
28
29
/**
30
* 一個(gè)返回Object2維數(shù)組的DataProvider
31
*/
32
@DataProvider(name="product_to_search"
)
33
public
Object[][] createData1() {
34
return
new
Object[][] {
35
{ "巧克力"
},
36
{ "餅"
},
37
{ "核桃"
},
38
};
39
}
40
41
}
?
這兩種寫法都可以,隨個(gè)人喜好選擇吧。第二種方法更古老一點(diǎn),在沒有泛型的年代就只能用它了。
?
另外,DataProvider還支持并行執(zhí)行。
比如,
@DataProvider(name="product_to_search",parallel =
true
)
parallel屬性為true時(shí),testNG會(huì)并行執(zhí)行這個(gè)DataProvider提供的測(cè)試數(shù)據(jù)。
如此,我們的測(cè)試執(zhí)行速度也會(huì)大幅提升(如果你的電腦有多個(gè)CPU,速度提升更明顯)。下期介紹testNG中的并行測(cè)試執(zhí)行時(shí)會(huì)給出例子。
?
有人問,我要把測(cè)試數(shù)據(jù)放到獨(dú)立文件里去的話,怎么做?
這個(gè)問題其實(shí)很簡單,我們?nèi)耘f使用DataProvider,在DataProvider里調(diào)用負(fù)責(zé)文件讀取的方法,然后把文件內(nèi)容存入我們DataProvider的返回值中。例子就不給了,請(qǐng)自己動(dòng)手寫吧。
但是呢,測(cè)試數(shù)據(jù)和測(cè)試用例分開放雖然有他的好處,新的問題卻會(huì)產(chǎn)生:程序的讀者(需要閱讀或維護(hù)你代碼的人)怎么知道哪個(gè)用例對(duì)應(yīng)哪個(gè)數(shù)據(jù)?我親眼見過有的人把上百個(gè)測(cè)試用例的數(shù)據(jù)放在一個(gè)txt文件里。其結(jié)構(gòu)之混亂,對(duì)程序讀者來說,無疑是一場(chǎng)災(zāi)難。請(qǐng)不要這么做!請(qǐng)?jiān)趯懘a時(shí),考慮讀者的感受,讀者每次讀到一個(gè)蹩腳的設(shè)計(jì)時(shí)是多么地難受啊。
?
有人問,我要把DataProvider獨(dú)立到一個(gè)專門的類里去,行不行?
你可以自己試試哦,我記得是可以的。同樣,請(qǐng)?jiān)谧鲞@種設(shè)計(jì)前考慮一下讀者的感受,我不希望在一個(gè)巨大的包含幾百個(gè)方法的類里尋找我用到的測(cè)試方法的DataProvider,請(qǐng)不要這么設(shè)計(jì)。
?
有人問,我一個(gè)DataProvider可不可以為多個(gè)測(cè)試方法提供數(shù)據(jù)?
完全可以哦,DataProvider上是可以跟一個(gè)傳入?yún)?shù)Method的,用來表示調(diào)用這個(gè)DataProvider的方法名稱。你可以在后續(xù)的代碼里判斷這個(gè)Method的值,根據(jù)不同的方法名為方法提供不同的數(shù)據(jù)。官網(wǎng)有例子哦,請(qǐng)看官網(wǎng)啊親。或者自己試試寫吧。這個(gè)系列里關(guān)于testNG的東西我就簡單帶過了,主要講selenium嘛。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

