Ответ
В Pytest декораторы — это ключевой механизм для настройки и управления поведением тестовых функций, классов и фикстур. Они позволяют добавлять метаданные и логику, не загрязняя сам тестовый код.
Основные встроенные декораторы и их назначение:
-
@pytest.mark— для маркировки тестов:@pytest.mark.skip— пропустить тест.@pytest.mark.skipif— пропустить при выполнении условия.@pytest.mark.parametrize— запустить тест с разными наборами данных.@pytest.mark.xfail— отметить, что тест ожидаемо падает.- Пользовательские маркеры (например,
@pytest.mark.slow,@pytest.mark.api) для группировки и выборочного запуска.
-
@pytest.fixture— для создания фикстур:- Фикстуры предоставляют данные, состояние или ресурсы для тестов (например, подключение к БД, тестовый клиент API).
-
@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 делают тесты более декларативными, удобочитаемыми и легко поддерживаемыми.