Я работаю со многими веб-приложениями, которые управляются базами данных различной сложности на сервере. Как правило, есть слой ORM, отдельный от бизнес-логики и логики представления. Это делает модульное тестирование бизнес-логики довольно простым; все может быть реализовано в дискретных модулях, и любые данные, необходимые для теста, могут быть сфальсифицированы посредством моделирования объектов.
Но тестирование ORM и самой базы данных всегда было чревато проблемами и компромиссами.
За прошедшие годы я попробовал несколько стратегий, ни одна из которых не удовлетворила меня полностью.
Загрузите тестовую базу данных с известными данными. Запустите тесты на ORM и убедитесь, что вернулись правильные данные. Недостатком здесь является то, что ваша тестовая БД должна идти в ногу с любыми изменениями схемы в базе данных приложения и может быть не синхронизирована. Он также опирается на искусственные данные и может не отображать ошибок, возникающих из-за глупого пользовательского ввода. Наконец, если тестовая база данных мала, она не будет показывать неэффективность, например отсутствующий индекс. (Хорошо, последнее не совсем то, для чего следует использовать модульное тестирование, но это не повредит.)
Загрузите копию рабочей базы данных и протестируйте ее. Проблема здесь в том, что вы можете не знать, что находится в производственной базе данных в любой момент времени; Ваши тесты, возможно, придется переписать, если данные со временем меняются.
Некоторые люди отмечают, что обе эти стратегии основаны на конкретных данных, и модульное тестирование должно проверять только функциональность. С этой целью я видел, предложил:
- Используйте фиктивный сервер базы данных и проверяйте только то, что ORM отправляет правильные запросы в ответ на данный вызов метода.
Какие стратегии вы использовали для тестирования приложений на основе базы данных, если таковые имеются? Что сработало лучше для вас?