重试逻辑 - 如果一个测试失败,则重试全班 - 硒

时间:2018-05-08 20:33:35

标签: selenium testng retry-logic

以下是用于实现重试逻辑的类

TestRetry Class:

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;
    }

RetryListener类:

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);
    }

}}

SampleTest:

@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");
    }
}

当我执行上述测试时,以下是输出 firsttest被执行并通过 secondtest取决于firsttest并被执行,失败 - 重试3次并再次失败 第三次跳过因为它取决于第二次测试。

按预期实现产出。

问题: 由于测试是依赖的。如果其中一个测试失败,我想从头开始执行整个类。有办法吗?

实施例: 如果secondtest失败,我想再次执行整个类SampleTest。

谢谢!

1 个答案:

答案 0 :(得分:1)

目前无法实现您的要求。

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方法)