Ответ
В 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— для гибкости. Можешь потом, по ходу дела, поменять заголовок шага или описание, если что-то пошло не по плану. Хитро, да?