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指定的組例如:
例如:
1 @Test(enabled = false) //表示該測試用例不被執行
2 public Object runTest() {
3 xxxxxx
4 }
3.testNG.xml配置詳解:
testng.xml的基本格式可以在官網上檢視,基本格式如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL5ADO0EzM4gDOtkTM1ITN0UDMxUDM3AzNxAjMtQTNxgTN58CX3AzNxAjMvwFN1EDO1kzLcd2bsJ2Lc12bj5ycn9Gbi52YuUTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
以下詳細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 一、通過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}};
} 說明: [email protected]隻能傳回Object數組結果 2.Object的行中的每一列辨別一個參數(比如上面的例子是3個參數),行數決定了調用的方法要執行的次數(比如上面的例子是執行2次) 調用資料方法: @Test(dataprovide="XXX") 說明: 1.XXX為@DataProvide聲明的一個名字,傳回的是一個Object數組 2.方法的執行次數為指派參數的遍數。比如提供數組為1行,則隻執行一次;如果是數組為3行,則執行3次。 其他擴充: [email protected]寫在單獨的class裡,增強複用性。 這時調用該資料的方法為:@Test(dataprovide="XXX",dataClass=YYY.class) 說明:讀取YYY.class下的@DataProvide為XXX的Object數組資料 [email protected]下定義的數組,通過其他檔案讀取,比如讀取excel,傳回一個Object數組 [email protected]可以通過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());
} [email protected]和@Parameters不能同時聲明,但是可以通過其他方法實作同時使用。 String testId = context.getCurrentXmlTest().getParameter("test_id"); 可以參考這篇部落格: http://blog.csdn.net/zeroneqin/article/details/49615535 更詳細的内容可以參考testng教程: https://www.yiibai.com/testng/ 5. testng的控制台輸出配置 -------TODO
轉載于:https://www.cnblogs.com/TestMa/p/9989663.html