Каждый тест должен сам создавать свои данные и получать чистое состояние приложения/БД. Session-scoped клиент не должен неявно связывать test_create_order и test_order_isolated.
Изоляция тестов создания заказа и состояния БД
Каждый тест должен сам создавать свои данные и получать чистое состояние приложения/БД. Session-scoped клиент не должен неявно связывать test_create_order и test_order_isolated.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Практическое задание
Исправь тестовый набор так, чтобы тесты не зависели от порядка запуска и реально проверяли изоляцию данных. Объясни, какие границы жизненного цикла приложения и базы данных ты выбрал бы для юнит- и интеграционных тестов.
import pytest
@pytest.fixture(scope="session") def client(): app = create_app() return TestClient(app)
def test_create_order(client): response = client.post("/orders", json={"sku": "A1"}) assert response.status_code == 201
def test_order_isolated(client):
Ответ
Каждый тест должен сам создавать свои данные и получать чистое состояние приложения/БД. Session-scoped клиент не должен неявно связывать test_create_order и test_order_isolated.
Для unit-тестов достаточно новых объектов и fake-репозиториев без БД. Для интеграционных тестов поднимите изолированную тестовую БД и восстанавливайте состояние на каждый тест; приложение запускайте с её настройками до создания клиента.
@pytest.fixture
def client(clean_test_database):
app = create_app()
with TestClient(app) as client:
yield client
clean_test_database здесь обозначает реализуемую fixture очистки, не готовый встроенный API. Тест изоляции должен сначала проверить пустое хранилище, создать собственный заказ и убедиться, что чужих записей нет. Rollback работает только если код запроса использует охваченное им соединение/транзакцию.