ASP.NET MVC TDD с базой данных LINQ и SQL - PullRequest
6 голосов
/ 06 января 2009

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

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

Я собираюсь использовать Linq для SQL, хотя и не думаю, что это позволит мне сделать это?

Должен ли я просто пойти по маршруту ADO, если я хочу сделать это таким образом? Или мне просто использовать фиктивный объект и хранить данные в виде массива или чего-то еще?

Какие-нибудь советы по передовому опыту?

Как Джефф сделал это для StackOveflow?

Ответы [ 6 ]

4 голосов
/ 06 января 2009

Что я делаю, так это определяю интерфейс для оболочки DataContext и использую реализацию оболочки для DataContext. Это позволяет мне использовать в своих тестах альтернативную, фальшивую реализацию DataContext (или, если проще, подделать). Это абстрагирует базу данных от моих модульных тестов полностью. Я нашел некоторый стартовый код на http://andrewtokeley.net/archive/2008/07/06/mocking-linq-to-sql-datacontext.aspx,, хотя я расширил его, чтобы он обрабатывал реализации проверки на моих классах сущностей.

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

2 голосов
/ 07 января 2009

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

После небольшого исследования я нашел статью Стивена Вальтера http://stephenwalther.com/blog/archive/2008/08/17/asp-net-mvc-tip-33-unit-test-linq-to-sql.aspx, которая мне кажется более простой и надежной.

Итак, я иду с этой реализацией.

Спасибо за помощь.

1 голос
/ 17 января 2012

Я согласен со многими из вышеперечисленных, касающихся юнит-тестирования. Тем не менее, я думаю, что важно подчеркнуть, что использование репозиториев Mock и модульных тестов не дает такого же уровня тестов, как тест на интеграцию с БД.

Например, наши базы данных часто имеют каскадные удаления, встроенные прямо в схему. В этом случае удаление первичного объекта в совокупности автоматически удалит все дочерние объекты. Однако это не будет автоматически применяться в фиктивном репозитории, для которого не была создана резервная копия физической базы данных с этими бизнес-правилами (если только вы не встроили все эти правила в Mock). Это важно, потому что, если кто-то придет и изменит дизайн моей схемы, мне нужно, чтобы он сломал мои тесты, чтобы я мог соответствующим образом скорректировать код / ​​схему. Я ценю, что это интеграционное тестирование, а не модульное тестирование, но подумал, что стоит упомянуть.

Мой предпочтительный вариант - создать базу данных Master Design, которая содержит образцы данных (те же данные, которые вы создали бы в своих макетах). В начале каждого теста у меня есть автоматический скрипт, который создает резервную копию MasterDB и восстанавливает ее до «TestDB» (который используют все мои тесты). Таким образом, я поддерживаю хранилище чистых тестовых данных в Master, а затем воссоздаю себя при каждом запуске теста. Мои тесты могут поиграться с данными и протестировать все необходимые сценарии.

Когда я отлаживаю приложение, у меня есть другой сценарий, который выполняет резервное копирование и восстанавливает основную базу данных в базу данных DEV. Я тоже могу поиграть с данными, не беспокоясь о потере данных. Обычно я не запускаю этот конкретный сценарий каждую сессию из-за задержки ожидания восстановления БД. Я могу запустить его один раз в день, а затем поиграть / отладить приложение в течение дня. Если, например, я удаляю все записи из таблицы как часть моей отладки, я запускаю сценарий для воссоздания DevDB, когда я закончу.

Эти шаги звучат так, как будто они затрачивают огромное количество времени на процесс, но на самом деле - нет. Наше приложение в настоящее время имеет около 3500 тестов, причем около 3000 из них в какой-то момент обращаются к БД. Резервное копирование и восстановление базы данных обычно занимает около 10-12 секунд в начале каждого теста. И поскольку весь набор тестов выполняется только после проверки TFS, мы не возражаем, если нам все равно придется подождать немного дольше. В среднем весь наш тестовый набор занимает около 15-20 минут.

Я ценю и принимаю, что интеграционное тестирование намного медленнее, чем модульное тестирование (из-за неотъемлемой необходимости использовать реальную БД), но оно более близко представляет приложение «реального мира». Например, репозитории Mock не возвращают коды ошибок БД, время ожидания не истекает, они не блокируются, им не хватает места на диске и т. Д.

Модульные тесты подходят для простых вычислений, базовых бизнес-правил и т. Д. И, безусловно, являются абсолютно лучшим выбором для большинства операций, не требующих доступа к БД (или другим ресурсам). Но я не думаю, что они так же ценны, как интеграционные тесты - люди много говорят о модульных тестах, но мало сказано об интеграционных тестах.

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

1 голос
/ 14 мая 2010
1 голос
/ 06 января 2009

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

0 голосов
/ 14 мая 2010

В этой статье приведен пример использования команды linq to sql с typemock.

http://blog.benhall.me.uk/2007/11/how-to-unit-test-linq-to-sql-and.html

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