Как в pytest автоматически выполнять код до и после каждого теста

Ответ

Для автоматического выполнения кода до и после каждого теста в 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-объектов.
  • Конфигурация окружения: Установка переменных окружения или глобальных настроек для тестов.