Способы повторного запуска тестов
Часто в практике мы сталкиваемся с нестабильными тестами, которые хочется перезапустить несколько раз. Если после n-го количества перезапусков тест остаётся неудачным, его признают проваленным.
В этой статье я рассмотрю возможные способы повторного запуска тестов в JUnit 5, с которыми я столкнулась при поиске решений.
1. Аннотация @RepeatedTest из JUnit 5
Данный способ позволяет повторять запуск теста несколько раз с указанием желаемого количества перезапусков и не зависит от результата теста. Данный способ полезен, на мой взгляд, когда нужно проверить тест на стабильность при повторных запусках, или для стресс-тестирования.
Однако в junit 5 появилась возможность добавить количество допустимых провалов теста. Для этого был создан атрибут failureThreshold. Он позволяет задать максимальное допустимое количество неудач (провалов теста) при выполнении теста, аннотированного @RepeatedTest. Если количество провалов превышает это значение, тест считается окончательно проваленным. По умолчанию атрибут имеет Integer.MAX_VALUE, что означает бесконечное количество неудач, это значит, что тест будет повторятся ровно заданное количество в @RepeatedTest независимо от количества неудач.
Пример:
Тест выполняется 10 раз
Если количество неудач превысит 3, тест считается проваленным.
Это не всегда удобно, т.к. тест выполняется всегда n раз, даже если он успешно проходит. А нам нужно, чтобы успешное прохождение завершало тест, а неудачи приводили к перезапуску. Для этого лучше подходит аннотация @RepeatedIfExceptionsTest, о которой расскажу далее.
2. Плагин rerunner-jupiter
Этот плагин предоставляет аннотацию @RepeatedIfExceptionsTest(repeats = 2), которая позволяет перезапускать только упавшие тесты. Использовать ее можно вместо аннотации @Test и указывая количество перезапусков.
3. Аннотация @TestTemplate
Эта аннотация используется под капотом у @RepeatedTest и @RepeatedIfExceptionsTest. Можно не использовать @RepeatedTest, а применить @TestTemplate. Однако количество перезапусков указывается в реализации интерфейсов TestTemplateInvocationContextProvider и TestTemplateInvocationContext.
Пример:
4. Использование настройки maven-surefire-plugin (для Maven)
Если вы используете Maven, можно использовать свойство rerunFailingTestsCount в maven-surefire-plugin.
Настройка в pom.xml:
5. Перезапуск тестов вручную (через TestExecutionExceptionHandler)
Этот способ позволяет контролировать количество перезапусков, используя интерфейс TestExecutionExceptionHandler, который перехватывает ошибки теста.
Реализация:
Логика повторного запуска:
Метод для повторного запуска теста:
Этот способ позволяет гибко управлять перезапусками.
Так же для реализации похожего способа можно использовать TestWatcher.testFailed() или механизм Launcher в JUnit 5 для перехвата ошибок и управления перезапусками.
6. Перезапуск тестов с использованием AspectJ
Можно использовать AspectJ для автоматического перезапуска тестов в случае неудачи:
Каждый из перечисленных методов имеет свои плюсы и минусы и это только часть способов и инструментов, которые позволят перезапустить тест.
А какие способы перезапуска тестов используете вы? 😉