TestNG運作的各種參數
本文基于testNG官網文檔解析+自身實踐說明。testNG運作時的常用參數有如下幾個:
- thread-count
- parallel
- verbose
- time-out
從字面了解也能大概看出是什麼意思。為了友善了解,我們先來看一個完整的xml
下面這個是我自己平時項目用到的xml
<suite thread-count="10" parallel="" verbose="1"
name="simpleTest" annotations="JDK" time-out="1800000">
<parameter name="browser" value="chrome" />
<listeners>
<listener class-name="com.mytestng.utils.testngListener"></listener>
<listener class-name="com.mytestng.utils.myReport"></listener>
</listeners>
<test name="simpleTest" junit="false" annotations="JDK">
<classes>
<class name="com.mytestng.test.runner.cardListTest" />
<class name="com.mytestng.test.runner.wsConfigTest" />
<class name="com.mytestng.test.runner.planTest" />
<class name="com.mytestng.test.runner.quickCreateTest" />
</classes>
</test>
</suite>
thread-count
這個參數是指testNG運作時的線程池的大小。當啟用了parallel時生效。具體的大小可以從xml檔案中指定。若不指定,預設為10.啟用此參數後可以大幅提高測試用例執行的速度
parallel
- parallel=”methods” 按照method級别進行并發,即便是配置了依賴跟順序的也會用不同的線程運作,但是會按照順序。
- parallel=”tests” 按照xml定義的< test > 來運作。
- parallel=”classes” 按照類來并發運作
- parallel=”instances” 這個是按照執行個體來并發運作(這個不常用)
verbose
其實就是日志的備援級别。tesng官方文檔 數字越大,表示日志打的越細緻。這個如果是要對testng進行重寫,或者擴充,做調試的時候還是很有用的。
來點實際的。我們做個示例,看看究竟是不是這樣
先來看看verbose
我們先配置成0:
@Test()
public void doTest() {
System.out.println("this is the verbose parameter test!");
}
運作,看看結果。
0級别的日志。就是0備援:
this is the verbose parameter test!
console隻是輸出了測試用例自己的輸出
我們調整一下。調整到10.看一下會有什麼樣的變化:
...
... TestNG .beta_20130517_2142 by Cédric Beust ([email protected])
...
[TestRunner] Running the tests in 'TestNgClone' with parallel mode:tests
[RunInfo] Adding method selector: [email protected] priority:
[TestClass] Creating TestClass for [ClassImpl class=com.netease.demo.verbose]
[TestClass] Adding method verbose.doTest()[pri:, instance:null] on TestClass class com.netease.demo.verbose
[XmlMethodSelector] Including method com.netease.demo.doBeforeClass()
[XmlMethodSelector] Including method com.netease.demo.doTest()
由于日志很多,就沒截全。可以看到,幾乎每一步的操作都列印出來了。是以通常這個級别,我建議都是調整成5.這樣查找問題會比較友善。
來繼續看看并發運作的參數,我們繼續調整一下。同時,将測試代碼更新一下,加到10個測試
為了不受幹擾,我們日志級别調整到最低
<suite reruntimes="2" thread-count="10" parallel="methods" verbose="0" name="demo" annotations="JDK" time-out="1800000">
然後測試方法的代碼調整下,列印出線程的名稱:
@Test()
public void doTest7() {
System.out.println(Thread.currentThread().getName()+":"+System.currentTimeMillis());
}
結果如下:
TestNGInvoker-doTest2():1495786491980
TestNGInvoker-doTest3():1495786491981
TestNGInvoker-doTest10():1495786491984
TestNGInvoker-doTest1():1495786491984
TestNGInvoker-doTest7():1495786491984
TestNGInvoker-doTest6():1495786491985
TestNGInvoker-doTest9():1495786491986
TestNGInvoker-doTest4():1495786491987
TestNGInvoker-doTest8():1495786491987
TestNGInvoker-doTest5():1495786491988
可以看到,幾乎是同時發起的。當然因為我的電腦比較渣,同時的比較少。而且這裡也可以看到,如果沒有配置test運作的順序,使用了并發的方式執行,執行的順序是無法保證的。
下邊我們再改一下,看看是否可以控制他的順序:
TestNGInvoker-doTest8():1495786748387
TestNGInvoker-doTest1():1495786748388
TestNGInvoker-doTest7():1495786748390
TestNGInvoker-doTest5():1495786748391
TestNGInvoker-doTest2():1495786748392
TestNGInvoker-doTest4():1495786748392
TestNGInvoker-doTest10():1495786748393
TestNGInvoker-doTest3():1495786748393
TestNGInvoker-doTest6():1495786748394
TestNGInvoker-doTest9():1495786748394
事實證明,priorty參數,無法控制執行的順序,那換成dependonmethods呢?
@Test(dependsOnMethods={"doTest1"})
TestNGInvoker-doTest1():
TestNGInvoker-doTest2():
TestNGInvoker-doTest3():
TestNGInvoker-doTest4():
TestNGInvoker-doTest5():
TestNGInvoker-doTest6():
TestNGInvoker-doTest7():
TestNGInvoker-doTest8():
TestNGInvoker-doTest9():
TestNGInvoker-doTest10():
成功了。但是如果隻是這樣。那我的多線程有何用呢?那還不是相當于1個線程在執行?
當然,别忘了,并發是有多種模式的,methods是最小的一個粒度。還可以是tests或者
classes。在其他模式下,還是可以有不小的提升。
更多的用法,可以參考testng的官網文檔,然後自己動手實踐一下。
[1]testng官網
[2]testngListenerAPIs