我们正在使用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次,然后再将失败视为实际失败?

最佳答案

我也无法使用@Listeners使其正常工作,但可以使用命令行来使其正常工作。例如。:

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


使用@Listeners不能正常工作可能是一个错误。您可以报告问题here

10-05 18:09