testng - 无论如何,当它失败时重新运行一个测试类

标签 testng

我想重新运行一个测试类,包括它的 @BeforeMethod当其中任何一个是 @Test失败。我已经实现了 TestNG 重试逻辑来重新运行失败的测试用例,但我想运行整个类。

最佳答案

可以这样做。
为此,您需要在 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 中为计数器构建一个逻辑。方法。

- - - - - - - - - - - - - - -更新 - - - - - - - - - - ----------------

发现了一个更优雅的解决方案
实现 IRetryAnalyzer 接口(interface)。此接口(interface)由 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());
      }
  }

这应该有望为您提供 testng-results.xml 报告。

关于testng - 无论如何,当它失败时重新运行一个测试类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25781098/

相关文章:

java - testng:为什么我不能基于组运行测试

java - 如何指定 TestNG 测试在 Jenkins 构建中运行?

java - TestNG 并行测试配置

java - 配置失败导致 TestNG 中的测试跳过且 XML 中没有信息

java - 使用 PDFBox 断言 PDF 中的文本 - Selenium/java

java - 如何在 AfterMethod 中 TestNG 中测试失败?

java - 参数化单元测试套件

jenkins - 如何在数据库中捕获项目的 Junit 测试结果

java - 具有优先级的测试用例执行的 TestNG 顺序

maven - 集成测试前启动Apache tomcat服务器