testng.xml 配置大全


1.TestNG的運行方式如下:

1 With a testng.xml file           直接run as test suite
2 With ant                         使用ant
3 From the command line            從命令行
4 IDE                              直接在IDE中執行

在IDEA中直接運行的時候,需要說明的是:可以運行一個測試類,也可以單獨運行一個測試的方法。

在IDEA里執行,只需要右鍵,點擊 Run xxx 即可。 如果是在某一個方法的代碼塊里右鍵,出現的是 Run methodName ,即只運行當前的方法; 如果是在類的代碼塊里右鍵,出現的是 Run className ,即運行當前類中的所有Test方法; 也可以創建testng.xml,右鍵出現的 Run path/testng.xml ,即運行該配置文件中需要運行的方法。

 

2.TestNG常見的注解:

注解 描述
@DataProvider 為測試方法提供數據
@BeforeMethod 在每個測試方法 前 執行
@AfterMethod 在每個測試方法 后 執行
@BeforeClass 被注釋的方法將在當前類的第一個測試方法調用前運行
@AfterClass 被注釋的方法將在當前類的所有測試方法調用后運行
@BeforeGroups 被配置的方法將在列表中的gourp前運行。這個方法保證在第一個屬於這些組的測試方法調用前立即執行
@BeforeTest 被注釋的方法將在測試運行前運行
@AfterTest 被注釋的方法將在測試運行后運行
@BeforeSuite 被注釋的方法將在所有測試運行前運行
@AfterSuite 被注釋的方法將在所有測試運行后運行

 

另外還有一些屬性,

alwaysRun:對於每個bufore方法(beforeSuite, beforeTest, beforeTestClass 和 beforeTestMethod, 但是不包括 beforeGroups):
                   如果設置為true,被配置的方法將總是運行而不管它屬於哪個組。
                   對於after方法(afterSuite, afterClass, ...): 如果設置為true,被配置的方法甚至在一個或多個先調用的方法失敗或被忽略時也將運行。

dependsOnGroups:這個方法依賴的組列表

dependsOnMethod:這個方法依賴的方法列表

enabled:這個類的方法是否激活

groups:這個類或方法所屬的分組列表

inheritGroups:如果設置為true,這個方法被屬於在類級別被@Test annotation指定的組例如:

  @Test(enabled = false)    //表示該測試用例不被執行
     public Object runTest() {
        xxxxxx 
 }

 

3.testNG.xml配置詳解:

 testng.xml的基本格式可以在官網上查看,基本格式如下:

以下詳細XML結構規則

suite
--tests
----parameters
----groups
------definitions
------runs

----classes
--parameters

比較詳細的結構如下:

 
復制代碼
  <test name="xxxx">
    <!-- 參數定義的方法 -->
    <parameter name="first-name" value="Cedric"/>
  
    <!-- groups的用法,前提是需要存在classes的組,否則所有方法不被運行 -->
    <groups>
    <!-- 定義組中組的方法 -->
      <define name="groups_name">
        <include name="group1"/>
       <include name="group2"/>
     </define>
 
     <run>
       <!-- 此處用組名來區別 -->
       <inclue name="groups_name" />
       <exclue name="groups_name" />
       </run>
   </groups>
 
   <!-- classes的用法,classes中包含類名,類名底下可以包含方法名或排除方法名 -->
   <classes>
     <class name="class1">
       <methods>
         <!-- 此處用方法名來區別 -->
         <inclue name="method_name" />
         <exclue name="method_name" />
       </methods>
     </class>
   </classes>
 </test>
復制代碼

具體的元素說明:

 

<suite>   testng.xml文檔中最上層的元素
說明:一個xml文件只能有一個<suites>,,是一個xml文件的根級
<suite>由<test>和<parameters>組成
參數說明:
 
