Ответ
В Java-тестировании (JUnit, TestNG) аннотации — это специальные метки, которые добавляются к классам и методам, чтобы указать фреймворку, как их обрабатывать. Они являются декларативным способом настройки тестового окружения, управления жизненным циклом теста и его поведения.
Основные аннотации JUnit 5 и их назначение:
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
// Аннотации для управления жизненным циклом тестового класса
@DisplayName("Сервис работы с пользователями") // Читаемое имя для отчетов
@TestInstance(TestInstance.Lifecycle.PER_CLASS) // Стратегия создания экземпляра тестового класса
class UserServiceTest {
private UserService userService;
private TestDatabase db;
@BeforeAll // Выполняется ОДИН раз перед всеми тестами в классе. Метод должен быть static (если не PER_CLASS).
static void initGlobalResources() {
System.out.println("Инициализация глобальных ресурсов (например, пула соединений)");
}
@BeforeEach // Выполняется перед КАЖДЫМ тестовым методом. Используется для подготовки данных.
void setUp() {
db = new TestDatabase(); // Создаем чистую тестовую БД
db.start();
userService = new UserService(db.getConnection());
}
@Test // Помечает метод как тестовый случай.
@DisplayName("Создание нового пользователя должно присваивать уникальный ID")
void createUser_ShouldAssignId() {
User user = new User("john_doe");
User savedUser = userService.create(user);
assertNotNull(savedUser.getId()); // Проверка, что ID не null
assertTrue(savedUser.getId() > 0); // Проверка, что ID положительный
}
@Test
@Disabled("Баг DB-123: Падает при пустом имени") // Временно отключает тест с комментарием.
void createUser_WithEmptyName_ShouldFail() {
// ... тест временно отключен
}
@ParameterizedTest // Позволяет запустить один тест с разными наборами данных.
@ValueSource(strings = {"alice", "bob", "charlie"})
@DisplayName("Создание пользователя с валидным именем ")
void createUser_WithValidNames_ShouldSucceed(String username) {
User user = new User(username);
assertDoesNotThrow(() -> userService.create(user));
}
@AfterEach // Выполняется после КАЖДОГО тестового метода. Используется для очистки.
void tearDown() {
db.stop(); // Останавливаем и очищаем тестовую БД
}
@AfterAll // Выполняется ОДИН раз после всех тестов в классе.
static void cleanupGlobalResources() {
System.out.println("Очистка глобальных ресурсов");
}
}
Почему это важно для QA-инженера:
- Организация: Аннотации четко разделяют код подготовки (
@BeforeEach), выполнения (@Test) и очистки (@AfterEach). - Гибкость: Можно легко включать/отключать тесты (
@Disabled), группировать их (@Tag) или запускать с параметрами (@ParameterizedTest). - Читаемость отчетов:
@DisplayNameделает отчеты о прохождении тестов понятными для всей команды (разработчики, менеджеры). - Интеграция: Аннотации используются CI-системами (Jenkins, TeamCity) для сбора и анализа результатов тестов.