在失败之前自动重试所有测试3次

时间:2016-04-04 21:37:04

标签: java testng testcase

我们正在使用TestNG进行集成测试。我们最近从jUnit转换过来,我们曾经使用org.junit.rules.TestRule自动重试每次测试最多3次,然后再将其视为失败。每当测试用例偶尔失败时,这就消除了很多误报。

在我们转换为TestNG时,这个重试规则被忽略了,现在我们有一堆测试用例“失败”,这些都是误报。

我发现了一些关于如何自动重新运行TestNG测试用例的文章:

https://jepombar.wordpress.com/2015/02/16/testng-adding-a-retryanalyzer-to-all-you-tests/

http://mylearnings.net/11.html

它的要点是,您可以为每个retryAnalizer - 带注释的测试用例指定@Test。我建立了自己的分析器并将其应用于测试用例,这样就可以了。但是,当我们希望套件中的每个测试用例执行此操作时,手动将重试分析器应用于每个单独的测试用例并不是一个好的解决方案。 jepombar.wordpress.com上的文章展示了一种将它应用于类中所有测试的方法,但无论出于何种原因,它似乎都没有按照书面形式工作。

我做了以下IAnnotationTransformer

public class RetryListener implements IAnnotationTransformer {

    @Override
    public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
        IRetryAnalyzer retry = annotation.getRetryAnalyzer();
        if (retry == null) {
            annotation.setRetryAnalyzer(RetryRule.class); // my TestNG RetryAnalizer implementation
        }
    }

}

我将它应用于这样的课程:

@Listeners(RetryListener.class)
public class FooTest extends SeleniumMockedTest {
    ...
}

这不起作用; RetryListener.transform()中的代码永远不会执行,因此RetryRule永远不会添加到该类的任何测试用例中。

我怎样才能让它发挥作用?

或者,更好的是,我真正的问题:如何让我们的集成测试套件中的所有测试用例在失败计数之前自动尝试3次实际失败?

2 个答案:

答案 0 :(得分:0)

我无法使用@Listeners使用它,但我可以使用命令行使其工作。 e.g:

java org.testng.TestNG -listener MyTransformer testng.xml

使用@Listeners无效可能是一个错误。您可以报告问题here

答案 1 :(得分:0)

尝试一下, 上2节课,

public class RetryAnalyzer implements IRetryAnalyzer {
int counter = 0;
@Override
public boolean retry(ITestResult result) {  
    RetryCountIfFailed annotation = result.getMethod().getConstructorOrMethod().getMethod()
            .getAnnotation(RetryCountIfFailed.class);
    result.getTestContext().getSkippedTests().removeResult(result.getMethod());
    if((annotation != null) && (counter < annotation.value()))
    {
        counter++;
        return true;
    }
    return false;
}

并编写另一个类,看起来像这样

@Retention(RetentionPolicy.RUNTIME)
public @interface RetryCountIfFailed  {

    int value() default 0;
}

现在,将如下所示的计数值(retryCountGlobal)传递给您要重试的每个测试,

 @Test
    @listeners.RetryCountIfFailed(retryCountGlobal)
    public void verifyRetryOnTestMethod(){
}

P.S:请记住,如果retryCountGlobal = 3,则测试将运行4次,如果第一次失败,则将重试3次。