Snapshot-тесты: Verify

↑ 7.5 Нагрузочное и продвинутое тестирование · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: senior

Зачем это на собесе

Когда удобнее сравнивать результат с эталоном, а не писать сотни 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.
  • Не храните секреты в эталонах.

Практика

  1. Добавьте Verify для ответа одного API и для сгенерированного отчёта.
  2. Настройте скраббинг Guid и дат.
  3. Включите .verified.* в git и .received.* в .gitignore.

Вопросы с ответами

Связанные темы