В прошлое лето я разрабатывал базовое приложение CRUD для ASP.NET/SQL Server, а модульное тестирование было одним из требований. Я столкнулся с некоторыми проблемами, когда пытался проверить базу данных. Насколько я понимаю, модульные тесты должны быть:
- без гражданства
- независимы друг от друга
- повторяется с теми же результатами, то есть без постоянных изменений
Эти требования, похоже, противоречат друг другу при разработке базы данных. Например, я не могу проверить Insert(), не убедившись, что строки, которые будут вставлены, еще не установлены, поэтому мне нужно сначала вызвать Delete(). Но что, если их еще нет? Затем мне нужно будет сначала вызвать функцию Exists().
Мое возможное решение включало очень большие функции настройки (yuck!) и пустой тестовый сценарий, который запускался первым и указывал бы, что установка работает без проблем. Это жертвует независимостью тестов, сохраняя при этом свою безгражданность.
Другое решение, которое я нашел, - это обернуть вызовы функций в транзакции, которую можно легко отбросить, например Roy Osherove XtUnit. Эта работа, но она включает в себя другую библиотеку, другую зависимость, и она кажется слишком тяжелой для решения проблемы.
Итак, что сделал сообщество SO, столкнувшись с этой ситуацией?
tgmdbm сказал:
Обычно вы используете свой любимый автоматизированная модульная система тестирования выполнить интеграционные тесты, которые почему некоторые люди путаются, но они не следует тем же правилам. Вы позволило задействовать бетон реализация многих ваших классов (потому что они были протестированы модулем). Вы тестируете , как ваш бетон классы взаимодействуют друг с другом и с базой данных.
Итак, если я правильно прочитал это, действительно нет способа эффективно протестировать уровень доступа к данным. Или, будет ли "unit test" уровня доступа к данным включать тестирование, скажем, SQL/команд, генерируемых классами, независимо от фактического взаимодействия с базой данных?