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