重试失败的测试在TestNg 7.0.0中不起作用?

时间:2019-11-12 08:45:31

标签: java selenium testng

如果我在testng 6.14.3版本上运行测试,则重新启动删除的测试。 如果我在testng 7.0.0版本上运行测试,则删除的测试不会重新启动。


    public class RetryAnalyzer implements IRetryAnalyzer {

        private int count = 0;
        private static int maxTry = 2;

        @Override public boolean retry(ITestResult iTestResult) {
            if (!iTestResult.isSuccess()) {                      
                if (count < maxTry) {                           
                    count++;                                     
                    iTestResult.setStatus(ITestResult.FAILURE); 

                    iTestResult.getTestContext().getFailedTests().removeResult(iTestResult);

                    return true;                                 
                } else {
                    iTestResult
                        .setStatus(ITestResult.FAILURE);  
                }
            } else {
                iTestResult
                    .setStatus(ITestResult.SUCCESS);      
            }
            return false;
        }
    }

public class AnnotationTransformer implements IAnnotationTransformer {

    @Override
    public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor,
        Method testMethod) {
        annotation.setRetryAnalyzer(RetryAnalyzer.class);
    }
}

我的听众:

<listeners>
        <listener class-name="package.AnnotationTransformer"/>
    </listeners> 

1 个答案:

答案 0 :(得分:0)

我已经尝试了您的实现,并且对我来说非常完美(使用了TestNG 7.0.0)。确保导入和类路径正确(仔细检查<listener class-name="package.AnnotationTransformer"/>)。

另外,请考虑以下事项:

  1. 不需要重写boolean retry()接口的IRetryAnalyzer方法。 TestNG RetryAnalyzerCount类已经定义了根据计数器返回结果(布尔)的逻辑(它也实现了IRetryAnalyzer接口)。因此,最好重用RetryAnalyzerCount的代码(与您的逻辑相同):

a)通过设置RetryAnalyzer类和

中的最大重试尝试次数

b)通过重写TestNG abstract boolean retryMethod(ITestResult var1);类中的RetryAnalyzerCount,如果测试失败,则返回正布尔值(true)。

import java.util.concurrent.atomic.AtomicInteger;

import org.testng.ITestResult;
import org.testng.util.RetryAnalyzerCount;

import lombok.extern.slf4j.Slf4j;

/**
 * Used by RetryListener (or AnnotationTransformer) to avoid the declaration of 'retryAnalyzer' in each @Test annotation
 */
@Slf4j
public class RetryAnalyzer extends RetryAnalyzerCount {
    private static final int MAX_RETRY_ATTEMPTS = 3;
    private AtomicInteger counter = new AtomicInteger(1); //used only for logging purposes

    public RetryAnalyzer() {
        setCount(MAX_RETRY_ATTEMPTS);
    }

    @Override
    public boolean retryMethod(ITestResult result) {
       // log example: [15/04/20 13:31] WARN [RetryAnalyzer] RETRY failed test 'displaySearchResultForValidInput' (1 out of 3 times)
        String methodName = result.getMethod().getMethodName();
        log.warn("RETRY failed test '{}' ({} out of {} times)",
                methodName,
                this.counter.getAndIncrement(),
                MAX_RETRY_ATTEMPTS);
       // enough is only the return statement 
        return true;
    }
}
  1. 保持AnnotationTransformer不变。
  2. 确保TestNG <listeners>文件中的.xml标签包含指向侦听器(AnnotationTransformer)的正确路径。

或简化所有操作:

a)通过从TestNG AnnotationTransformer文件中删除<listeners>.xml

b)通过在RetryAnalyzer中为TestNG设置自定义@BeforeSuite(!!!不是@BeforeMethod,这会导致无限循环)

@BeforeSuite
    void beforeSuiteSetUp(ITestContext testsContext) {
        setCustomRetryAnalyzer(testsContext);
    }

    private void setCustomRetryAnalyzer(ITestContext testsContext) {
        for (ITestNGMethod method : testsContext.getAllTestMethods()) {
            method.setRetryAnalyzerClass(RetryAnalyzer.class);
        }
    }