🏠 Домашнее задание: Allure Framework

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

ℹ️ Это не LMS-ДЗ — для урока 15 в LMS отдельного домашнего задания нет. Данный раздел содержит закрепляющую самопроверку: практическое задание для самостоятельного выполнения, которое поможет проверить усвоение материала урока.

⚡ Задание: добавить Allure к проекту API-тестов

  1. Взять проект из урока 13 (CompanyApi + EmployeeApi + pytest-тесты)
  2. Добавить @allure.epic/feature/story/title/severity к тестам
  3. Добавить @allure.step на методы API-класса (с параметрами в строке)
  4. В одном тесте добавить вложение (JSON-ответ или SQL-запрос)
  5. Запустить pytest --alluredir=allure-resultsallure serve allure-results

Задание: добавить Allure-отчётность к проекту API-тестов

Что нужно сделать

Возьмите проект с API-тестами, созданный в уроке 13 (или напишите новый), и добавьте к нему полноценную Allure-отчётность.

Требования к выполнению

  1. Разметка тестов: добавить к каждому тесту декораторы:
    • @allure.epic — на уровне класса (напр. «API X-Clients»)
    • @allure.severity — на уровне класса
    • @allure.feature + @allure.story + @allure.title — на уровне метода
  2. @allure.step на API-методах: декорировать все методы класса CompanyApiEmployeeApi если есть) декоратором @allure.step с динамическими параметрами.
  3. Вложения: в хотя бы одном тесте добавить вложение с содержимым ответа API (например, JSON-тело ответа).
  4. Вложенные шаги: тест на создание сущности (CRUD) разбить на вложенные шаги: ДО → Создать (с подшагами) → Проверить → ПОСЛЕ → Удалить.

Подготовка окружения

Создание и активация виртуального окружения

# PowerShell, Windows
cd путь\к\проекту

# Создать виртуальное окружение
python -m venv venv

# Активировать
.\venv\Scripts\Activate.ps1

# Установить зависимости
pip install pytest allure-pytest requests

Установка Allure CLI

# Windows (Scoop)
scoop install allure

# Проверить установку
allure --version

Структура проекта

api-tests-allure/
├── venv/
├── api/
│   ├── __init__.py
│   └── company_api.py        # CompanyApi с @allure.step
├── tests/
│   ├── __init__.py
│   └── test_companies.py     # Тесты с разметкой Allure
├── allure-results/           # Создаётся автоматически
├── allure-report/            # Создаётся при generate
├── run.ps1                   # Скрипт автозапуска
└── requirements.txt

requirements.txt

# requirements.txt
pytest
allure-pytest
requests

Пошаговое решение

Шаг 1 — Добавить @allure.step на методы API-клиента

# api/company_api.py
import allure
import requests

class CompanyApi:

    def __init__(self, url):
        self.url = url

    @allure.step("api. Получить список компаний")
    def get_company_list(self, params_to_add=None):
        response = requests.get(self.url + "/company", params=params_to_add)
        return response.json()

    @allure.step("api. Получить компанию по id '{id}'")
    def get_company(self, id):
        response = requests.get(self.url + "/company/" + str(id))
        return response.json()

    @allure.step("api. Создать компанию '{name}'")
    def create_company(self, name, description=""):
        token = self._get_token()
        headers = {"x-client-token": token}
        body = {"name": name, "description": description}
        response = requests.post(self.url + "/company",
                                 headers=headers, json=body)
        return response.json()

    @allure.step("api. Удалить компанию '{id}'")
    def delete_company(self, id):
        token = self._get_token()
        headers = {"x-client-token": token}
        response = requests.delete(self.url + "/company/" + str(id),
                                   headers=headers)
        return response.json()

    def _get_token(self):
        creds = {"user": "raphael", "password": "cool-but-crude"}
        response = requests.post(self.url + "/auth/login", json=creds)
        return response.json()["userToken"]

Шаг 2 — Добавить разметку к тестам

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

@allure.epic("API X-Clients")
@allure.severity("blocker")
class TestCompanies:

    BASE_URL = "https://x-clients-be.onrender.com"
    api = CompanyApi(BASE_URL)

    @allure.story("Получение компаний")
    @allure.feature("READ")
    @allure.title("Получение полного списка компаний")
    def test_get_companies(self):
        result = self.api.get_company_list()
        # Вложение: JSON-ответ
        allure.attach(
            json.dumps(result, ensure_ascii=False, indent=2),
            name="JSON-ответ API",
            attachment_type=allure.attachment_type.JSON
        )
        assert isinstance(result, 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.get("isActive") for c in result)

    @allure.story("Создание компании")
    @allure.feature("CREATE")
    @allure.title("Создание новой компании и проверка данных")
    def test_create_company(self):
        with allure.step("Получить количество компаний ДО"):
            before = self.api.get_company_list()
            count_before = len(before)

        with allure.step("Создать компанию"):
            with allure.step("Сгенерировать данные"):
                name  = "AllureTest Company"
                descr = "Created by Allure test"
            with allure.step("Вызвать API-метод создания"):
                result = self.api.create_company(name, descr)
                new_id = result["id"]

        with allure.step("Проверить поля созданной компании"):
            company = self.api.get_company(new_id)
            assert company["name"]        == name
            assert company["description"] == descr

        with allure.step("Получить количество компаний ПОСЛЕ"):
            after       = self.api.get_company_list()
            count_after = len(after)

        with allure.step("Проверить, что количество увеличилось на 1"):
            assert count_after - count_before == 1

        with allure.step("Удалить тестовую компанию"):
            self.api.delete_company(new_id)

Шаг 3 — Запустить тесты

# PowerShell
cd путь\к\проекту
.\venv\Scripts\Activate.ps1
pytest tests\ --alluredir=allure-results -v

Шаг 4 — Открыть отчёт

allure serve allure-results

Должен открыться браузер с интерактивным отчётом. Проверьте наличие:

  • Иерархии Epic → Feature → Story → Test
  • Шагов в разделе «Test body»
  • Вложения с JSON-ответом в тесте test_get_companies
  • Вложенных шагов в тесте test_create_company

Проверка в VS Code

Запуск через терминал

# Открыть терминал в VS Code: Ctrl+` (backtick)
.\venv\Scripts\Activate.ps1
pytest tests\ --alluredir=allure-results -v
allure serve allure-results

Настройка launch.json (F5)

// .vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "pytest tests with Allure",
      "type": "debugpy",
      "request": "launch",
      "module": "pytest",
      "args": [
        "tests/",
        "--alluredir=allure-results",
        "-v"
      ],
      "console": "integratedTerminal",
      "justMyCode": true
    }
  ]
}

Точки останова

Установите точку останова в методе create_company (F9 на нужной строке). При запуске через F5 выполнение остановится — можно проверить значения переменных в панели Variables.

Связь с теорией и примерами