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

标签 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> 

最佳答案

我已经尝试过你的实现,它非常适合我(使用 TestNG 7.0.0)。确保导入和类路径正确(仔细检查 <listener class-name="package.AnnotationTransformer"/> )`。

此外,请考虑以下事项:

  1. 无需覆盖 boolean retry()方法IRetryAnalyzer界面。 TestNG RetryAnalyzerCount 已经定义了依赖于计数器返回结果( boolean 值)的逻辑。类(它还实现 IRetryAnalyzer 接口(interface))。因此,最好重新使用RetryAnalyzerCount的代码。 (与你的逻辑相同):

a) 通过设置 RetryAnalyzer 范围内的最大重试尝试次数类和

b) 通过覆盖abstract boolean retryMethod(ITestResult var1);来自 TestNG RetryAnalyzerCount类,如果测试失败,它会返回正 boolean 结果 ( 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;
    }
}
  • 离开 AnnotationTransformer就这样。
  • 确保<listeners> TestNG 中的标签 .xml文件包含监听器的正确路径 ( AnnotationTransformer )。
  • 或简化一切:

    a) 删除 AnnotationTransformer<listeners>来自 TestNG .xml文件和

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

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

    关于java - 重试失败的测试在 TestNg 7.0.0 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58814964/

    相关文章:

    java - 监控 BufferedInputStream 下载进度

    java - Swing - 无法将默认任务栏图标更改为自定义图标

    selenium - Selenium webdriver 如何通过充满 JavaScript 的 http 响应来定位元素?

    使用属性文件检索用户名和密码时出现 javax.mail.AuthenticationFailedException

    java - TestNG - 2 个类之间的依赖关系(dependsOnGroups)

    java - 无法使用 ITestContext : returns null (TestNG + Java) 将参数从一个测试传递到另一测试

    java - Mybatis - 没有任何错误,它只是返回 [] 而不是数据库数据

    java - 使用 Kafka Streams 开发时,Lib 上的 UnsatisfiedLinkError 会影响 DB dll

    python - 可以打开/显示/呈现 headless (headless) Selenium session 吗?

    java - 如何使用Gradle切换Selenium WebDrivers?