Тестирование приложений EF Core

Тестирование является важной задачей практически для всех типов приложений. Оно позволяет убедиться в том, что приложение работает правильно, и мгновенно оповещает об изменении поведения приложения. Так как тестирование может повлиять на архитектуру кода, настоятельно рекомендуется планировать тестирование на ранних этапах и обеспечить хорошее покрытие по мере развития приложения. В этом вводном разделе представлен краткий обзор различных стратегий тестирования для приложений, использующих EF Core.

Включение базы данных (или исключение)

Когда вы создаете тесты для приложения EF Core, необходимо решить, будут ли они затрагивать систему рабочих баз данных, как само приложение, или будут запускаться из двойника для тестирования, который заменит систему рабочих баз данных. Два известных примера двойников для тестирования в контексте EF Core — режим выполнения в памяти SQLite и поставщик с режимом выполнения в памяти.

Подробное сравнение и анализ различных подходов см. в статье Выбор стратегии тестирования. Ниже приведена краткая пошаговая сводка, чтобы вы могли ознакомиться с разными вариантами:

  • Разработчики часто избегают тестирования в системе рабочих баз данных, так как полагают, что это сложно или долго. Это не всегда так, и мы рекомендуем попробовать этот подход: в статье Тестирование в системе рабочих баз данных описаны методики надежного и эффективного тестирования. В любом случае создание нескольких тестов для вашей базы данных обычно необходимо, чтобы убедиться, что приложение действительно в ней работает. Если исключить базу данных, область тестирования может быть ограничена (см. ниже).
  • Поставщик с режимом выполнения в памяти не будет вести себя так же, как настоящая база данных, во многих важных случаях. Одни функции невозможно протестировать с его помощью (например, транзакции, необработанные SQL-операции), другие могут вести себя иначе, чем рабочая база данных (например, чувствительность к регистру в запросах). Выполнение в памяти подходит для простых, ограниченных сценариев запроса, но его функционал невелик, и использовать его не рекомендуется.
    • Имитация DbSet для запросов является комплексной и сложной задачей, более того, она имеет те же недостатки, что и выполнение в памяти, поэтому также не рекомендуется.
  • SQLite в режиме выполнения в памяти лучше совместим с рабочими реляционными базами данных, так как SQLite является полноценной реляционной базой данных. Однако между SQLite и вашей рабочей базой данных будут некоторые важные различия, и определенные функции невозможно будет протестировать (например, методы для поставщика услуг в EF.Functions).
  • Если вы хотите использовать надежный двойник для тестирования, чтобы проверить полный функционал системы рабочих баз данных, можно создать слой репозитория в вашем приложении. Это позволит полностью исключить EF Core из тестирования и целиком скопировать репозиторий. Однако этот способ может существенно изменить архитектуру вашего приложения и повлечь дополнительные затраты на реализацию и обслуживание.

Дополнительные материалы

Дополнительные подробные сведения см. в статье Выбор стратегии тестирования. Рекомендации по реализации и примеры кода см. в статьях Тестирование в системе рабочих баз данных и Тестирование без системы рабочих баз данных.