參數 說明 使用方法 參數值
name 必選項,<suite>的名字,將出現在reports里 name="XXX" suite名字
junit 是否執行Junit模式(識別setup()等) junit="true" true和false,默認false
verbose 控制台輸出的詳細內容等級,0-10級(0無,10最詳細) verbose="5" 0到10
parallel 是否在不同的線程並行進行測試,要與thread-count配套使用 parallel="mehods" 詳見表格下內容,默認false
parent-module 和Guice框架有關,只運行一次,創建一個parent injector給所有guice injectors  
guice-stage 和Guice框架有關 guice-stage="DEVELOPMENT" DEVELOPMENT,PRODUCTION,TOOL,默認"DEVELOPMENT"
configfailurepolicy 測試失敗后是再次執行還是跳過,值skip和continue configfailurepolicy="skip" skip、continue,默認skip
thread-count 與parallel配套使用,線程池的大小,決定並行線程數量 thread-count="10" 整數,默認5
annotations 獲取注解,值為javadoc時,使用JavaDoc的注釋;否則用JDK5注釋 annotations="javadoc" javadoc
time-out 設置parallel時,終止執行單元之前的等待時間(毫秒) time-out="10000" 整數,單位毫秒
skipfailedinvocationcounts 是否跳過失敗的調用 skipfailedinvocationcounts="true" true和false,默認false
data-provider-thread-count 並發時data-provider的線程池數量 data-provider-thread-count="5" 整數
object-factory 一個實現IObjectFactory接口的類,實例化測試對象 object-factory="classname" 類名
allow-return-values 是否允許返回函數值 all-return-values="true" true和false
preserve-order 是否按照排序執行 preserve-order="true" true和false,默認true
group-by-instances 按照實例分組 group-by-instances="true" true和false,默認false
 

parallel

  該參數的值false,methods,tests,classes,instances。默認false
  parallel必須和thread-count配套使用,否則相當於無效參數,thread-count決定了並行測試時開啟的線程數量
  parallel="mehods"  TestNG將並行執行所有的測試方法在不同的線程里
  parallel="tests"  TestNG將並行執行在同一個<test>下的所有方法在不同線程里
  parallel="classes"  TestNG將並行執行在相同<class>下的方法在不同線程里
  parallel="instances"  TestNG將並行執行相同實例下的所有方法在不同的縣城里
 
parent-module和guice-stage和Guice框架有關,testNG 6對Guice框架提供了支持,我沒用過這個框架,所以這兩個參數沒看懂╮(╯▽╰)╭
 
-<suite-file>
說明:引入外部的xml文件(地址由path參數決定,path必填項),將引入的xml與當前的xml文件一起使用
聲明方法:
 <suite-files>
      <suite-file path="/path/suitefile1"></suite-file>
 </suite-files>
 
-<test>
說明:一個<suite>下可以有多個<test>,可以通過<suite>的parallel="tests"來進行並行測試,必須和thread-count配套使用,否則是無效參數
<test>由<parameters>、<groups>、<classes>三部分組成
參數說明:
 
參數 說明 使用方法 參數值
name test的名字,將出現在報告里 name="testname" test的名字
junit 是否按照Junit模式運行 junit="true" true和false,默認false
verbose 控制台輸出的詳細內容等級,0-10級(0無,10最詳細),不在報告顯示 verbose="5" 0到10
parallel 是否在不同的線程並行進行測試,要與thread-count配套使用 parallel="mehods" 與suite的parallel一致,默認false
thread-count 與parallel配套使用,線程池的大小,決定並行線程數量 thread-count="10" 整數,默認5
annotations 獲取注解,值為javadoc時,使用JavaDoc的注釋;否則用JDK5注釋 annotations="javadoc" javadoc
time-out 設置parallel時,終止執行單元之前的等待時間(毫秒) time-out="10000" 整數,單位毫秒
enabled 標記是否執行這個test enabled="true" true和false,默認true
skipfailedinvocationcounts 是否跳過失敗的調用 skipfailedinvocationcounts="true" true和false,默認false
preserve-order 是否按照排序執行,如果是true,將按照xml文件中的順序去執行 preserve-order="true" true和false,默認true
allow-return-values 是否允許返回函數值 all-return-values="true" true和false,默認false
 
--<parameter>
說明:提供測試數據,有name和value兩個參數
聲明方法:<parameter name = "parameter_name" value = "parameter_value "/>
testng.xml文件中的<parameter>可以聲明在<suite>或者<test>級別,在<test>下的<parameter>會覆蓋在<suite>下聲明的同名變量
 
--<method-selectors>
說明:方法選擇器定義了哪些類的方法需要去執行,類必須繼承自org.testng.IMethodSelector
聲明方法:
 <method-selectors>
      <method-selector>
           <selector-class name="classname" priority="1"></selector-class>
           <script language="java"></script>    (language還可以用beanshell等)
      </method-selector>
 </method-selectors>

 

備注:<method-selectors>這個我沒用過,所以了解,如果有錯的歡迎指出來~
 
