Snapshot-тесты: Verify
↑ 7.5 Нагрузочное и продвинутое тестирование · ← Предыдущая · → Следующая
Зачем это на собесе
Когда удобнее сравнивать результат с эталоном, а не писать сотни Assert.
Объяснение
Snapshot-тест сохраняет результат (JSON, текст, HTML, PDF-текст) в файл-эталон и при следующих запусках сравнивает с ним. Библиотека Verify для .NET.
[Fact]
public Task Order_response_matches_snapshot() =>
Verify(new { order.Number, order.Status, Items = order.Items.Select(i => new { i.Sku, i.Qty }) });
// хранит OrdersTests.Order_response_matches_snapshot.verified.txt рядом с тестом
[Fact]
public async Task Api_returns_expected_body()
{
var resp = await client.GetAsync("/orders/42");
await Verify(resp).UseDirectory("snapshots"); // статус, заголовки, тело
}При различии создаётся .received.txt; разработчик проверяет diff и принимает (verify tool) как новый эталон.
Применение: ответы API, сгенерированный SQL, документы и отчёты, сериализация контрактов, результат маппинга, сообщения об ошибках.
Нестабильные значения (Guid, даты) обрабатываются встроенным скраббингом: Guid_1, DateTime_1 или .ScrubMember("CreatedAt").
Нюансы и подводные камни
- Эталоны нужно ревьюить: бездумное «принять всё» превращает тест в шум.
- Слишком большие снимки сложно читать; ограничивайте содержимое значимым.
- Изменение формата сериализации ломает много снимков: используйте стабильные DTO.
- Не храните секреты в эталонах.
Практика
- Добавьте Verify для ответа одного API и для сгенерированного отчёта.
- Настройте скраббинг Guid и дат.
- Включите
.verified.*в git и.received.*в.gitignore.
Вопросы с ответами
Когда snapshot-тест лучше Assert?
Когда результат большой и структурированный, и сравнение с эталоном понятнее набора отдельных проверок.
Основной риск snapshot-тестов?
Автоматическое принятие изменений без ревью.