Механизм повторного запуска в автоматизированном тестировании
Автоматизированные тесты имеют свойство время от времени проходить неуспешно ("падать") по не связанным с самим тестом или тестируемой системой причинам. Особенно актуально это при запуске большого количества интеграционных или интерфейсных (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://itnext.io/how-to-retry-fails-automation-tests-af4884c47712
https://maven.apache.org/surefire/maven-surefire-plugin/examples/rerun-failing-tests.html