Для чего нужен декоратор в Pytest?

«Для чего нужен декоратор в Pytest?» — вопрос из категории Фреймворки тестирования, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Pytest декораторы — это ключевой механизм для настройки и управления поведением тестовых функций, классов и фикстур. Они позволяют добавлять метаданные и логику, не загрязняя сам тестовый код.

Основные встроенные декораторы и их назначение:

  1. @pytest.mark — для маркировки тестов:

    • @pytest.mark.skip — пропустить тест.
    • @pytest.mark.skipif — пропустить при выполнении условия.
    • @pytest.mark.parametrize — запустить тест с разными наборами данных.
    • @pytest.mark.xfail — отметить, что тест ожидаемо падает.
    • Пользовательские маркеры (например, @pytest.mark.slow, @pytest.mark.api) для группировки и выборочного запуска.
  2. @pytest.fixture — для создания фикстур:

    • Фикстуры предоставляют данные, состояние или ресурсы для тестов (например, подключение к БД, тестовый клиент API).
  3. @pytest.hookimpl — для написания плагинов:

    • Позволяет перехватывать и модифицировать внутренние события Pytest (например, логирование, обработка результатов).

Практический пример с параметризацией и фикстурой:

import pytest

@pytest.fixture
def database_connection():
    # Имитация установки соединения с БД
    conn = {"status": "connected"}
    yield conn  # Возвращаем ресурс тесту
    # Закрытие соединения после теста (код после yield)
    conn["status"] = "closed"
    print("Соединение закрыто")

@pytest.mark.parametrize("user_id, user_name", [
    (1, "Alice"),
    (2, "Bob"),
])
def test_user_exists(database_connection, user_id, user_name):
    # Тест использует и фикстуру, и параметризацию
    assert database_connection["status"] == "connected"
    # Имитация запроса к БД
    mock_db = {1: "Alice", 2: "Bob"}
    assert mock_db[user_id] == user_name

Декораторы в Pytest делают тесты более декларативными, удобочитаемыми и легко поддерживаемыми.