无论如何都要在测试类失败时重新运行它

Pri*_*har 6 testng

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

Dol*_*ava 15

有可能这样做.为此,您需要在testNg.xml中将org.testng.ITestListener的实现注册为侦听器

<listeners> 
    <listener class-name="com.xyar.OnTestFailureClass" />
</listeners
Run Code Online (Sandbox Code Playgroud)

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();

  }
Run Code Online (Sandbox Code Playgroud)

小心
您必须有充分的理由重新运行测试.当您确定第二次迭代将导致成功时,必须重新进行测试.如果不是这种情况,那么您将进入一个无限循环,其中失败的测试将继续执行并失败.

此外,如果您想要无论测试结果如何都只运行测试用例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; 
     } 
 } 
Run Code Online (Sandbox Code Playgroud)

你需要使用以下注释

 @Test(retryAnalyzer=Retry.class)
Run Code Online (Sandbox Code Playgroud)

但是,为了避免将此属性添加到您的所有测试方法,请使用此链接' TestNG retryAnalyzer所引用的以下方法仅在方法@Test中定义时才起作用,在类'@Test '中不起作用

  @BeforeSuite(alwaysRun = true)
  public void beforeSuite(ITestContext context) {
      for (ITestNGMethod method : context.getAllTestMethods()) {
          method.setRetryAnalyzer(new RetryAnalyzerImpl());
      }
  }
Run Code Online (Sandbox Code Playgroud)

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