NikFaraday
@NikFaraday
Student full-stack Developer

Как правильно тестировать базу данных в .NET?

Здравствуйте!

Возникла немного непонятная ситуация. Нужно написать тесты, но не знаю, как правильно тестировать Data Storage Layer и Data Access Layer. Проблема заключается в том, что мы используем Storage Procedure, а в качестве ORM - Dapper. Вся логика выборок, фильтров и т.д. вынесена на уровень Storage Procedure, значит не получится создать тестовую БД с тестовыми данными.

Заменить всё на Memory Data Storage так же не очень удобно будет, т.к. нужно тестировать Data Access Layer, т.е. тот же Dapper и что он будет выносить из БД.

Как в таком случае быть и как его правильно тестировать?
  • Вопрос задан
  • 250 просмотров
Пригласить эксперта
Ответы на вопрос 4
mayton2019
@mayton2019
Bigdata Engineer
Мне не нравится сама идея тестирования базы.

Тестируют обычно бизнес логику. Слой Services, Processors e.t.c.

Если ваш язык программирования бизнес-логики это PL/SQL, T/SQL e.t.c. то я вам сочувствую.
Наверное в этом и есть главная причина ваших трудностей. Эти языки неудобно тестировать
и практики тестирования наподобие *Unit, *Property e.t.c. тестов там исторически не прижились.

Создание тестовой БД в таком случае - да. Это компромисс. Вот и двигайте в этом направлении.
Поднимайте все в контейнере типа docker.
Ответ написан
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Решение простое - создаешь мок БД для тестов.
1. Тест начинается - запускаешь БД и заполняешь данными необходимыми (как сказал Василий Банников можно сделать дамп с удаленными чувствительными данными)
2. После каждого теста необходимо выполнить откат - если какие-то данные были добавлены/удалены/изменены
3. При завершении тестирования удаляешь БД

На мой взгляд, здесь просто много инфраструктурной работы. Полезные инструменты:
  1. Testcontainers - запускаешь БД в контейнере. Сам ей пользовался, есть много шаблонов для разных БД, чтобы с нуля не писать все. Можно также скрипт инициализации (схема, дамп) добавить - вот тебе и настройка
  2. В зависимости от фреймворка есть разные механизмы запуска кода после каждого тест-кейса. Если про xUnit, то:
    1. Тестовый класс реализует IDisposable - выполняется после каждого тест-кейса. Можно тут реализовать логику отката БД
    2. Для инициализации самого контейнера (чтобы каждый раз не запускать заново) - IClassFixture



Также никто не отменял внешний инстанс БД использовать - просишь дба создать отдельную БД специально для тестов, просто запускать теперь параллельно не получится
Ответ написан
Комментировать
vabka
@vabka Куратор тега .NET
Токсичный шарпист
Вся логика выборок, фильтров и т.д. вынесена на уровень Storage Procedure, значит не получится создать тестовую БД с тестовыми данными.

Это ещё почему? Во время прогона тестов поднимаете полноценную СУБД, которую заполняете всеми табличками и процедурами.
Больше вариантов нет, если хочется этот слой протестировать.
При наличии миграций - это не должно быть сильно сложно.

В крайнем случае можно взять дамп продовой базы, вычистив все чувствительные данные.
Ответ написан
Splo1ter
@Splo1ter
.NET Developer (9 years+)
Тестировать бд не надо
Надо тестить общую логику.
Поднимаете контейнер с базой данных и тестируете.
База данных существует во время всей сессии тестов.
Потом контейнер убивается.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы