Search
Write a publication
Pull to refresh

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

Автоматизированные тесты имеют свойство время от времени проходить неуспешно ("падать") по не связанным с самим тестом или тестируемой системой причинам. Особенно актуально это при запуске большого количества интеграционных или интерфейсных (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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.