2014-09-11 128 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

相关问题