以下是用于实现重试逻辑的类
测试重试类:
public class TestRetry implements IRetryAnalyzer {
int counter=0;
int retryLimit=2;
@Override
public boolean retry(ITestResult result) {
if (counter < retryLimit) {
TestReporter.logStep("Retrying Test " +result.getName()+" for number of times: "+(counter+1));
counter++;
return true;
}
return false;
}
重试监听器类:
public class RetryListener implements IAnnotationTransformer {
@Override
public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
// TODO Auto-generated method stub
IRetryAnalyzer retry = annotation.getRetryAnalyzer();
if (retry == null) {
annotation.setRetryAnalyzer(TestRetry.class);
}
}}
样品测试:
@Listeners(RetryListener.class)
public class SampleTest {
@BeforeSuite(alwaysRun = true)
public void beforeSuite(ITestContext context) {
for (ITestNGMethod method : context.getAllTestMethods()) {
method.setRetryAnalyzer(new TestRetry());
}
}
@Test(priority=0)
public void firsttest() {
System.out.println();
TestReporter.assertEquals("Test", "Test", "pass");
}
@Test(priority=1, dependsOnMethods="firsttest")
public void secondtest() {
TestReporter.assertEquals("Test", "Test1", "fail");
}
@Test(priority=2,dependsOnMethods="secondtest")
public void thirdtest() {
TestReporter.assertEquals("Test", "Test", "pass");
}
}
当我执行上述测试时,以下是输出 第一个测试被执行并通过 SecondTest 依赖于 FirstTest 并被执行,失败 - 重试 3 次,再次失败 第三次测试被跳过,因为它取决于第二次测试。
达到预期的产出。
问题: 由于测试是相关的。如果其中一个测试失败,我想从一开始执行整个类。有办法做到吗?
示例: 如果 SecondTest 失败,我想再次执行整个类 SampleTest。
谢谢!
目前无法实现您所要求的。
TestNG 只会重试失败的测试,但不会沿着执行阶梯向上查找所有上游依赖项并尝试运行它们(您的要求是此通用用例的一个非常具体的变体)。
如果你仔细想想,一个依赖测试正在执行只是因为它的上游依赖项(它所依赖的方法)已经成功执行。那么,如果当前测试失败,为什么需要重新执行已经满足的上游依赖项呢?它违反直觉。
对于您所拥有的用例,您应该仅仅在
@Test
方法中构建整个逻辑,其中您负责处理重试以及在出现失败时再次调用整个链。
下面的示例应该澄清这一点
public class SampleTest {
@Test (retryAnalyzer = TestRetry.class)
public void orchestrateTest() {
firsttest();
secondtest();
thirdtest();
}
public void firsttest() {
System.out.println();
TestReporter.assertEquals("Test", "Test", "pass");
}
public void secondtest() {
TestReporter.assertEquals("Test", "Test1", "fail");
}
public void thirdtest() {
TestReporter.assertEquals("Test", "Test", "pass");
}
}
TestNG 不支持您在问题中寻找的用例。
顺便说一句,您无法通过
IAnnotationTransformer
注释连接 @Listeners
侦听器(这在该接口的 javadoc 中明确指出)。它只能通过套件 xml 中的 <listeners>
标签连接(或者)通过在 META-INF\services\org.testng.ITestNGListener
文件中引用它(在 Java 中称为 Service Provider Interface 方法)
@Krishnan Mahadevan - TestNG 现在支持这个吗?