Изоляция тестов создания заказа и состояния БД

Каждый тест должен сам создавать свои данные и получать чистое состояние приложения/БД. 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 работает только если код запроса использует охваченное им соединение/транзакцию.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее