Ответ
Для автоматического выполнения кода до и после каждого теста в pytest используется фикстура с параметром autouse=True. Это позволяет инкапсулировать логику подготовки (setup) и очистки (teardown) без явного указания фикстуры в аргументах теста.
Код до инструкции yield выполняется перед тестом (setup), а код после yield — после его завершения (teardown).
Пример: Очистка тестовой таблицы в базе данных перед каждым тестом.
import pytest
# Условный объект для работы с БД
class Database:
def clear_users_table(self):
print("n[SETUP] Clearing users table...")
def close_connection(self):
print("[TEARDOWN] Closing connection...")
db = Database()
@pytest.fixture(scope="function", autouse=True)
def db_cleanup():
# Код до yield - подготовка
db.clear_users_table()
yield
# Код после yield - очистка
db.close_connection()
def test_user_creation():
print("Running test_user_creation...")
assert True
def test_user_deletion():
print("Running test_user_deletion...")
assert True
Когда это полезно:
- Управление ресурсами: Подключение и отключение от баз данных, запуск/остановка Docker-контейнеров.
- Очистка состояния: Удаление временных файлов, сброс таблиц в БД, очистка
mock-объектов. - Конфигурация окружения: Установка переменных окружения или глобальных настроек для тестов.