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中直接運行的時候,須要說明的是:能夠運行一個測試類,也能夠單獨運行一個測試的方法。html

在IDEA裏執行,只須要右鍵,點擊 Run xxx 便可。 若是是在某一個方法的代碼塊裏右鍵,出現的是 Run methodName ,即只運行當前的方法; 若是是在類的代碼塊裏右鍵,出現的是 Run className ,即運行當前類中的全部Test方法; 也能夠建立testng.xml,右鍵出現的 Run path/testng.xml ,即運行該配置文件中須要運行的方法。java

 

2.TestNG常見的註解:

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

 

 

 

 

 

 

 

 

 

另外還有一些屬性,shell

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

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

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

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

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

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

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

 

3.testNG.xml配置詳解:

 testng.xml的基本格式能夠在官網上查看,基本格式以下:函數

如下詳細XML結構規則

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

----classes
--parameters

比較詳細的結構以下:

 
複製代碼
複製代碼
 1 <test name="xxxx">
 2   <!-- 參數定義的方法 -->
 3   <parameter name="first-name" value="Cedric"/>
 4 
 5   <!-- groups的用法,前提是須要存在classes的組,不然全部方法不被運行 -->
 6   <groups>
 7   <!-- 定義組中組的方法 -->
 8     <define name="groups_name">
 9       <include name="group1"/>
10       <include name="group2"/>
11     </define>
12 
13     <run>
14       <!-- 此處用組名來區別 -->
15       <inclue name="groups_name" />
16       <exclue name="groups_name" />
17       </run>
18   </groups>
19 
20   <!-- classes的用法,classes中包含類名,類名底下能夠包含方法名或排除方法名 -->
21   <classes>
22     <class name="class1">
23       <methods>
24         <!-- 此處用方法名來區別 -->
25         <inclue name="method_name" />
26         <exclue name="method_name" />
27       </methods>
28     </class>
29   </classes>
30 </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文件一塊兒使用
聲明方法:
1 <suite-files>
2      <suite-file path="/path/suitefile1"></suite-file>
3 </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
聲明方法:
1 <method-selectors>
2      <method-selector>
3           <selector-class name="classname" priority="1"></selector-class>
4           <script language="java"></script>    (language還能夠用beanshell等)
5      </method-selector>
6 </method-selectors>

 

備註:<method-selectors>這個我沒用過,因此瞭解,若是有錯的歡迎指出來~
 
--<groups>
說明:要運行的組,能夠自定義一個組,能夠包括要執行的,還排除要執行的方法。必須和<classes>配套使用,從下面的類中找到對應名字的方法
<groups>由<difine>和<run>、<dependencies>三部分組成。<diffine>能夠將group組成一個新組,包括要執行和不執行的大組;<run>要執行的方法;<dependencies>指定了某group須要依賴的group(好比下面的例子,group1須要依賴group2和group3先執行)。
聲明方法:
 
複製代碼
複製代碼
 1 <groups>
 2      <define name ="all">
 3           <include name ="testgroup1"/>
 4           <exclude name ="testgroup2'/>
 5      </define>
 6      <run>
 7           <include name ="all"/>
 8           <include name ="testmethod1"/>
 9           <exclude name="testmethod2"/>
10      </run>
11      <dependencies>
12           <group name ="group1" depends-on="goup2 group3"/>
13      </dependencies>
14 </groups>
複製代碼
複製代碼

 

--<classes>
說明:方法選擇器,要執行的方法寫在這裏,參數有name和priority。
註釋:
1.<classes>下必須寫要執行的<class>,不然不會執行任何內容,若是填寫了class沒有寫methods,會按照填寫的class的下的註釋@Test去執行全部的方法
2.<classes>下的<methods>若是填寫了<include>,那隻會執行所填寫的方法,沒有填寫的方法不會去執行
 
聲明方法:
複製代碼
複製代碼
1 <classes>
2      <class name="要執行的class名">
3           <methods>
4                <include name ="要執行的方法名"></include>
5           </methods>
6      </class> 
7 </classes>
複製代碼
複製代碼
 
--<packages>
說明:<packages>指定包名代替類名。查找包下的全部包含testNG annotation的類進行測試
聲明方法:
複製代碼
複製代碼
1 <packages>
2      <package name="packagename"/>
3      <package name="packagename">
4           <include name="methodname"/>
5           <exclude name="methodname"/>
6      </package>
7 </packages>
複製代碼
複製代碼
 
<listener>
說明:指定listeners,這個class必須繼承自org.testng.ITestNGListener。在java中使用@Listeners({com.example.MyListener.class,com.example.MyMethodInterceptor.class})的註釋也能夠有一樣效果
聲明方法:
1 <listeners>
2      <listener class-name="com.example.MyListener"/>
3      <listener class-name="com.example.MyMehodIntercepor"/>
4 </listeners>

 

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

 

複製代碼
複製代碼
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
 3 
 4 <suite name="Suite" parallel="classes" thread-count="3">
 5     <test verbose="2" preserve-order="true" name="TestDebug">
 6 
 7         <classes>
 8             <class name="com.hera.util.MathTest" />
 9 
10         </classes>
11     </test> <!-- Test -->
12 </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
 
1、經過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);;
    }
}
 
2、經過註釋@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"); 
更詳細的內容能夠參考testng教程: https://www.yiibai.com/testng/ 
相關文章
相關標籤/搜索