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

Что такое хуки в автотестах?

1.0 Junior🔥 172 комментариев
#Теория тестирования

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

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

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

Что такое хуки (Hooks) в автотестах

Хуки (Hooks) — это специальные функции или методы, которые позволяют выполнять определенный код автоматически в ключевые моменты жизненного цикла тестового сценария или тестового набора (suite). Их основная цель — инкапсуляция повторяющихся действий (настройка и очистка) и отделение тестовой логики от вспомогательного кода, что повышает читаемость, поддерживаемость и надежность тестов.

Основные типы хуков и их назначение

В большинстве современных фреймворков для автотестирования (таких как JUnit, TestNG, pytest, Cucumber, Playwright Test или Mocha) хуки решают схожие задачи, хотя их названия и синтаксис могут отличаться. Условно их можно разделить по времени выполнения:

  • Хуки, выполняемые ДО тестов:
    *   **На уровне всего набора (Suite):** Инициализация глобальных ресурсов (запуск Selenium Grid, подготовка базы данных, генерация тестовых данных).
    *   **На уровне группы/класса тестов:** Создание экземпляра браузера (`WebDriver`), авторизация в системе, открытие базового URL.
    *   **На уровне каждого теста (Method/Function):** Подготовка конкретного состояния приложения для теста (создание уникального пользователя, переход на нужную страницу).

  • Хуки, выполняемые ПОСЛЕ тестов:
    *   **На уровне каждого теста:** Зачистка после конкретного сценария (удаление созданных тестовых данных, выход из аккаунта, снятие скриншота или логирование в случае падения).
    *   **На уровне группы/класса:** Закрытие браузера, деактивация сессии.
    *   **На уровне всего набора:** Освобождение глобальных ресурсов (остановка серверов, очистка базы данных от тестовых артефактов).

Практические примеры в коде

Рассмотрим реализацию в популярных фреймворках.

Пример в pytest (Python)

Pytest использует декораторы для объявления хуков на уровне функций и фикстур.

import pytest
from selenium import webdriver

# Хук на уровне всей сессии (выполняется 1 раз)
def pytest_sessionstart(session):
    print("\n>>> Начало тестовой сессии. Запуск виртуальной БД...")

# Фикстура как аналог хуков setup/teardown для класса тестов
@pytest.fixture(scope="class")
def browser():
    # Аналог @BeforeClass / setUpClass
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://demo.opencart.com")
    yield driver  # Здесь выполняется сам тест
    # Аналог @AfterClass / tearDownClass
    driver.quit()
    print("Браузер закрыт.")

# Хуки перед и после каждого теста
@pytest.fixture(autouse=True)
def local_setup_teardown():
    # Аналог @Before / setUp
    print(f"\nЗапуск теста...")
    yield
    # Аналог @After / tearDown
    print(f"Завершение теста.\n")

class TestCart:
    # Фикстура browser будет вызвана один раз для всего класса
    def test_add_to_cart(self, browser):
        # Код теста использует готовый browser
        assert "Your Store" in browser.title

    def test_view_cart(self, browser):
        pass

# Хук на уровне окончания сессии
def pytest_sessionfinish(session, exitstatus):
    print(">>> Тестовая сессия завершена.")

Пример в JUnit 5 / TestNG (Java)

В JUnit 5 используются аннотации.

import org.junit.jupiter.api.*;

public class ExampleTest {

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

    @BeforeEach
    void setup() {
        System.out.println("Подготовка перед каждым тестом.");
    }

    @Test
    void firstTest() {
        System.out.println("Выполнение первого теста.");
        Assertions.assertTrue(true);
    }

    @AfterEach
    void tearDown() {
        System.out.println("Очистка после каждого теста.");
    }

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

Ключевые преимущества использования хуков

  1. Устранение дублирования кода (DRY принцип): Нет необходимости писать один и тот же код инициализации/очистки в начале и конце каждого теста.
  2. Повышение надежности: Гарантированное выполнение шагов очистки (например, закрытие браузера) даже если тест упал с ошибкой (AssertionError, Exception). Это предотвращает утечки ресурсов.
  3. Улучшение читаемости: Тестовый метод фокусируется только на шагах и проверках бизнес-сценария, а не на технических деталях окружения.
  4. Гибкость: Возможность настраивать scope (область видимости) хуков: для одного теста, для всего класса или для всего прогона.
  5. Централизованное управление: Легко изменить логику подготовки данных или формат логирования в одном месте, а не в сотнях тестов.

Распространенные сценарии применения

  • Инициализация и завершение работы драйвера (WebDriver) для UI-тестов.
  • Подключение и отключение от баз данных, API-клиентов.
  • Создание и удаление тестовых данных в системе (пользователи, заказы, документы).
  • Логирование времени выполнения тестов или факта их падения.
  • Создание скриншотов или сохранение HTML-снимка страницы при падении UI-теста.
  • Авторизация в приложении перед набором тестов.

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