Как бы я проверил логику базы данных? - PullRequest
1 голос
/ 25 октября 2010

У меня все еще есть проблема, связанная с небольшой проблемой, когда дело касается TDD.

Мне нужен метод, который будет получать определенный набор записей отфильтрованных данных из уровня данных (linq2SQL). Обратите внимание, что я использую сгенерированные linq классы, сгенерированные из DBML. Теперь проблема в том, что я хочу написать тест для этого.

сделать я:

a) сначала вставьте записи в тест, а затем выполните метод и проверьте результаты

б) использовать данные, которые могут быть в базе данных. Не увлекаться этой логикой, потому что это может привести к поломке.

в) что вы предлагаете?

Ответы [ 4 ]

5 голосов
/ 25 октября 2010

Вы должны выбрать вариант а).

Юнит-тест должен повторяться и должен полностью контролироваться. Поэтому для того, чтобы тест был значимым, абсолютно необходимо, чтобы сам тест подготовил данные для его выполнения - только так вы можете рассчитывать на результаты теста.

4 голосов
/ 25 октября 2010

Используйте базу тестов и очищайте ее при каждом запуске тестов.Или вы можете попытаться создать фиктивный объект.

1 голос
/ 25 октября 2010

Когда я запускаю тесты с использованием базы данных, я обычно использую базу данных SQLite в памяти.Использование БД в памяти обычно ускоряет тестирование.Кроме того, его легко обслуживать, потому что база данных «исчезла» после закрытия подключения к ней.

В тестовой настройке я установил соединение db и создал схему базы данных.В тесте я вставляю данные, необходимые для теста.(ваш вариант a)) В тестовом демонтаже я закрываю соединение с БД.

Я успешно использовал этот подход для своих приложений NHibernate ( howto 1 | howto 2 +хорошее резюме ), но я не очень знаком с Linq2SQL.

Некоторые указатели по запуску SQLite и Linq2SQL находятся на SO ( ссылка 1 | ссылка 2 ).

Некоторые люди утверждают, что тест с использованием базы данных не является тестом unit .Несмотря на это, я считаю, что существуют ситуации, когда вам нужно автоматическое тестирование с использованием базы данных:

  • У вас может быть архитектура / дизайн, в котором базу данных сложно смоделировать, например, при использовании шаблона ActiveRecordили когда вы используете Linq2SQL (хотя в одном из комментариев к ответу Питера есть интересное решение)
  • Вы хотите запустить интеграционные тесты с полной системой приложений и базы данных
0 голосов
/ 25 октября 2010

Что я делал в прошлом:

  • Начать транзакцию
  • Удалить все данные из всех таблиц в базе данных
  • Установите справочные данные, необходимые для всех ваших тестов
  • Настройка необходимых тестовых данных в таблицах базы данных
  • Запустите тест
  • Прервать транзакцию

Это хорошо работает, если в вашей базе данных нет большого количества данных, в противном случае она медленная. Так что вы захотите использовать тестовую базу данных. Если у вас есть тестовая база данных, которая хорошо контролируется, вы можете просто запустить тест в транзакции без необходимости сначала удалять все данные.


Постарайтесь спроектировать свою систему, чтобы в большинстве ваших тестов вы могли получить удовольствие от уровня доступа к данным. Это допустимо (и часто полезно) для модульного тестирования кода базы данных , однако модульные тесты для вашего другого кода не должны касаться базы данных.

Вам следует подумать, получите ли вы больше преимуществ от системных тестов «от конца до конца», с модульными тестами только для вашего «логического» кода. Это во многом зависит от других факторов в рамках проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...