2014-09-11 174 views

回答

12

有可能這樣做。 爲此,您需要的testng.xml註冊org.testng.ITestListener的實現作爲一名聽衆

<listeners> 
    <listener class-name="com.xyar.OnTestFailureClass" /> 
</listeners 

OnTestFailureClass必須實現org.testng.ITestListener

實現onTestFailure如下:

public void onTestFailure(ITestResult result) { 

     XmlSuite suite = new XmlSuite(); 
     suite.setName("rerunFailedTestClasses"); 
     XmlTest test = new XmlTest(suite); 
     test.setName(result.getTestName()); 
     List<XmlClass> classes = new ArrayList<XmlClass>(); 
     classes.add(result.getTestClass().getXmlClass()); 
     test.setXmlClasses(classes) ; 
     List<XmlSuite> suites = new ArrayList<XmlSuite>(); 
     suites.add(suite); 
     TestNG tng = new TestNG(); 
     tng.setXmlSuites(suites); 
     tng.run(); 

    } 

注意
你必須有一個很好的理由來重新運行測試。當你確定第二次迭代會成功時,必須重新開始測試。 如果情況並非如此,那麼您將進入無限循環,其中失敗的測試將繼續執行並失敗。另外,如果你想只運行一個測試用例n次,而不考慮測試結果,那麼你將不得不在onTestFailure方法中建立一個計數器的邏輯。

----------------------------- UPDATE --------------- ---------------------

發現了一個更優雅的解決方案 實現IRetryAnalyzer界面。 TestNG專門提供此接口用於重試失敗的測試。它提供了重試必須完成的次數。

import org.testng.IRetryAnalyzer; 
import org.testng.ITestResult; 

public class RetryAnalyzerImpl implements IRetryAnalyzer{ 
    private int retryCount = 0; 
    private int maxRetryCount = 3; 
    public boolean retry(ITestResult result) { 
     if(retryCount < maxRetryCount) 
      { 
       retryCount++; 
       return true; 
      } 
     return false; 
    } 
} 

,你需要使用以下注釋

@Test(retryAnalyzer=Retry.class) 

但是,爲了避免增加該屬性的所有測試方法 採取以下的辦法,是通過這個鏈接 「TestNG retryAnalyzer only works when defined in methods @Test, does not work in class' @Test

簡稱
@BeforeSuite(alwaysRun = true) 
    public void beforeSuite(ITestContext context) { 
     for (ITestNGMethod method : context.getAllTestMethods()) { 
      method.setRetryAnalyzer(new RetryAnalyzerImpl()); 
     } 
    } 

這應該有希望爲您提供t estng-results.xml報告。

+0

是的,它工作並再次運行失敗的類,但只有我遇到的問題,它不會創建類似testng-result.xml的任何類似於重新執行的類的報告。由於這個,我的詹金斯生成失敗。 – 2014-09-12 09:54:40

2

請看看:http://testng.org/doc/documentation-main.html#rerunning所有失敗的測試都包含在單獨的xml套件中,可以重新運行。

<suite name="allSuites"> 
    <suite-files> 
    <suite-file path="yourSuite.xml" /> 
    <suite-file path="testng-failed.xml" /> 
    ... 
    </suite-files> 
</suite> 
+0

你不應該手動運行,你可以有一個套件,由幾個套件組成。請查看最新的答案。 – 2014-09-11 08:33:09

+0

另一種方法是使用bat文件執行:'java org.testng.TestNG yourSuite.xml'然後 'java org.testng.TestNG testng-failed.xml'在這種情況下'testng-failed.xml'將肯定創建並在實際套件完成後立即開始 – 2014-09-11 08:53:41

相關問題