天天看點

TestNG運作時參數說明TestNG運作的各種參數

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

  1. parallel=”methods” 按照method級别進行并發,即便是配置了依賴跟順序的也會用不同的線程運作,但是會按照順序。
  2. parallel=”tests” 按照xml定義的< test > 來運作。
  3. parallel=”classes” 按照類來并發運作
  4. 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

繼續閱讀