Какие основные аннотации JUnit 5 вы используете в тестах?

«Какие основные аннотации JUnit 5 вы используете в тестах?» — вопрос из категории Фреймворки тестирования, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В своих проектах по автоматизации я использую JUnit 5 (Jupiter) как основной фреймворк. Вот ключевые аннотации и как я их применяю:

1. Аннотации жизненного цикла теста:

  • @BeforeAll / @AfterAll: Использую для настройки и завершения работы общих ресурсов, которые требуются для всех тестов в классе. Например, запуск/остановку Selenium WebDriver, инициализацию базы тестовых данных или поднятие тестового сервера. Методы должны быть static.

    public class WebTestBase {
        protected static WebDriver driver;
    
        @BeforeAll
        static void setupAll() {
            WebDriverManager.chromedriver().setup();
            driver = new ChromeDriver();
            driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        }
    
        @AfterAll
        static void tearDownAll() {
            if (driver != null) {
                driver.quit();
            }
        }
    }
  • @BeforeEach / @AfterEach: Использую для подготовки и очистки состояния перед и после каждого тестового метода. Например, переход на стартовую страницу, логин в систему, очистка cookies или сброс базы данных к известному состоянию.

    public class LoginTest extends WebTestBase {
    
        @BeforeEach
        void openLoginPage() {
            driver.get("https://app.test.com/login");
            driver.manage().deleteAllCookies();
        }
    
        @AfterEach
        void captureScreenshotOnFailure(TestInfo testInfo) {
            if (testInfo.getTags().contains("ui") && /* проверка на провал теста */) {
                // Сохраняем скриншот для анализа
            }
        }
    }

2. Аннотация выполнения теста:

  • @Test: Помечает метод как тестовый. Часто комбинирую с @DisplayName для читаемых отчетов.
    @Test
    @DisplayName("Успешный логин с валидными кредами")
    void successfulLoginWithValidCredentials() {
        loginPage.enterCredentials("user", "pass");
        loginPage.submit();
        assertThat(dashboardPage.isLoaded()).isTrue();
    }

3. Аннотации для управления выполнением:

  • @Disabled: Временно отключаю тест, если он падает из-за дефекта в тестируемом приложении или требует доработки. Обязательно указываю причину в String значении.
    @Test
    @Disabled("Отключено до фикса бага PROJ-1234 в API")
    void testFeatureWithKnownBug() { ... }
  • @Tag: Группирую тесты для выборочного запуска (например, через Maven/Gradle). Это критично для CI/CD.

    @Test
    @Tag("smoke") // Быстрые проверки основной функциональности
    @Tag("regression")
    void criticalUserJourney() { ... }
    
    @Test
    @Tag("slow") // Долгие интеграционные тесты
    @Tag("api")
    void fullDataImportTest() { ... }

    Запуск только smoke-тестов: mvn test -Dgroups=smoke

4. Аннотации для параметризованных тестов (@ParameterizedTest, @ValueSource, @CsvSource): Широко использую для тестирования одного сценария с разными входными данными (позитивные/негативные кейсы).

    @ParameterizedTest
    @CsvSource({
        "admin, admin123, true",
        "user, wrongpass, false",
        "'', '', false"
    })
    @DisplayName("Проверка логина с разными данными")
    void testLoginParametrized(String username, String password, boolean expectedSuccess) {
        boolean actualResult = loginService.authenticate(username, password);
        assertThat(actualResult).isEqualTo(expectedSuccess);
    }

Этот набор аннотаций позволяет создавать хорошо структурированные, поддерживаемые и эффективные наборы автотестов.