Изоляция тестов: транзакции, Respawn, сиды
↑ 4.3 Тестирование слоя данных · ← Предыдущая
Зачем это на собесе
Как сделать тесты независимыми и повторяемыми при общей БД.
Объяснение
| Способ | Как | Плюсы | Минусы |
|---|---|---|---|
| Транзакция с откатом | каждый тест в транзакции, rollback в конце | очень быстро | не подходит для кода, сам управляющий транзакциями |
| Respawn | очистка данных (DELETE/TRUNCATE) перед тестом | универсально | чуть медленнее |
| БД на тест / схема на тест | полная изоляция | максимально надёжно | дорого |
| Пересоздание контейнера | чистое состояние | долго | только для редких тестов |
public class OrdersTests(PgFixture fx) : IAsyncLifetime
{
private Respawner _respawner = default!;
public async Task InitializeAsync()
{
await using var conn = new NpgsqlConnection(fx.ConnectionString);
await conn.OpenAsync();
_respawner = await Respawner.CreateAsync(conn, new RespawnerOptions { DbAdapter = DbAdapter.Postgres, TablesToIgnore = ["__EFMigrationsHistory"] });
await _respawner.ResetAsync(conn);
}
public Task DisposeAsync() => Task.CompletedTask;
}Сиды
- Справочники — часть миграций или отдельный seed; тестовые данные создавайте явно в тесте (builder-ы), а не полагайтесь на общий «мир».
- Каждый тест создаёт только нужные ему данные и уникальные значения (GUID), тогда параллельный запуск безопасен.
Нюансы и подводные камни
- Общие данные между тестами — источник flaky.
- Порядок тестов не должен влиять на результат.
- Параллельные тесты на одной БД: изолируйте по схеме или отключайте параллелизм коллекции.
- Не забудьте исключить таблицу истории миграций при очистке.
Практика
- Подключите Respawn и убедитесь, что тесты не зависят друг от друга.
- Сравните время: rollback, Respawn, пересоздание БД.
- Напишите builder для сложного агрегата с разумными значениями по умолчанию.
Вопросы с ответами
Как изолировать тесты при общей БД?
Откат транзакции, Respawn-очистка либо отдельная БД/схема на тест.
Почему не полагаться на общий seed?
Тесты становятся связаны и хрупки; данные нужно создавать явно в самом тесте.