Retry Logic - повторить весь класс, если один из тестов не пройден - селен - PullRequest
0 голосов
/ 08 мая 2018

Ниже приведены классы, используемые для реализации логики повторов

Класс TestRetry:

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

Когда я выполняю вышеуказанный тест, следующий вывод первый тест исполняется и проходит secondtest зависит от первого и выполняется, его ошибка - повторная попытка 3 раза и ошибка снова третий тест пропущен, потому что он зависит от второго.

Результат достигнут ожидаемым.

Вопрос: Так как тесты зависимы. Если один из тестов не пройден, я хочу выполнить весь класс сначала. Есть ли способ сделать это?

Примеры: Если вторая проверка не удалась, я хочу снова выполнить весь класс SampleTest.

Спасибо!

1 Ответ

0 голосов
/ 09 мая 2018

В настоящее время нет способа достичь того, о чем вы просите.

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 (это явно вызывается в javadocs этого интерфейса). Его можно подключить только через тег <listeners> в вашем комплекте xml (или), обратившись к нему в файле META-INF\services\org.testng.ITestNGListener (он называется Интерфейс поставщика услуг подход в Java)

...