Ну-ка, повтори! Перезапуск проваленного теста на TestNG

photo

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

Один из способов это узнать -перезапустить проваленный тест на исполнение еще раз, да не руками после прогона всех тестов, а автоматически и сразу. Упадет повторно? Что ж  — пора искать проблему, разбираться. Не упадет? Значит проблема действительно была случайной!

В TestNG есть встроенная фишка -он генерирует сьют, куда включает все упавшие тесты, чтобы вы могли программно или руками запустить его после выполнения основного сьюта. Но нам то нужно, чтобы тест перезапустился сразу же, а не когда то там, после пробега всей сотни и более тестов.

Для этого в нашем распоряжении есть интерфейс iRetryAnalyser, который как раз позволяет выполнить задуманное. Итак вот весь код класса, имплементирующего интерфейс:

import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;

public class RunTestAgain implements IRetryAnalyzer {
    private int nowCount=0;
    private int maxCount=1;


    @Override
    public boolean retry(ITestResult iTestResult) {
        if (nowCount<maxCount) {
            nowCount++;
            return true; //пока истина перезапускаем
        }
        System.out.println("ТЕСТ ПРОВАЛЕН ДВАЖДЫ!!! "); // пишем в лог или делаем скриншот
        nowCount=0;
        return false;
    }
}

Все должно быть понятно, но немного проговорим: переменная maxCount — это максимальное количество перезапусков теста, ведь можно и не дважды его прогнать, у меня стоит 1 так как я проверяю только 1 раз автоматически, дальше лучше разбираться самому, так как два раза упавший тест — повод для интереса. Переменная nowCount это текущий счетчик, который инкрементится в случае сработки и сбрасывается после того как мы перестаем перезапускать тест. Метод retry возвращает булево значение и если оно ИСТИНА то перезапускает тест.

Теперь все, что нужно сделать — это прописать наш новый класс в аннотации к тесту или классу, например

@Test(priority = 2, retryAnalyzer = RunTestAgain.class)
public class SimpleTest {

Сразу оговорю важные моменты:

— перезапускать упавшие тесты нужно с умом, а не гоняясь за позеленением выполненного сьюта, это не панацея от кривых тестов

— сам интерфейс сыроват, он экспериментальный и как я понимаю на данный момент не поддерживается, хотя и работает

— не всегда срабатывает! Да, сказывается его экспериментальность, как я заметил есть проблемы при сработке, если тест упал по необработанному исключению. То есть, если тест падает ожидаемо по Ассерту, то все должно работать, а вот если вы не обработали и не предусмотрели какое-нибудь исключение, то повтор не запускается.

Стремитесь писать правильные тесты и тогда данный интерфейс вам не понадобится. А вот как их писать будем разбираться вместе!

Software-Testing.Ru

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s