Как стать автором
Обновить

Механизм повторного запуска в автоматизированном тестировании

Автоматизированные тесты имеют свойство время от времени проходить неуспешно ("падать") по не связанным с самим тестом или тестируемой системой причинам. Особенно актуально это при запуске большого количества интеграционных или интерфейсных (E2E) тестов. Может отвалиться интернет\стороняя интегрированная система\глюкнуть браузер и т.д. Конечно, если есть регулярно нестабильный (flaky) тест, это всегда повод зарефакторить сам тест и убедиться, что в системе нет дефекта. Для случаев, когда первое и второе уже сделано, существует механизм повторного запуска теста (retry). Если он внедрен, после падения ваш тест будет запускаться ещё один или несколько раз до успешного выполнения(ий).

В Java проекте поддержка данного механизма может быть включена на уровне фреймворка юнит тестирования (JUnit, TestNG) либо сборщика проекта (Maven, Gradle), хотя также можно нестабильный код обернуть с помощью сторонней библиотеки утилитных методов или воспользоваться возможностями Spring.

Внедрим ретрай для JUnit5. Согласно тикету поддержка механизма ещё не была добавлена в сам фреймворк, однако есть расширения, которые позволяют сделать без лишних затруднений, а именно JUnit Pioneer.

Добавим зависимость библиотеки-расширения в проект, на примере maven pom файла:

<dependency>
	<groupId>org.junit-pioneer</groupId>
	<artifactId>junit-pioneer</artifactId>
	<version><!--...--></version>
</dependency>

Далее вместо стандартной аннотации фреймворка @Test используем библиотечную аннотацию @RetryingTest, в которой обязательно указать один параметр с максимальным количеством попыток, также есть опциональные параметры: минимальное успешное обязательное количество выполнений; указать исключение, при котором тест будет перезапущен; имя теста.

Например:

import org.junitpioneer.jupiter.RetryingTest;

import static org.junit.jupiter.api.Assertions.fail;

public class DummyTest {
    private int counter = 0;

    @RetryingTest(5)
    void flaky() {
        if (counter++ < 2) fail();
    }

}

Такой тест при запуске сначала будет два раза неуспешен, эти попытки будут отмечены как пропущенные (skipped); а на третий запуск успешно пройдёт. Следующих двух попыток (т.к. всего было указано 5) уже не будет, потому что не был указан параметр минимальных успешных попыток и использовалось его стандартное значение (один).

Дополнительное чтение:

https://software-testing.ru/library/testing/testing-automation/3862-using-retries-in-tests-can-hide-the-bugs

https://software-testing.ru/library/testing/general-testing/3655-are-automated-test-retries-good-or-bad

https://itnext.io/how-to-retry-fails-automation-tests-af4884c47712

https://maven.apache.org/surefire/maven-surefire-plugin/examples/rerun-failing-tests.html

https://github.com/gradle/test-retry-gradle-plugin

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.