⚖️ Старый 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