← Назад к вопросам

Какие знаешь основные аннотации JUnit?

2.0 Middle🔥 172 комментариев
#Теория тестирования#Фреймворки тестирования

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Основные аннотации JUnit для управления тестами

При написании автоматизированных тестов с использованием JUnit, аннотации играют ключевую роль в управлении жизненным циклом тестов, их организацией и поведением. Я как QA Automation Engineer с 10+ лет опыта использую эти аннотации ежедневно для создания структурированных, надежных и легко поддерживаемых тестовых наборов. Вот основные аннотации, их назначение и примеры использования.

@Test — фундамент каждого теста

Эта аннотация маркирует метод как тестовый. JUnit Runner выполняет все методы, помеченные @Test. Это самая основная и обязательная аннотация.

import org.junit.Test;

public class CalculatorTest {
    
    @Test
    public void testAddition() {
        Calculator calc = new Calculator();
        int result = calc.add(2, 3);
        // Assertion для проверки результата
        assertEquals(5, result);
    }
}

@Before и @After — аннотации жизненного цикла (JUnit 4)

В JUnit 4 эти аннотации управляют подготовкой и очисткой.

  • @Before (@BeforeEach в JUnit 5): Метод выполняется перед каждым тестом. Идеально для инициализации объектов, настройки состояния.
  • @After (@AfterEach в JUnit 5): Метод выполняется после каждого теста. Используется для очистки ресурсов, закрытия браузера в UI тестах.
import org.junit.Before;
import org.junit.After;

public class WebTest {
    private WebDriver driver;
    
    @Before
    public void setUp() {
        // Инициализация драйвера перед каждым тестом
        driver = new ChromeDriver();
    }
    
    @Test
    public void testLogin() {
        // Тест использует готовый driver
    }
    
    @After
    public void tearDown() {
        // Закрытие драйвера после каждого теста
        driver.quit();
    }
}

@BeforeClass и @AfterClass — аннотации для работы с классом (JUnit 4)

В JUnit 4 эти аннотации выполняются один раз за жизненный цикл тестового класса.

  • @BeforeClass (@BeforeAll в JUnit 5): Метод выполняется один раз перед всеми тестами в классе. Часто для тяжелой инициализации (подключение к БД, запуск сервера).
  • @AfterClass (@AfterAll в JUnit 5): Метод выполняется один раз после всех тестов в классе. Для финальной очистки глобальных ресурсов.
import org.junit.BeforeClass;
import org.junit.AfterClass;

public class DatabaseTest {
    private static Connection connection;
    
    @BeforeClass
    public static void initDatabase() {
        // Создание подключения к БД один раз для всех тестов
        connection = DriverManager.getConnection("url", "user", "pass");
    }
    
    @AfterClass
    public static void closeDatabase() {
        // Закрытие подключения после всех тестов
        connection.close();
    }
}

@Ignore — временное исключение теста

Аннотация @Ignore (или @Disabled в JUnit 5) позволяет временно не выполнять тест или целый тестовый класс. Используется при рефакторинге, когда тест нестабилен или зависит от неготовой функциональности.

@Test
@Ignore("Тест временно отключен из-за бага в API")
public void testDeprecatedApi() {
    // Этот тест не будет запущен
}

Параметризованные тесты с @RunWith и @Parameters (JUnit 4)

Для выполнения одного теста с разными входными данными используются:

  • @RunWith(Parameterized.class) для класса.
  • @Parameters для метода, возвращающего коллекцию данных.
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class ParameterizedTest {
    private int input;
    private int expected;
    
    // Конструктор для инициализации параметров
    public ParameterizedTest(int input, int expected) {
        this.input = input;
        this.expected = expected; 
    }
    
    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {
            {1, 2}, 
            {5, 10}, 
            {10, 20}
        });
    }
    
    @Test
    public void testDoubling() {
        assertEquals(expected, input * 2);
    }
}

Аннотации для управления поведением теста

  • @Test(timeout = 1000) (JUnit 4): Устанавливает лимит времени выполнения теста в миллисекундах. Тест считается неудачным, если превышает лимит. В JUnit 5 это @Timeout.
  • @Test(expected = Exception.class) (JUnit 4): Ожидает, что тест выбросит определенное исключение. Если исключение не выброшено или выброшено другое — тест неудачен. В JUnit 5 заменена на assertThrows() внутри теста.

Переход к JUnit 5 (Jupiter)

В современных проектах я часто использую JUnit 5, где аннотации стали более логичными и добавились новые возможности:

  • @Test осталась, но теперь из org.junit.jupiter.api.
  • @BeforeEach и @AfterEach заменяют @Before и @After.
  • @BeforeAll и @AfterAll заменяют @BeforeClass и @AfterClass. Важно: методы должны быть static.
  • @DisplayName — для задания человеко-читаемого имени теста.
  • @Nested — для создания вложенных тестовых классов, улучшая структуру.
  • @RepeatedTest(n) — для повторения теста указанное количество раз.
  • @Tag — для категоризации тестов (например, "slow", "integration").
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

class JUnit5Example {
    
    @BeforeEach
    void init() {
        // Инициализация для каждого теста
    }
    
    @Test
    @DisplayName("Проверка корректного логина пользователя")
    @Tag("integration")
    void successfulLoginTest() {
        // Тест с понятным именем и тегом
    }
}

Заключение

Понимание и грамотное применение аннотации JUnit — это базовая компетенция Automation QA. Они позволяют не просто запускать код, а создавать профессиональную тестовую архитектуру: управлять ресурсами, группировать тесты, параметризовать данные и контролировать их выполнение. В реальных проектах, особенно с Page Object Model или Data-Driven Testing, комбинации этих аннотации образуют скелет тестового фреймворка, обеспечивая его стабильность и масштабируемость.

Какие знаешь основные аннотации JUnit? | PrepBro