Что такое Allure?

Allure — это open-source фреймворк отчётности, превращающий сырые результаты тестов в богатые интерактивные HTML-отчёты. В то время как большинство фреймворков дают базовые подсчёты pass/fail, Allure создаёт детальные отчёты с шагами тестов, скриншотами, сетевыми логами, таймлайнами выполнения, историческими трендами и категоризированными падениями.

Allure интегрируется практически со всеми основными тест-фреймворками: JUnit, TestNG, Pytest, Jest, Mocha, Playwright, Cypress и другими. Он работает в два этапа: сначала тесты генерируют файлы результатов Allure при выполнении; затем CLI Allure генерирует HTML-отчёт из этих файлов.

Зачем использовать Allure?

Стандартные отчёты отвечают на один вопрос: сколько тестов прошло? Allure отвечает на многие:

  • Что именно сделал каждый тест? Пошаговое выполнение со скриншотами
  • Почему он упал? Категоризированные падения со стек-трейсами и вложенными доказательствами
  • Это новое падение или известная проблема? Исторические тренды и обнаружение нестабильных тестов
  • Какие функции затронуты? Тесты организованы по feature, story и серьёзности

Настройка Allure

Установка

# macOS
brew install allure

# npm (кроссплатформенный)
npm install -g allure-commandline

Java (JUnit 5 + Maven)

<dependency>
    <groupId>io.qameta.allure</groupId>
    <artifactId>allure-junit5</artifactId>
    <version>2.25.0</version>
    <scope>test</scope>
</dependency>

Python (Pytest)

pip install allure-pytest
pytest --alluredir=allure-results

Аннотации Allure

Шаги

@Test
@Description("Проверить логин с валидными учётными данными")
@Severity(SeverityLevel.CRITICAL)
@Feature("Аутентификация")
@Story("Логин")
public void testSuccessfulLogin() {
    openLoginPage();
    enterCredentials("admin@example.com", "password123");
    clickLoginButton();
    verifyDashboardDisplayed();
}

@Step("Открыть страницу логина")
public void openLoginPage() {
    driver.get(baseUrl + "/login");
}

@Step("Ввести учётные данные: {email}")
public void enterCredentials(String email, String password) {
    driver.findElement(By.id("email")).sendKeys(email);
    driver.findElement(By.id("password")).sendKeys(password);
}

Вложения

@Attachment(value = "Скриншот", type = "image/png")
public byte[] takeScreenshot() {
    return ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
}

Серьёзность и метки

@Severity(SeverityLevel.BLOCKER)
@Feature("Корзина покупок")
@Story("Добавить в корзину")
@Epic("E-Commerce")
@Owner("qa-team")
@Link(name = "JIRA-1234", url = "https://jira.example.com/JIRA-1234")

Генерация отчётов

# Сгенерировать и открыть отчёт
allure serve allure-results

# Сгенерировать отчёт в директорию
allure generate allure-results -o allure-report --clean

Разделы отчёта

Главный дашборд

  • Подсчёты Pass/Fail/Broken/Skipped и проценты
  • Разбивка по серьёзности всех тестов
  • Покрытие функций
  • Тренд длительности выполнения тестов
  • Категории сгруппированных причин падений

Представления Suites и Behaviors

  • Suites: Тесты по классам и пакетам (техническое представление)
  • Behaviors: Тесты по Epic > Feature > Story (бизнес-представление)

Конфигурация категорий

[
  {
    "name": "Дефекты продукта",
    "matchedStatuses": ["failed"],
    "messageRegex": ".*AssertionError.*"
  },
  {
    "name": "Проблемы инфраструктуры",
    "matchedStatuses": ["broken"],
    "messageRegex": ".*TimeoutException.*|.*ConnectionRefused.*"
  }
]

Allure в CI/CD

- name: Запуск тестов
  run: mvn test
  continue-on-error: true

- name: Генерация отчёта Allure
  uses: simple-elf/allure-report-action@master
  with:
    allure_results: target/allure-results

Пример на Python (Pytest)

import allure

@allure.feature("Аутентификация")
@allure.story("Логин")
@allure.severity(allure.severity_level.CRITICAL)
def test_successful_login(page):
    with allure.step("Открыть страницу логина"):
        page.goto("/login")

    with allure.step("Ввести учётные данные"):
        page.fill("#email", "admin@example.com")
        page.fill("#password", "password123")

    with allure.step("Отправить форму"):
        page.click("#submit")

    with allure.step("Проверить дашборд"):
        assert page.text_content(".welcome") == "Welcome, Admin"
        allure.attach(page.screenshot(), name="Скриншот", attachment_type=allure.attachment_type.PNG)

Упражнения

Упражнение 1: Настройка Allure

Добавьте зависимости Allure в существующий проект, аннотируйте 5 тестов с @Step, @Feature, @Story и @Severity, сгенерируйте отчёт и изучите каждый раздел.

Упражнение 2: Категории и история

Создайте файл categories.json, запустите тесты дважды с историей для графиков трендов, определите самый долгий тест через Timeline.

Упражнение 3: Интеграция CI/CD

Добавьте генерацию отчётов Allure в CI-пайплайн, настройте отслеживание исторических трендов, настройте публикацию отчётов доступных по URL.