Каков жизненный цикл unit-теста в JUnit?

«Каков жизненный цикл unit-теста в JUnit?» — вопрос из категории Тестирование, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Жизненный цикл unit-теста в JUnit 5 управляется аннотациями и состоит из следующих фаз:

1. Инициализация класса (@BeforeAll):

  • Выполняется один раз перед всеми тестовыми методами в классе.
  • Используется для настройки глобальных ресурсов (подключение к БД, запуск сервера).

2. Подготовка к тесту (@BeforeEach):

  • Выполняется перед каждым тестовым методом.
  • Цель — привести систему в известное состояние (создание чистого экземпляра тестируемого класса, сброс моков).

3. Выполнение теста (@Test):

  • Запускается сам тестовый метод, содержащий вызов тестируемого кода и проверки (assertions).

4. Верификация результатов:

  • Утверждения (assertions) из библиотек JUnit (AssertJ, Hamcrest) проверяют соответствие фактического результата ожидаемому.

5. Очистка после теста (@AfterEach):

  • Выполняется после каждого тестового метода.
  • Цель — освободить ресурсы, использованные в тесте (закрытие файлов, очистка временных данных).

6. Финализация класса (@AfterAll):

  • Выполняется один раз после всех тестовых методов в классе.
  • Используется для освобождения глобальных ресурсов (остановка сервера, разрыв соединения с БД).

Пример на Java (JUnit 5):

import org.junit.jupiter.api.*;

class CalculatorTest {
    private Calculator calculator;

    @BeforeAll
    static void initAll() {
        System.out.println("Инициализация перед всеми тестами");
    }

    @BeforeEach
    void init() {
        calculator = new Calculator(); // Чистый экземпляр перед каждым тестом
    }

    @Test
    void testAddition() {
        int result = calculator.add(2, 3);
        Assertions.assertEquals(5, result); // Проверка (assertion)
    }

    @AfterEach
    void tearDown() {
        calculator = null; // Очистка ссылки
    }

    @AfterAll
    static void tearDownAll() {
        System.out.println("Финализация после всех тестов");
    }
}