Тесты против настоящей базы: контейнеры, изоляция прогонов и проверка миграций
Базу в тестах не мокают: смысл теста именно в том, что SQL, миграции, ограничения и индексы работают вместе. Рабочая схема — настоящая база в контейнере, поднятая один раз на прогон, плюс изоляция тестов друг от друга. Изоляцию делают двумя способами. Откат транзакции: тест выполняется внутри транзакции, которая в конце откатывается — быстро, но не годится, когда код сам управляет транзакциями или проверяется поведение после коммита. Очистка данных: TRUNCATE затронутых таблиц между тестами — медленнее, зато честнее и совместимо с любым кодом. Данные готовят фабриками, а не общими фикстурами на весь набор: тест должен создавать ровно то, что ему нужно, иначе через полгода никто не понимает, откуда взялись строки. Отдельно проверяют миграции: прогон с нуля на чистой базе в CI ловит несовместимые изменения раньше, чем они доедут до продакшена.