Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重试失败的测试在TestNg 7.0.0中不起作用?_Java_Selenium_Testng - Fatal编程技术网

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

Java 重试失败的测试在TestNg 7.0.0中不起作用?,java,selenium,testng,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(ITe

如果我在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;
        }
    }

我的听众:

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

我已经尝试了您的实现,它对我来说非常适合(使用TestNG 7.0.0)。确保导入和类路径正确(请仔细检查)

也请考虑以下内容:

  • 无需重写
    IRetryAnalyzer
    接口的
    boolean retry()
    方法。TestNG
    RetryAnalyzerCount
    类已经定义了返回依赖于计数器的结果(布尔值)的逻辑(它还实现了
    IRetryAnalyzer
    接口)。因此,最好重新使用
    RetryAnalyzerCount
    的代码(使用与您相同的逻辑):
  • a) 通过在
    RetryAnalyzer
    class和

    b) 通过重写抽象布尔retryMethod(ITestResult var1)来自TestNG
    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;
        }
    }
    
  • 保持
    AnnotationTransformer
    原样
  • 确保TestNG
    .xml
    文件中的
    标记包含到侦听器的正确路径(
    AnnotationTransformer
    或简化一切:

    a) 通过从TestNG
    .xml
    文件和

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

    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;
        }
    }
    
    @BeforeSuite
        void beforeSuiteSetUp(ITestContext testsContext) {
            setCustomRetryAnalyzer(testsContext);
        }
    
        private void setCustomRetryAnalyzer(ITestContext testsContext) {
            for (ITestNGMethod method : testsContext.getAllTestMethods()) {
                method.setRetryAnalyzerClass(RetryAnalyzer.class);
            }
        }