--<groups>
說明:要運行的組,可以自定義一個組,可以包括要執行的,還排除要執行的方法。必須和<classes>配套使用,從下面的類中找到對應名字的方法
<groups>由<difine>和<run>、<dependencies>三部分組成。<diffine>可以將group組成一個新組,包括要執行和不執行的大組;<run>要執行的方法;<dependencies>指定了某group需要依賴的group(比如下面的例子,group1需要依賴group2和group3先執行)。
聲明方法:
 
復制代碼
 
  <groups>
       <define name ="all">
            <include name ="testgroup1"/>
            <exclude name ="testgroup2'/>
       </define>
       <run>
            <include name ="all"/>
            <include name ="testmethod1"/>
            <exclude name="testmethod2"/>
      </run>
      <dependencies>
           <group name ="group1" depends-on="goup2 group3"/>
      </dependencies>
 </groups>
 
復制代碼

 

--<classes>
說明:方法選擇器,要執行的方法寫在這里,參數有name和priority。
注釋:
1.<classes>下必須寫要執行的<class>,否則不會執行任何內容,如果填寫了class沒有寫methods,會按照填寫的class的下的注釋@Test去執行所有的方法
2.<classes>下的<methods>如果填寫了<include>,那只會執行所填寫的方法,沒有填寫的方法不會去執行
 
聲明方法:
復制代碼
 
 <classes>
      <class name="要執行的class名">
           <methods>
                <include name ="要執行的方法名"></include>
           </methods>
      </class> 
 </classes>
 
復制代碼
 
--<packages>
說明:<packages>指定包名代替類名。查找包下的所有包含testNG annotation的類進行測試
聲明方法:
復制代碼
 
 <packages>
      <package name="packagename"/>
      <package name="packagename">
           <include name="methodname"/>
           <exclude name="methodname"/>
      </package>
 </packages>
 
復制代碼
 
<listener>
說明:指定listeners,這個class必須繼承自org.testng.ITestNGListener。在java中使用@Listeners({com.example.MyListener.class,com.example.MyMethodInterceptor.class})的注釋也可以有同樣效果
聲明方法:
 <listeners>
      <listener class-name="com.example.MyListener"/>
      <listener class-name="com.example.MyMehodIntercepor"/>
 </listeners>

 

(3)一個簡單的testng.xml文檔

 

復制代碼
 
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
  
  <suite name="Suite" parallel="classes" thread-count="3">
      <test verbose="2" preserve-order="true" name="TestDebug">
  
          <classes>
              <class name="com.hera.util.MathTest" />
  
         </classes>
     </test> <!-- Test -->
 </suite> <!-- Suite -->
 
復制代碼

