Testng 当测试类失败时,是否仍然需要重新运行它

Testng 当测试类失败时,是否仍然需要重新运行它,testng,Testng,当某个测试类的@test失败时,我想重新运行一个测试类,包括它的@beforethod。我已经实现了TestNG重试逻辑来重新运行失败的测试用例,但我想运行整个类。请看一看:所有失败的测试都包含在单独的xml套件中,可以重新运行 <suite name="allSuites"> <suite-files> <suite-file path="yourSuite.xml" /> <suite-file path="testng-fail

当某个测试类的
@test
失败时,我想重新运行一个测试类,包括它的
@beforethod
。我已经实现了TestNG重试逻辑来重新运行失败的测试用例,但我想运行整个类。

请看一看:所有失败的测试都包含在单独的xml套件中,可以重新运行

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

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

<listeners> 
    <listener class-name="com.xyar.OnTestFailureClass" />
</listeners
小心
您必须有充分的理由重新运行测试。当您确信第二次迭代将获得成功时,必须重新运行测试。 如果不是这样,那么您将进入一个无限循环,其中失败的测试将继续执行并失败

此外,如果不考虑测试结果,只想运行n次测试用例,那么必须在
onTestFailure
方法中为计数器构建逻辑

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

发现了一个更优雅的解决方案 实现IRetryAnalyzer接口。Testing提供此接口的目的是为了重试失败的测试。它提供了必须重试的次数

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; 
     } 
 } 
但是,为了避免将此属性添加到所有测试方法中 采取本链接引用的以下方法 ''


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

您不应该手动运行,您可以有一个套件,由多个套件组成。请查看更新的答案。另一种方法是创建一个将执行的bat文件:
java org.testng.testng yourSuite.xml
,然后
java org.testng.testng testng failed.xml
在这种情况下,
testng failed.xml
将在实际套件完成后立即创建和启动,并再次运行失败的类但我在这里遇到的唯一问题是,它不会为重新执行的类创建任何类似testng-result.xml的xml格式的报告。由于这个原因,我的詹金斯构建失败了。
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)
  @BeforeSuite(alwaysRun = true)
  public void beforeSuite(ITestContext context) {
      for (ITestNGMethod method : context.getAllTestMethods()) {
          method.setRetryAnalyzer(new RetryAnalyzerImpl());
      }
  }