Как использовать контекстные менеджеры и шаги (steps) в Allure для структурирования отчетов?

Ответ

В Allure контекстные менеджеры (через декоратор @allure.step или allure.dynamic) и методы для аттачей — это ключевые инструменты для создания структурированных, читаемых и информативных отчетов о выполнении тестов.

1. Логирование шагов теста (@allure.step): Декоратор помечает метод как шаг. Все вызовы этого метода и его аргументы будут отражены в отчете Allure, создавая детальный сценарий.

import allure
import pytest

def login(username, password):
    # Логика авторизации
    return True

@allure.step("Авторизация пользователя {username}")  # Аргументы можно подставлять в описание
def perform_login(username, password):
    result = login(username, password)
    assert result is True, "Ошибка авторизации"
    allure.attach(f"User {username} logged in successfully", name="Login Info", attachment_type=allure.attachment_type.TEXT)

@allure.step("Добавление товара '{item_name}' в корзину")
def add_item_to_cart(item_name):
    # Логика добавления товара
    pass

@allure.title("Тест: Полный процесс покупки")
def test_complete_purchase():
    perform_login("test_user", "password123")  # Этот шаг будет развернут в отчете
    add_item_to_cart("Laptop")
    add_item_to_cart("Mouse")
    # ... другие шаги

2. Динамическое создание шагов и контекстные менеджеры (with allure.step()): Полезно, когда шаг нужно создать внутри теста, особенно для циклов или условных блоков.

def test_dynamic_steps():
    items_to_check = ["Home", "Products", "About"]

    for item in items_to_check:
        with allure.step(f"Проверка навигации на страницу '{item}'"):
            # Код для перехода и проверки
            allure.attach(f"Проверка элемента {item} прошла успешно", name="Check Result", attachment_type=allure.attachment_type.TEXT)
            if item == "Products":
                with allure.step("Внутри шага: Проверка фильтров товаров"):
                    # Вложенные шаги создают древовидную структуру в отчете
                    pass

3. Добавление вложений (аттачей): Критически важно для отладки. Можно прикреплять скриншоты, логи, HTML-дамп страницы, текстовые данные.

from selenium import webdriver

def test_with_attachments():
    driver = webdriver.Chrome()
    driver.get("https://example.com")

    # 1. Текстовый аттач (логи, ответы API)
    response_data = "{'status': 'ok', 'id': 123}"
    allure.attach(response_data, name="API Response", attachment_type=allure.attachment_type.JSON)

    # 2. Скриншот
    screenshot = driver.get_screenshot_as_png()
    allure.attach(screenshot, name="Page Screenshot", attachment_type=allure.attachment_type.PNG)

    # 3. HTML-код страницы
    page_html = driver.page_source
    allure.attach(page_html, name="Page HTML", attachment_type=allure.attachment_type.HTML)

Практические советы:

  • Именуйте шаги осмысленно: Описание должно сразу давать понять, что проверяется.
  • Используйте вложения для неудачных шагов: В pytest это удобно делать через хуки или перехват исключений.
  • Комбинируйте с allure.dynamic: Можно динамически менять название или описание уже созданного шага на основе результатов его выполнения.

Ответ 18+ 🔞

А, ну ты глянь, какие у нас тут инструменты для красивого отчёта в Allure! Это ж не просто так, блядь, чтоб глаза мозолило, а чтобы любой, кто откроет, сразу понял — где накосячило, что происходило и почему всё пошло по пизде. Слушай сюда, разжую.

1. Шаги теста, которые как слоёный пирог (@allure.step): Вот берёшь обычный метод и вешаешь на него этот декоратор. Всё, теперь он не просто функция, а целый этап в отчёте, со всеми подробностями — что передали, что получили. Красота, ёпта!

import allure
import pytest

def login(username, password):
    # Тут твоя магия логина
    return True

@allure.step("Авторизация пользователя {username}")  # Смотри, имя юзера прямо в описание влепит!
def perform_login(username, password):
    result = login(username, password)
    assert result is True, "Ошибка авторизации"
    # А тут ещё и записочку в отчёт прилепим на память
    allure.attach(f"Юзер {username} залогинился", name="Login Info", attachment_type=allure.attachment_type.TEXT)

@allure.step("Добавление товара '{item_name}' в корзину")
def add_item_to_cart(item_name):
    # Кидаем товар в корзину
    pass

@allure.title("Тест: Полный процесс покупки")
def test_complete_purchase():
    perform_login("test_user", "password123")  # В отчёте будет развёрнутый шаг!
    add_item_to_cart("Ноутбук")
    add_item_to_cart("Мышь")
    # ... и дальше по списку

2. Шаги на лету, прямо в тесте (with allure.step()): А это для тех случаев, когда ты внутри цикла или условия, и заранее не знаешь, сколько этих шагов вылезет. Удобно, блядь, как карманы у бабушки.

def test_dynamic_steps():
    items_to_check = ["Главная", "Товары", "О нас"]

    for item in items_to_check:
        with allure.step(f"Проверяем навигацию на страницу '{item}'"):
            # Идём и кликаем
            allure.attach(f"Элемент {item} на месте", name="Check Result", attachment_type=allure.attachment_type.TEXT)
            if item == "Товары":
                with allure.step("Заходим глубже: проверяем фильтры"):
                    # А внутри шага ещё шаг! Дерево в отчёте — просто овердохуища!
                    pass

3. Прикрепляем доказательства, чтоб не быть голословным (аттачи): Это самое важное, ёбана! Тест упал, а почему? Скриншот где? Логи где? Ответ API, который кривой? Всё это надо прилепить к отчёту, чтоб не гадать на кофейной гуще.

from selenium import webdriver

def test_with_attachments():
    driver = webdriver.Chrome()
    driver.get("https://example.com")

    # 1. Текстовый файлик (логи, JSON от API)
    response_data = "{'status': 'ok', 'id': 123}"
    allure.attach(response_data, name="Ответ от API", attachment_type=allure.attachment_type.JSON)

    # 2. Скриншот, чтоб видеть, что там упало
    screenshot = driver.get_screenshot_as_png()
    allure.attach(screenshot, name="Скриншот страницы", attachment_type=allure.attachment_type.PNG)

    # 3. HTML страницы, вдруг там чертовщина в разметке
    page_html = driver.page_source
    allure.attach(page_html, name="HTML страницы", attachment_type=allure.attachment_type.HTML)

А теперь, блядь, главные правила, чтоб не быть мудаком:

  • Названия шагов — чтобы понятно было. Не пиши "шаг 1", а пиши "Кликаем на эту ебучую кнопку 'Купить'".
  • Вложения — особенно когда тест облажался. Настрой так, чтобы при падении автоматом летели скриншоты и логи. В pytest для этого есть хуки, не ленись.
  • allure.dynamic — для гибкости. Можешь потом, по ходу дела, поменять заголовок шага или описание, если что-то пошло не по плану. Хитро, да?