我们正在使用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。