當(dāng)我們有成千上萬(wàn)個(gè)自動(dòng)化測(cè)試用例時(shí)绊率,為了提高測(cè)試用例的執(zhí)行速度究履,往往我們需要對(duì)測(cè)試用例進(jìn)行并發(fā)執(zhí)行。并發(fā)執(zhí)行的方式很多藐俺,而較為簡(jiǎn)單的方式就是通過(guò)TestNG提供的并發(fā)來(lái)完成泥彤。
DataProvider 的并發(fā)
上節(jié)我們已經(jīng)知道了如果通過(guò)@DataProvider進(jìn)行數(shù)據(jù)驅(qū)動(dòng)吟吝,那當(dāng)我們有多個(gè)數(shù)據(jù)源時(shí)我們想一次性執(zhí)行多個(gè)數(shù)據(jù)源該如何設(shè)置呢?
我們只需要在@DataProvider 標(biāo)簽中添加 parallel參數(shù)并設(shè)置值為true便可浙宜。
代碼例子:
@DataProvider(name = "data1",parallel = true)
public Object[][] data2() {
return new String[][]{
{"name", "gsfdg", "fadsf"},{"a","v","c"}
};
}
//在@Test注解中指定dataProvider參數(shù)并設(shè)置獲取數(shù)據(jù)的來(lái)源 testData
@Test(dataProvider = "data1")
public void dataDriverTest(String name, String i, String b) throws InterruptedException {
System.out.println(name + i + b);
Thread.sleep(5000);
}
代碼里面我們?cè)赿ata2()方法中添加了@DataProvider注解粟瞬,并添加了parallel=true參數(shù)萤捆,那么所有用到該數(shù)據(jù)源的測(cè)試方法都將并發(fā)執(zhí)行俗或,所以如下圖當(dāng)這個(gè)腳本運(yùn)行起來(lái)時(shí),我們會(huì)發(fā)現(xiàn)IDEA 同時(shí)執(zhí)行多個(gè)測(cè)試焰轻。但是當(dāng)我們的數(shù)據(jù)源操作10條時(shí)昆雀,默認(rèn)同時(shí)執(zhí)行10條數(shù)據(jù),也就是DataProvider的默認(rèn)線程為10揩懒。那如何更改這個(gè)默認(rèn)值呢挽封?這時(shí)我們就得去修改TestNG的執(zhí)行xml文件。
TestNG 執(zhí)行xml文件介紹
以往我們?cè)趫?zhí)行@Test時(shí)忆某,往往是通過(guò)IDE工具直接選取方法或者類(lèi)右鍵 --> run 的方式來(lái)執(zhí)行阔蛉,其實(shí)真正執(zhí)行的是一個(gè)xml文件状原,這個(gè)xml文件InteliJ IEDA會(huì)默認(rèn)生成于: C:\Users\用戶名.IntelliJIdea\system 底下的“temp-testng-customsuite.xml”。
我們簡(jiǎn)單查看下這個(gè)文件削锰。層級(jí)由外到內(nèi)分別為suite -> test -> class -> method 毕莱。一個(gè)<suite>里面可以包含多個(gè)<test>央串,一個(gè)<test>里面可以包含多個(gè)<class>,并用<classes>嵌套稳摄。<class>里面又可以包含<methods>饲宿。
看到這個(gè)suite瘫想,test,class减噪,method是不是想起TestNG的注解车吹,BeforeSuite、AfterSuite朝卒、BeforeTest乐埠、AfterTest、BeforeClass龙宏、AfterClass伤疙、BeforeMethod、AfterMethod。之前你可能還分不清他們之間的執(zhí)行順序厨姚,這回對(duì)應(yīng)上這個(gè)xml文件键菱,是不是就容易理解了谬墙,例如<suite>里面包含了兩個(gè)class,兩個(gè)class都包含了BefreSuite方法经备, 那么執(zhí)行時(shí)拭抬,會(huì)優(yōu)先執(zhí)行完成這個(gè)兩個(gè)BefreSuite。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Default Suite">
<!-- name 屬性值可以隨便取 -->
<test name="Selenium_Demo_v3">
<classes>
<class name="com.selenium.demo.TestDemo">
<!--被運(yùn)行的Class 名-->
<class name="com.selenium.demo.WaitTest">
<methods>
<!--include 表示運(yùn)行該 Test-->
<include name="waitTest"/>
<!--exclude 表示不運(yùn)行改類(lèi)下的該 Test-->
<exclude name="test1"/>
</methods>
</class> <!-- com.selenium.demo.WaitTest -->
</classes>
</test> <!-- Selenium_Demo_v3 -->
</suite> <!-- Default Suite -->
設(shè)定DataProvider 的并發(fā)數(shù)
當(dāng)我們知道初步了解了TestNG的執(zhí)行xml后侵蒙,我們只需要簡(jiǎn)單修改下<suite>標(biāo)簽造虎,在里面添加“data-provider-thread-count”屬性并設(shè)置值,那么我們就可以設(shè)定DataProvider的并發(fā)數(shù)纷闺。
<suite name="Default Suite" data-provider-thread-count="20">
注意通過(guò)IDEA執(zhí)行時(shí)算凿,不可以在測(cè)試方法上右鍵 -->run ,而是需要在執(zhí)行的xml文件上右鍵 -->run
test犁功,class , method 級(jí)別的并發(fā)
TestNG除了支持DataProvider的并發(fā)外,也支持test浸卦, class , method 級(jí)別的并發(fā)署鸡。設(shè)置基本一樣都是在<suite> 標(biāo)簽添加parallel 和 thread-count 參數(shù),其中parallel參數(shù)表示采用哪種級(jí)別的并發(fā)限嫌,thread-count參數(shù)表示并發(fā)的線程數(shù)靴庆,如下示例:
<suite name="Default Suite" parallel="tests" thread-count="10">
<suite name="Default Suite" parallel="classes" thread-count="10">
<suite name="Default Suite" parallel="methods" thread-count="10">
說(shuō)明:
tests 級(jí)別:我們?cè)趫?zhí)行的xml中配置多個(gè)<test>標(biāo)簽,則每個(gè)<test>標(biāo)簽內(nèi)的測(cè)試用例執(zhí)行在同一個(gè)線程中萤皂。
classes 級(jí)別: 我們?cè)趫?zhí)行的xml中配置多個(gè)<class>標(biāo)簽撒穷,則每個(gè)<class>標(biāo)簽內(nèi)的測(cè)試運(yùn)行在同一個(gè)線程中。
methods 級(jí)別:則運(yùn)行所有的執(zhí)行xml中配置的測(cè)試用例都于不同的線程中裆熙。
并發(fā)的帶來(lái)的問(wèn)題
盡管并發(fā)可以大大縮短我們的測(cè)試時(shí)間端礼,但是從實(shí)踐中我們會(huì)發(fā)現(xiàn)做并發(fā)執(zhí)行腳本時(shí)禽笑,對(duì)腳本的設(shè)計(jì)需要考慮更多復(fù)雜的場(chǎng)景,例如腳本與腳本間依賴等蛤奥,腳本的測(cè)試數(shù)據(jù)傳遞等等都需要在編寫(xiě)腳本時(shí)考慮進(jìn)來(lái)佳镜。