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

Какие аннотации использовал для автотестов?

2.3 Middle🔥 112 комментариев
#Теория тестирования

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

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

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

Основные аннотации в фреймворках для автотестов

В своей практике QA Automation Engineer я использую широкий спектр аннотаций в зависимости от фреймворка (JUnit, TestNG, pytest и др.), которые служат метаданными для управления жизненным циклом тестов, их группировки и настройки окружения. Ниже — ключевые категории и примеры.

1. Аннотации для управления жизненным циклом теста (JUnit 5 / Jupiter)

Эти аннотации определяют, когда выполняются определённые методы.

import org.junit.jupiter.api.*;

public class LifecycleTest {

    @BeforeAll
    static void initAll() {
        // Выполняется ПЕРЕД всеми тестами класса (1 раз)
    }

    @BeforeEach
    void init() {
        // Выполняется перед КАЖДЫМ тестом
    }

    @Test
    void myTest() {
        // Сам тестовый метод
    }

    @AfterEach
    void tearDown() {
        // Выполняется после КАЖДОГО теста
    }

    @AfterAll
    static void tearDownAll() {
        // Выполняется ПОСЛЕ всех тестов класса (1 раз)
    }
}

2. Аннотации для маркировки и фильтрации тестов

Позволяют категоризировать тесты для выборочного запуска.

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.DisplayName;

@Tag("integration") // Тег для группировки (например, "smoke", "regression")
public class FilteringTest {

    @Test
    @Tag("fast")
    @DisplayName("Проверка быстрой операции") // Человекочитаемое имя в отчётах
    void fastTest() { }

    @Test
    @Disabled("Баг JIRA-123") // Временно отключает тест
    void brokenTest() { }
}

3. Аннотации для параметризации (Data-Driven Testing)

Ключевые для параметризованных тестов, где один тест запускается с разными наборами данных.

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.junit.jupiter.params.provider.CsvSource;

public class ParameterizedTests {

    @ParameterizedTest
    @ValueSource(strings = {"data1", "data2"})
    void testWithValues(String data) { }

    @ParameterizedTest
    @CsvSource({"1, 'name1'", "2, 'name2'"})
    void testWithCsv(int id, String name) { }
}

4. Аннотации для управления порядком и зависимостями (TestNG)

TestNG предоставляет расширенные возможности по сравнению с JUnit.

import org.testng.annotations.*;

public class TestNGExample {

    @Test(priority = 1, groups = {"smoke"})
    public void highPriorityTest() { }

    @Test(dependsOnMethods = {"highPriorityTest"}) // Зависимость между тестами
    public void dependentTest() { }

    @Test(timeOut = 5000) // Ограничение времени выполнения
    public void timeoutTest() { }

    @Test(enabled = false) // Аналог @Disabled в JUnit
    public void disabledTest() { }
}

5. Аннотации для настройки тестового окружения

Часто используются в связке с фреймворками (Spring, Selenium) для инъекции зависимостей.

import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;

@SpringBootTest
@TestPropertySource(locations = "/test.properties") // Загрузка конфигурации
public class IntegrationTest {
    // Контекст Spring загружается перед тестами
}

6. Аннотации в Python (pytest)

В pytest аннотации реализованы через декораторы.

import pytest

@pytest.fixture(scope="session")  # Фикстура (аналог @BeforeAll)
def global_data():
    return {"key": "value"}

@pytest.mark.smoke  # Маркировка теста
@pytest.mark.parametrize("input,expected", [(1, 2), (3, 4)])  # Параметризация
def test_example(input, expected, global_data):
    assert input + 1 == expected

7. Кастомные аннотации

В сложных проектах мы создаём собственные аннотации для унификации повторяющихся конфигураций.

import io.qameta.allure.Epic;
import io.qameta.allure.Feature;

@Epic("Авторизация") // Аннотации для Allure-отчётности
@Feature("Логин")
public class LoginTest {

    @Test
    @AllureId("TEST-123") // Связь с тикетом
    @Description("Проверка ввода валидных данных")
    void validLoginTest() { }
}

Резюме по использованию

  • Жизненный цикл: @BeforeAll, @BeforeEach, @AfterEach, @AfterAll (JUnit), @BeforeMethod, @AfterMethod (TestNG).
  • Маркировка и фильтрация: @Tag (JUnit), @Test(groups = {...}) (TestNG), @pytest.mark (pytest).
  • Параметризация: @ParameterizedTest с провайдерами (@CsvSource, @ValueSource).
  • Зависимости и порядок: @Test(dependsOnMethods, priority) в TestNG.
  • Отчётность и метаданные: @DisplayName, @Description, аннотации Allure.
  • Интеграция: Аннотации Spring (@SpringBootTest), Selenium (часто через кастомные врапперы).

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

Какие аннотации использовал для автотестов? | PrepBro