⚖️ Старый vs Новый: Allure Framework
⚡ Суть: с Allure vs без Allure
- Без Allure: pytest падает с AssertionError — непонятно, где именно и с какими данными
- С Allure: отчёт показывает дерево шагов, какой шаг упал, с какими параметрами
- Разметка на методах (из лекции) вместо
with allure.stepв каждом тесте — современная практика
Сравнение 1: Тест без шагов vs тест с шагами
Из лекции (без шагов)
# tests/test_companies.py
# Из лекции: тест без разбивки на шаги
def test_get_companies():
api_result = api.get_company_list()
db_result = db.get_companies()
assert len(api_result) == len(db_result)
# При ошибке в отчёте будет только:
# AssertionError — и ничего больше
Современный подход (с шагами)
# tests/test_companies.py
# Современно: шаги дают понять, где упало
def test_get_companies():
with allure.step("Получить список через API"):
api_result = api.get_company_list()
with allure.step("Получить список из БД"):
db_result = db.get_companies()
with allure.step("Сравнить размеры"):
assert len(api_result) == len(db_result)
# В отчёте будет видно: упал шаг "Получить список из БД"
Сравнение 2: Шаги дублируются vs шаги на методах
Из лекции (ранний этап — дублирование)
# tests/test_x_clients_db.py
# До оптимизации: with allure.step дублируется в каждом тесте
def test_get_companies():
with allure.step("Получить список через API"):
api_result = api.get_company_list()
with allure.step("Получить список из БД"):
db_result = db.get_companies()
...
def test_add_new():
with allure.step("Получить список через API"): # снова то же самое
body = api.get_company_list()
...
Оптимизированный подход (из лекции)
# api/company_api.py
# Декорировать метод — шаг появится при каждом вызове автоматически
@allure.step("api. Получить список компаний")
def get_company_list(self, params_to_add=None):
...
# tests/test_x_clients_db.py
# Тесты становятся чище — нет дублирования
def test_get_companies():
api_result = api.get_company_list() # → шаг в отчёте автоматически
db_result = db.get_companies() # → шаг в отчёте автоматически
assert len(api_result) == len(db_result)
Сравнение 3: Шаги без параметров vs с параметрами
Из лекции (ранний вариант)
# db/company_table.py
# Шаг без динамических параметров — неинформативно
@allure.step("БД. Удалить организацию")
def delete(self, id):
...
# В отчёте: "БД. Удалить организацию" — не видно, какой именно id
Современный подход (из лекции — финальный)
# db/company_table.py
# Параметр {id} подставляется автоматически из аргумента метода
@allure.step("БД. Удалить организацию по {id}")
def delete(self, id):
...
# В отчёте: "БД. Удалить организацию по 42" — всё ясно!
Сравнение 4: Тесты без разметки vs с декораторами
Из лекции (без разметки)
# tests/test_companies.py
# Без Allure-декораторов — тесты в отчёте
# сгруппированы только по файлу/классу,
# никакой дополнительной информации
class CompanyTest:
def test_get_companies(self): ...
def test_add_new(self): ...
def test_get_one_company(self): ...
Современный подход (с разметкой)
# tests/test_x_clients_db.py
# С Allure-декораторами — иерархия в отчёте:
# Epic → Feature → Story → Test
@allure.epic("компании")
@allure.severity("blocker")
class CompanyTest:
@allure.story("Получение списка компаний")
@allure.feature("READ")
@allure.title("Получение полного списка организаций")
def test_get_companies(self): ...
@allure.story("Создание компаний")
@allure.feature("CREATE")
@allure.title("Создание организации")
def test_add_new(self): ...
Сравнение 5: Генерация отчёта вручную vs скриптом
Ручной запуск (базовый)
# Каждый раз вручную — три команды:
pytest --alluredir=allure-results
allure generate allure-results -o allure-report --clean
allure open allure-report
Автоматизация через скрипт (из лекции)
# run.ps1 (Windows/PowerShell)
$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