✅ Решения: Allure Framework

← К оглавлению урока

⚡ Ключевые ответы

  • Allure — инструмент генерации интерактивных HTML-отчётов для автотестов. Нужен для визуализации результатов, диагностики ошибок и группировки тестов.
  • Декораторы: @allure.step, @allure.severity, @allure.feature, @allure.story, @allure.epic, @allure.title, @allure.id
  • Вложения: allure.attach(content, name="...", attachment_type=allure.attachment_type.TEXT)

Задание 1 — Что такое Allure?

Allure Framework — инструмент с открытым исходным кодом для генерации интерактивных и наглядных HTML-отчётов по результатам автотестов. Интегрируется с pytest через пакет allure-pytest. Нужен для: визуализации результатов тестов, диагностики ошибок (видно, на каком шаге упал тест), группировки тестов по фичам/эпикам/сторям, прикрепления вложений (скриншоты, SQL-запросы, логи).

Задание 2 — Основные возможности

  1. Визуализация результатов: интерактивные диаграммы, графики, цветовая индикация статусов.
  2. Детализация: просмотр логов, скриншотов, вложений; описание шагов выполнения теста.
  3. Категоризация и маркировка: группировка тестов по эпикам, фичам, историям.
  4. История запусков: сравнение результатов текущего и предыдущих запусков, динамика изменений.

Задание 3 — Декораторы Allure

ДекораторНазначение
@allure.id("ITCH-1")Уникальный ID для навигации в коде (не отображается в отчёте)
@allure.epic("...")Принадлежность к проекту/модулю верхнего уровня
@allure.feature("READ")Функциональная область (тип операции)
@allure.story("...")Пользовательская история
@allure.title("...")Название теста в отчёте
@allure.description("...")Подробное описание теста
@allure.severity("blocker")Уровень критичности: blocker, critical, normal, minor, trivial
@allure.step("...")Пометить метод как шаг (автоматически появляется в отчёте)

Задание 4 — Добавить вложения

Для добавления вложений используется метод allure.attach():

allure.attach(content, name="Заголовок", attachment_type=allure.attachment_type.TEXT)
  • content — содержимое вложения (строка, байты)
  • name — заголовок, который будет показан в отчёте
  • attachment_type — тип: TEXT, PNG, JSON, HTML

Пример с SQL-запросом:

# db/company_table.py
@allure.step("БД. Запросить список организаций")
def get_companies(self):
    query = self.__db.execute(self.__scripts["select"])
    allure.attach(str(query.context.cursor.query),
                  "SQL-запрос на получение списка компаний",
                  allure.attachment_type.TEXT)
    return query.fetchall()

Задание 5 — Автоматизация запуска

# Последовательность команд:
# 1. Запустить тесты
pytest --alluredir=allure-results

# 2. Сгенерировать HTML-отчёт
allure generate allure-results -o allure-report --clean

# 3. Открыть отчёт
allure open allure-report

Задание 6 — Разметка класса тестов

# tests/test_companies.py
import allure
from api.company_api import CompanyApi

@allure.epic("компании")
@allure.severity("blocker")
class CompanyTest:
    api = CompanyApi("https://x-clients-be.onrender.com")

    @allure.story("Получение списка компаний")
    @allure.feature("READ")
    @allure.title("Получение полного списка организаций")
    def test_get_companies(self):
        result = self.api.get_company_list()
        assert len(result) > 0

    @allure.story("Получение списка компаний")
    @allure.feature("READ")
    @allure.title("Получение списка активных организаций")
    def test_get_active_companies(self):
        result = self.api.get_company_list(params_to_add={"active": True})
        assert all(c["isActive"] for c in result)

    @allure.story("Создание компаний")
    @allure.feature("CREATE")
    @allure.title("Создание организации")
    def test_add_new(self):
        result = self.api.create_company("TestCompany")
        assert result["name"] == "TestCompany"

Задание 7 — Вложенные шаги в test_add_new

# tests/test_x_clients_db.py
@allure.title("Создание организации")
def test_add_new(self):
    with allure.step("Получить количество организаций ДО"):
        body       = self.api.get_company_list()
        len_before = len(body)

    with allure.step("Создать организацию"):
        with allure.step("Сгенерировать название"):
            name  = "Autotest"
            descr = "Autotest description"
        with allure.step("Вызвать API-метод для создания"):
            result = self.api.create_company(name, descr)
            new_id = result["id"]

    with allure.step("Проверить поля новой организации"):
        body  = self.api.get_company_list()
        found = next((c for c in body if c["id"] == new_id), None)
        assert found is not None
        assert found["name"] == name

    with allure.step("Получить количество организаций ПОСЛЕ"):
        body      = self.api.get_company_list()
        len_after = len(body)

    with allure.step("Проверить, что список ДО меньше ПОСЛЕ на 1"):
        assert len_after - len_before == 1

Задание 8 — @allure.step с параметрами на методах

# api/company_api.py
import allure

class CompanyApi:

    @allure.step("api. Получить компанию по id '{id}'")
    def get_company(self, id):
        ...

    @allure.step("api. Создать компанию '{name}' ({description})")
    def create_company(self, name, description=""):
        ...

    @allure.step("api. Удалить компанию '{id}'")
    def delete(self, id):
        ...

Allure автоматически подставит значения id, name, description в строку шага при каждом вызове метода.

Задание 9 — Вложение SQL-запроса

# db/company_table.py
import allure

@allure.step("БД. Запросить список организаций")
def get_companies(self):
    query = self.__db.execute(self.__scripts["select"])
    allure.attach(
        str(query.context.cursor.query),
        "SQL-запрос на получение списка компаний",
        allure.attachment_type.TEXT
    )
    return query.fetchall()

Задание 10 — PowerShell-скрипт

# run.ps1
$results = "allure-results"
$report  = "allure-report"

# Очистить предыдущие данные
if (Test-Path $results) { Remove-Item -Recurse -Force $results }
if (Test-Path $report)  { Remove-Item -Recurse -Force $report  }

# Запустить тесты
pytest --alluredir=$results

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

# Открыть отчёт в браузере
allure open $report

Запуск: .\run.ps1