✅ Решения: 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 — Основные возможности
- Визуализация результатов: интерактивные диаграммы, графики, цветовая индикация статусов.
- Детализация: просмотр логов, скриншотов, вложений; описание шагов выполнения теста.
- Категоризация и маркировка: группировка тестов по эпикам, фичам, историям.
- История запусков: сравнение результатов текущего и предыдущих запусков, динамика изменений.
Задание 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