前面講的大多都是以測試腳本為基礎來運行的,少部分是以xml運行,這里以xml來講解下:
```
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="SuiteName" verbose="1" >?
```
如下分別講解各個標簽:
1、suite標簽
testNG.xml文件的最外層標簽即suite,即測試套件,其下可以有多個<test>和<groups>,其有幾個可以添加的屬性在第十節的分suite測試中有做說明,這里做下詳細說明:
(1)、name屬性
此屬性屬于必須要有的,值可以自行設定,此名字會在testNG的報告中看到;
(2)、verbose屬性
此屬性為指定testNG報告的詳細程度,從0開始到10,其中10為最詳細,默認生成的xml此屬性值為1;
(3)、parallel屬性
此屬性是指代運行方式,默認為none,即串行運行方式;并行執行方法包括如下幾種,下面做分別說明:
methods:方法層級,若為此值,則該suite下所有的測試方法都將進行多線程,即測試用例級別的多線程。如果用例之間有依賴,則執行順序會按照設定的依賴來運行;
```
<suite name="My suite" parallel="methods" thread-count="5">
```
tests:TestNG將在同一線程中運行相同的<Test>標簽中的所有方法,每個<test>標簽都將處于一個單獨的線程中,這允許您將不是線程安全的所有類分組在同一個<test>中,并保證它們都將在同一個線程中運行,同時利用TestNG使用盡可能多的線程運行測試。
```
<suite name="My suite" parallel="tests" thread-count="5">
```
classes:類級別并發,即TestNG會將該suite下每個class都將在單獨的線程中運行,同一個class下的所有用例都將在同一個線程中運行;
```
<suite name="My suite" parallel="classes" thread-count="5">
```
instances:實例級別,即TestNG將在同一線程中運行同一實例中的所有方法,兩個不同實例上的兩個方法將在不同的線程中運行。
```
<suite name="My suite" parallel="instances" thread-count="5">
```
(4)、thread-count屬性
此屬性用于指定線程數,按照需要輸入,需要parallel參數非none時才可以添加;
(5)、annotations屬性
此項為注解的級別,為methods級別和class級別,一般不用設置;
(6)、time-out屬性
此屬性用于指定超時時間,該suite下所有的用例的超時時間;
(7)、group-by-instances屬性
此項用于那些有依賴的方法,且被依賴的對象有多個重載對象,因為如果是依賴方法,且該方法有多個重載方法,則默認是會將所有重載方法都跑完再運行被依賴方法,但有時候我們不想這樣,則將此項設置為true即可;
(8)、preserve-order屬性
值可輸入true或者false,如果為true,則用例執行會按照在xml中的順序執行,否則會亂序執行,不添加此屬性的話默認是按順序執行的;
2、test標簽
此標簽無特別意義,其下可以包括多個標簽,如groups、classes等,如下介紹下幾種書寫方式:
(1)選擇一個包中的全部測試腳本(包含子包)
```
<test name = "allTestsInAPackage" >
? ?<packages>
? ? ? <package name = "whole.path.to.package.* />
? ?</packages>
</test>
```
(2)選擇一個類中的全部測試腳本
```
<test name = "allTestsInAPackage" >
? ?<packages>
? ? ? <package name = "whole.path.to.package.* />
? ?</packages>
</test>
```
(3)選擇一個類中的部分測試腳本
```
<test name = "aFewTestsFromAClass" >
? ?<classes>
? <class name="whole.path.to.package.className >
? ? ? <methods>
? ? ? ? ?<include name = "firstMethod" />
? ? ? ? ?<include name = "secondMethod" />
? ? ? ? ?<include name = "thirdMethod" />
? ? ? </methods>
? </class>
? ?</classes>
</test>
```
(4)選擇一個包中的某些組
```
<test name = "includedGroupsInAPackage" >
? ?<groups>
? ? ? <run>
? ? ? ? ?<include name = "includedGroup" />
? ? ? </run>
? ?</groups>
? ?<packages>
? ? ? <package name = "whole.path.to.package.* />
? ?</packages>
</test>
```
(5)排除一個包中的某些組
```
<test name = "excludedGroupsInAPackage" >
? ?<groups>
? ? ? <run>
? ? ? ? ?<exclude name = "excludedGroup" />
? ? ? </run>
? ?</groups>
? ?<packages>
? ? ? <package name = "whole.path.to.package.* />
? ?</packages>
</test>
```
其可以附帶的屬性有如下幾種,下面對各個屬性做單獨說明:
(1)、name屬性
此屬性屬于必須要有的,值可以自行設定,此名字會在testNG的報告中看到;
(2)、verbose屬性
此屬性為指定testNG報告的詳細程度,從0開始到10,其中10為最詳細,默認生成的xml此屬性值為1
(3)、threadPoolSize屬性
該屬性指定此test的線程池大小,為數字;
```
<test name = "excludedGroupsInAPackage" >
? ?<groups>
? ? ? <run>
? ? ? ? ?<exclude name = "excludedGroup" />
? ? ? </run>
? ?</groups>
? ?<packages>
? ? ? <package name = "whole.path.to.package.* />
? ?</packages>
</test>
```
(4)、invocationCount屬性
該屬性指定此test的運行次數,為數字,范例如上面的代碼所示;
(5)、time-out屬性
此屬性用于指定超時時間,該suite下所有的用例的超時時間,范例如上面的代碼所示;
(6)、group-by-instances屬性
此項用于那些有依賴的方法,且被依賴的對象有多個重載對象,因為如果是依賴方法,且該方法有多個重載方法,則默認是會將所有重載方法都跑完再運行被依賴方法,但有時候我們不想這樣,則將此項設置為true即可;
```
<suite name="Factory" group-by-instances="true">
```
(7)、preserve-order屬性
值可輸入true或者false,如果為true,則用例執行會按照在xml中的順序執行,否則會亂序執行,不添加此屬性的話默認是按順序執行的;
3、group標簽
此標簽必然是在<test>標簽下的,用于標識那些組會被用于測試或者被排除在測試之外,其同級必然要包含一個<classes>標簽或者<pakages>標簽,用于指定groups來自于哪些包或者類;
如下即為包含一個group,排除一個group的例子:
```
<groups>
? <run>
? ? ?<include name = "includedGroupName" />
? ? ?<exclude name = "excludedGroupName" />
? </run>
</groups>
```
高級應用:
```
<test name="Regression1">
? <groups>
? ? <define name="functest">
? ? ? <include name="windows"/>
? ? ? <include name="linux"/>
? ? </define>
??
? ? <define name="all">
? ? ? <include name="functest"/>
? ? ? <include name="checkintest"/>
? ? </define>
??
? ? <run>
? ? ? <include name="all"/>
? ? </run>
? </groups>
??
? <classes>
? ? <class name="test.sample.Test1"/>
? </classes>
</test>
```
4、其他
其他的話就是測試腳本的選擇了,有三種方式:
(1)選擇一個包
```
<packages>
? ? <package name = "packageName" />
</packages>
```
(2)選擇一個類
```
<classes>
? ? <class name = "className" />
</classes>
```
(3)選擇一個方法
```
<classes>
? ? <class name = "className" />
? ? ? ?<methods>
? ? ? ? ? <include name = "methodName" />
? ? ? ?</methods>
? ? </class>
</classes>
```
這里也支持正則表達式,例如:
```
<test name="Test1">
? <classes>
? ? <class name="example1.Test1">
? ? ? <methods>
? ? ? ? <include name=".*enabledTestMethod.*"/>
? ? ? ? <exclude name=".*brokenTestMethod.*"/>
? ? ? </methods>
? ? ?</class>
? </classes>
</test>
```