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
註解 | 描述 |
@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 }
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>
具體的元素說明:
參數 | 說明 | 使用方法 | 參數值 |
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 |
1 <suite-files> 2 <suite-file path="/path/suitefile1"></suite-file> 3 </suite-files>
參數 | 說明 | 使用方法 | 參數值 |
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 |
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>
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>
1 <classes> 2 <class name="要執行的class名"> 3 <methods> 4 <include name ="要執行的方法名"></include> 5 </methods> 6 </class> 7 </classes>
1 <packages> 2 <package name="packagename"/> 3 <package name="packagename"> 4 <include name="methodname"/> 5 <exclude name="methodname"/> 6 </package> 7 </packages>
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 標籤傳遞參數