IDEA 單元測試testng入門及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指定的組例如:

例如:
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提供了2種傳遞參數的方式。

第一種: testng.xml 方式使代碼和測試數據分離,方便維護

第二種:@DataProvider能夠提供比較復雜的參數。 (也叫data-driven testing)

          方法一:通過testng.xml傳遞參數給測試代碼,在testng.xml文件中定義的簡單參數,然后在源文件中引用這些參數。

下面是支持的類型:
String
int/Integer
boolean/Boolean
byte/Byte
char/Character
double/Double
float/Float
long/Long
short/Short

例子:

          

            

           

 

方法二:通過DataProvider傳遞參數,當你需要通過復雜的參數或參數需要創建從Java(復雜的對象,對象讀取屬性文件或數據庫等..),在這種情況下,可以將參數傳遞使用數據提供者。數據提供者@DataProvider的批注的方法。

   (可以通過excel來管理case數據)

 


免責聲明!

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



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