一、並行運行於超時
可以通過在suite標籤中使用 parallel 屬性來讓測試方法運行在不同的線程中。這個屬性可以帶有如下這樣的值:
<suite name="My suite" parallel="methods" thread-count="5">
<suite name="My suite" parallel="tests" thread-count="5">
<suite name="My suite" parallel="classes" thread-count="5">
1.parallel="methods": TestNG 會在不同的線程中運行測試方法,除非那些互相依賴的方法。那些相互依賴的方法會運行在同一個線程中,並且遵照其執行順序。
2.parallel="tests": TestNG 會在相同的線程中運行相同的<test>標記下的所有方法,但是每個<test>標籤中的所有方法會運行在不同的線程中。這樣就允許你把所有非線程安全的類分組到同一個<test>標籤下,並且使其可以利用TestNG多線程的特性的同時,讓這些類運行在相同的線程中。
3.parallel="classes": TestNG 會在相同線程中相同類中的運行所有的方法,但是每個類都會用不同的線程運行。
此外,屬性 thread-count 允許你爲當前的執行指定可以運行的線程數量。
注意:@Test 中的屬性 timeOut 可以工作在並行和非並行兩種模式下。
你也可以指定 @Test 方法在不同的線程中被調用。你可以使用屬性 threadPoolSize 來實現:
@Test(threadPoolSize = 3, invocationCount =10, timeOut = 10000)
public void testServer() {
上例中,方法 testServer 會在3個線程中調用10次。此外,10秒鐘的超時設定也保證了這三個線程中的任何一個都永遠不會阻塞當前被調用的線程。
二、再次運行失敗的測試
每次測試suite出現失敗的測試,TestNG 就會在輸出目錄中創建一個叫做 testng-failed.xml 的文件。這個XML文件包含了重新運行那些失敗測試的必要信息,使得你可以無需運行整個測試就可以快速重新運行失敗的測試。所以,一個典型的會話看起來像:
java -classpath testng.jar;%CLASSPATH%org.testng.TestNG -d test-outputs testng.xml
java -classpath testng.jar;%CLASSPATH%org.testng.TestNG -d test-outputs test-outputs/testng-failed.xml
要注意的是,testng-failed.xml 已經包含了所有失敗方法運行時需要的依賴,所以完全可以保證上次失敗的方法不會出現任何 SKIP。
三、JUnit測試
TestNG 能夠運行 JUnit 測試。所有要做的工作就是在testng.classNames 屬性中設定要運行的JUnit測試類,並且把 testng.junit 屬性設置爲true:
<test name="Test1" junit="true">
<classes>
<!-- ... -->
TestNG 在這種情況下所表現的行爲與 JUnit 相似:
1.所有類中要運行的測試方法由 test* 開頭
2.如果類中有 setUp() 方法,則其會在每個測試方法執行前被調用
3.如果類中有 tearDown() 方法,則其會在每個測試方法之後被調用
4.如果測試類包含 suite() 方法,則所有的被這個方法返回的測試類都會被調用
四、方法攔截器
一旦TestNG 計算好了測試方法會以怎樣的順序調用,那麼這些方法就會分爲兩組:
1.按照順序運行的方法。這裏所有的方法都有相關的依賴,並且所有這些方法按照特定順序運行。
2.不定順序運行的方法。這裏的方法不屬於第一個類別。方法的運行順序是隨機的,下一個說不準是什麼(儘管如此,默認情況下TestNG會嘗試通過類來組織方法)。
爲了能夠讓你更好的控制第二種類別,TestNG定義如下接口:
public interface IMethodInterceptor {
List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context);
}
方法中叫做methods的那個列表參數包含了所有以不定序運行的方法。你的 intercept 方法也要返回一個 IMethodInstance列表,它可能是下面情況之一:
1.內容與參數中接收的一致,但是順序不同
2.一組 IMethodInstance 對象
3.更大的一組 IMethodInstance對象
一旦你定義了攔截器,就把它傳遞個TestNG,用下面的方式:
java -classpath"testng-jdk15.jar:test/build" org.testng.TestNG -listenertest.methodinterceptors.NullMethodInterceptor /
-testclass test.methodinterceptors.FooTest
關於ant中對應的語法,參見 listeners 屬性ant文檔中的說明。
http://testng.org/doc/ant.html
例如,下面是個方法攔截器會重新給方法排序,一遍“fast”組中的方法總是先執行:
public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {
List<IMethodInstance> result = new ArrayList<IMethodInstance>();
for (IMethodInstance m : methods) {
Test test = m.getMethod().getMethod().getAnnotation(Test.class);
Set<String> groups = new HashSet<String>();
for (String group : test.groups()) {
groups.add(group);
}
if (groups.contains("fast")) {
result.add(0, m);
}
else {
result.add(m);
}
}
return result;
}
本文轉載自http://blog.sina.com.cn/bestfeiyong