說明:  suite定義一個測試套件,可以設置是否使用多線程,可包含多個測試用例或者測試group

             parallel = classes  每個測試用例class級別多線程

             thread-count =3  線程數為5,可同時執行3個case
             preserve-order = true   classes和methods按照配置中的順序執行,false為亂序執行。(If you want the classes and methods listed in this file to be run in an unpredictible order, set the preserve-order attribute to false

             parameter 標簽傳遞參數

4.TestNG參數化測試

testng提供測試數據的兩個注釋:@DataProvide和@Parameter
 
一、通過testng.xml中設置參數
(實際上testng.xml只是一個名字,可以起任何一個名字,只要是.xml文件,然后文件格式按照testng的文檔格式DTD來就可以了)
testng.xml中的內容:
復制代碼
<?xml version="1.0" encoding="UTF-8" ?>
<suite name = "testngframetest">
    <parameter name="para" value="test_para1"/>
    <test name="測試參數賦值">
        <classes>
            <parameters>
                <parameter name="para1" value="test_para1"/>
                <parameter name="para2" value="test_para2"/>
            </parameters>
            <class name = "paramer">
                <methods>
                    <include name ="showparamer"></include>
                </methods>
            </class> </classes> </test> </suite>
復制代碼

 

 
.java文件的測試用例中通過parameters獲得數據
使用方法1:
@Test(parameters="para1")
public void testcase(String para1){
     具體的測試用例,參數中的para1自動獲取@Test中聲明的變量,讀取的是testng的xml文件中聲明的參數para1的value值
}
如果有多個參數,可以使用這種方式:@Test(parameters={"para1","para2"})
 
使用方法2:
@Parameter({"para1","para2"})
@Test
     具體的測試用例(參數@Parameter寫在了@Test前面)
 
具體代碼如下:
復制代碼
import org.testng.annotations.Test; public class paramer { @Test(parameters ={"para1","para2"}) public void showparamer(String para11,String para22){ System.out.println("testng獲得的參數para1如下:"+para11); System.out.println("testng獲得的參數para2如下:"+para22);; } }
復制代碼

 

 
說明:
1.測試用例中設置的參數名隨意,但是數量一定要和@Parameter中提供的數量一致,按照testng.xml中定義的順序來取值的
2.<parameter>可以聲明在<suite>或者<test>級別,在<test>下的<parameter>會覆蓋在<suite>下聲明的同名變量
3..java的測試用例中,可以通過@Optional("參數")來聲明變量,如果沒有在testng.xml中沒有找到參數,會用@Optional("")中聲明的參數
例如下面的代碼,testng中沒有聲明para1和para2時,執行用例時會直接復制test1和test2
復制代碼
import org.testng.annotations.Optional; import org.testng.annotations.Test; public class paramer { @Test(parameters ={"para1","para2"}) public void showparamer(@Optional("test1") String para11, @Optional("test2") String para22){ System.out.println("testng獲得的參數para1如下:"+para11); System.out.println("testng獲得的參數para2如下:"+para22);; } }
復制代碼

 

 
二、通過注釋@Dataprovide獲得參數
(testng.xml只能傳遞簡單的參數,如果是循環遍歷的使用不同的參數則不可以實現。這時可以使用@Dataprovide來提供數據)
 
提供數據的方法:
@DataProvider(name = "dataprovider1")
public Object[][] dataprovide(){
    return new Object[][]{{1,2,3},{3,2,1}};
}
說明:
1.@DataProvide只能返回Object數組結果
2.Object的行中的每一列標識一個參數(比如上面的例子是3個參數),行數決定了調用的方法要執行的次數(比如上面的例子是執行2次)
 
調用數據方法:
@Test(dataprovide="XXX")
說明:
1.XXX為@DataProvide聲明的一個名字,返回的是一個Object數組
2.方法的執行次數為賦值參數的遍數。比如提供數組為1行,則只執行一次;如果是數組為3行,則執行3次。
 
其他擴展:
1.@DataProvide寫在單獨的class里,增強復用性。
這時調用該數據的方法為:@Test(dataprovide="XXX",dataClass=YYY.class)
說明:讀取YYY.class下的@DataProvide為XXX的Object數組數據
2.@DataProvide下定義的數組,通過其他文件讀取,比如讀取excel,返回一個Object數組
3.@DataProvide可以通過parallel實現並行執行線程,默認10個,可以在testng.xml中進行修改(<suite name="XXX" data-provider-thread-count="YYY">)
復制代碼
@DataProvider(name = "dataprovider1",parallel = true) public Object[][] dataprovide(){ return new Object[][]{{1,2},{2,1}}; } @Test(dataProvider = "dataprovide") public void showDataprovide(int a,int b,Method c){ System.out.println("DataProvider獲得的參數para1如下:"+a); System.out.println("DataProvider獲得的參數para2如下:"+b);; System.out.println("DataProvider獲得的參數para2如下:"+c.getName()); }
復制代碼

 

4.@DataProvide和@Parameters不能同時聲明,但是可以通過其他方法實現同時使用。
String testId = context.getCurrentXmlTest().getParameter("test_id"); 
 
 

5.Testng的並發詳解

在實際的自動化測試項目中,其實測試人員會遇到很多需要並發執行的情況,testng可以很輕松的解決此類問題,特補充此條
必須要指出的是,通過多線程執行用例時雖然可以大大提升用例的執行效率,但是我們在設計用例時也要考慮到這些用例是否適合並發執行,以及要注意多線程方式的通病:線程安全與共享變量的問題。
建議是在測試代碼中,盡可能地避免使用共享變量。如果真的用到了,要慎用synchronized關鍵字來對共享變量進行加鎖同步。否則,難免你的用例執行時可能會出現不穩定的情景

 

5.1 不同級別的並發

通常,在TestNG的執行中,測試的級別由上至下可以分為suite -> test -> class -> method,箭頭的左邊元素跟右邊元素的關系是一對多的包含關系。

這里的test指的是testng.xml中的test tag,而不是測試類里的一個@Test。測試類里的一個@Test實際上對應這里的method。所以我們在使用@BeforeSuite@BeforeTest@BeforeClass@BeforeMethod這些標簽的時候,它們的實際執行順序也是按照這個級別來的。

  suite

一般情況下,一個testng.xml只包含一個suite。如果想起多個線程執行不同的suite,官方給出的方法是:通過命令行的方式來指定線程池的容量。

java org.testng.TestNG -suitethreadpoolsize 3 testng1.xml testng2.xml testng3.xml

即可通過三個線程來分別執行testng1.xml、testng2.xml、testng3.xml。

 

  test, class, method

test,class,method級別的並發,可以通過在testng.xml中的suite tag下設置,如:

<suite name="Testng Parallel Test" parallel="tests" thread-count="5">
<suite name="Testng Parallel Test" parallel="classes" thread-count="5">
<suite name="Testng Parallel Test" parallel="methods" thread-count="5">

它們的區別如下:

  • tests級別:不同test tag下的用例可以在不同的線程執行,相同test tag下的用例只能在同一個線程中執行。
  • classs級別:不同class tag下的用例可以在不同的線程執行,相同class tag下的用例只能在同一個線程中執行。
  • methods級別:所有用例都可以在不同的線程去執行。

 

5.2 不同dataprovider的並發

在使用TestNG做自動化測試時,基本上大家都會使用dataprovider來管理一個用例的不同測試數據。而上述在testng.xml中修改suite標簽的方法,並不適用於dataprovider多組測試數據之間的並發。

執行時會發現,一個dp中的多組數據依然是順序執行。解決方式是:在@DataProvider中添加parallel=true。

復制代碼
import org.testng.annotations.DataProvider; import testdata.ScenarioTestData; public class ScenarioDataProvider { @DataProvider(name = "hadoopTest", parallel=true) public static Object [][] hadoopTest(){ return new Object[][]{ ScenarioTestData.hadoopMain, ScenarioTestData.hadoopRun, ScenarioTestData.hadoopDeliverProps }; } @DataProvider(name = "sparkTest", parallel=true) public static Object [][] sparkTest(){ return new Object[][]{ ScenarioTestData.spark_java_version_default, ScenarioTestData.spark_java_version_162, ScenarioTestData.spark_java_version_200, ScenarioTestData.spark_python }; } @DataProvider(name = "sqoopTest", parallel=true) public static Object [][] sqoopTest(){ return new Object[][]{ ScenarioTestData.sqoop_mysql2hive, ScenarioTestData.sqoop_mysql2hdfs }; } }

/***
  默認情況下,dp並行執行的線程池容量為10,如果要更改並發的數量,也可以在suite tag下指定參數data-provider-thread-count:
***/
<suite name="Testng Parallel Test" parallel="methods" thread-count="5" data-provider-thread-count="20" >
復制代碼

  

5.3 同一個方法的並發

有些時候,我們需要對一個測試用例,比如一個http接口,執行並發測試,即一個接口的反復調用。TestNG中也提供了優雅的支持方式,在@Test標簽中指定threadPoolSizeinvocationCount

@Test(enabled=true, dataProvider="testdp", threadPoolSize=5, invocationCount=10)
  • threadPoolSize表明用於調用該方法的線程池容量,該例就是同時起5個線程並行執行該方法;
  • invocationCount表示該方法總計需要被執行的次數。該例子中5個線程同時執行,當總計執行次數達到10次時,停止。

注意,該線程池與dp的並發線程池是兩個獨立的線程池。這里的線程池是用於起多個method,而每個method的測試數據由dp提供,

如果這邊dp里有3組數據,那么實際上10次執行,每次都會調3次接口,這個接口被調用的總次數是10*3=30次。

threadPoolSize指定的5個線程中,每個線程單獨去調method時,用到的dp如果也是支持並發執行的話,會創建一個新的線程池(dpThreadPool)來並發執行測試數據。

復制代碼
import java.text.SimpleDateFormat; import java.util.Date; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class TestClass1 { private SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設置日期格式  @BeforeClass public void beforeClass(){ System.out.println("Start Time: " + df.format(new Date())); } @Test(enabled=true, dataProvider="testdp", threadPoolSize=2, invocationCount=5) public void test(String dpNumber) throws InterruptedException{ System.out.println("Current Thread Id: " + Thread.currentThread().getId() + ". Dataprovider number: "+ dpNumber); Thread.sleep(5000); } @DataProvider(name = "testdp", parallel = true) public static Object[][]testdp(){ return new Object[][]{ {"1"}, {"2"} }; } @AfterClass public void afterClass(){ System.out.println("End Time: " + df.format(new Date())); } }
復制代碼

 原文:https://www.cnblogs.com/Ronaldo-HD/p/9235210.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM