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

Что такое Hooks в Cucumber?

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

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

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

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

Что такое Hooks в Cucumber?

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

Главная цель хуков — разделить логику теста и логику его настройки/завершения, что делает сценарии чище, читабельнее и соответствует принципу DRY (Don't Repeat Yourself).

Типы хуков и их назначение

Cucumber (в связке с такими фреймворками, как JUnit, TestNG, и языками, как Java) поддерживает следующие основные типы хуков:

1. @Before и @After

Это наиболее часто используемые хуки. Они выполняются для каждого сценария (Scenario).

  • @Before — код выполняется перед каждым сценарием. Идеально подходит для:
    *   Инициализации веб-драйвера (Selenium WebDriver).
    *   Подключения к базе данных.
    *   Создания тестовых данных.
    *   Очистки кэшей или cookies.

  • @After — код выполняется после каждого сценария, даже если сценарий упал. Используется для:
    *   Закрытия браузера и завершения работы драйвера.
    *   Отключения от БД.
    *   Удаления тестовых данных, созданных во время выполнения.
    *   Снятия скриншотов при падении теста.

import io.cucumber.java.After;
import io.cucumber.java.Before;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class Hooks {
    private WebDriver driver;

    @Before(order = 1)
    public void setUp() {
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
    }

    @After(order = 1)
    public void tearDown() {
        if (driver != null) {
            driver.quit();
        }
    }
}

2. @BeforeStep и @AfterStep

Эти хуки выполняются до и после каждого шага (Step) внутри сценария.

  • @BeforeStep — полезен для логирования начала выполнения шага или подготовки контекста для конкретного шага.
  • @AfterStep — часто используется для снятия скриншотов после каждого шага (создание детального визуального лога) или для валидации промежуточного состояния приложения.
import io.cucumber.java.AfterStep;
import io.cucumber.java.BeforeStep;
import io.cucumber.java.Scenario;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;

public class StepHooks {

    @BeforeStep
    public void beforeStep(Scenario scenario) {
        System.out.println("Starting step: " + scenario.getStepStatus());
    }

    @AfterStep
    public void afterStep(Scenario scenario, WebDriver driver) {
        if (scenario.isFailed()) {
            // Делаем скриншот после каждого шага, если он упал
            final byte[] screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
            scenario.attach(screenshot, "image/png", "screenshot");
        }
    }
}

3. Условные хуки (Tagged Hooks)

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

import io.cucumber.java.Before;

public class ConditionalHooks {

    @Before("@ui or @e2e")
    public void setupForUITests() {
        System.out.println("Запускаем полную настройку для UI-тестов...");
        // Инициализация сложного UI-окружения
    }

    @Before("@api")
    public void setupForApiTests() {
        System.out.println("Запускаем быструю настройку для API-тестов...");
        // Настройка REST-клиента, без запуска браузера
    }

    @After("@cleanup_database")
    public void cleanDatabase() {
        System.out.println("Особая очистка БД для помеченных сценариев...");
        // Специфичная очистка тестовых данных
    }
}

4. Порядок выполнения (Order)

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

@Before(order = 10)
public void initLogger() {
    // Инициализация системы логирования (выполнится первым среди @Before)
}

@Before(order = 20)
public void initDriver() {
    // Инициализация драйвера (выполнится вторым)
}

@After(order = 20)
public void closeDriver() {
    // Закрытие драйвера (выполнится первым среди @After)
}

@After(order = 10)
public void finalizeLogs() {
    // Финализация логов (выполнится последним)
}

Контекст (Scenario) в хуках

Объект Scenario часто передается в хук в качестве параметра. Он предоставляет метаинформацию о текущем выполняемом сценарии: его имя, статус (пройден/упал), список шагов. Это особенно полезно в @After хуках для условной логики (например, делать скриншот только при падении).

Практическая польза в автоматизации

  • Управление состоянием: Гарантированное создание и очистка изолированного тестового окружения для каждого сценария, что предотвращает взаимовлияние тестов.
  • Повышение надежности: Корректное освобождение ресурсов (драйвер, соединения) даже при аварийном завершении теста.
  • Гибкость: Возможность тонкой настройки пре- и пост-условий для отдельных групп тестов через теги.
  • Логирование и отчетность: Удобное место для встраивания скриншотов, логирования и сбора диагностической информации.

Таким образом, Hooks в Cucumber — это фундаментальный инструмент для управления жизненным циклом сценария, который позволяет создавать стабильные, поддерживаемые и хорошо структурированные автотесты, отделяя техническую инфраструктуру от бизнес-логики, описанной в шагах.

Что такое Hooks в Cucumber? | PrepBro