Это старый вопрос, но я подумал, что хотел бы добавить какой-то конкретный опыт, который мы имели с этим.
Другие постеры технически верны в том, что это форма интеграционного теста, но, с моей точки зрения, в MySQL часто слишком много логики, чтобы ее можно было заглушить в модульном тестировании. Если вы похожи на нас и у вас есть большие и сложные сервисы, которые сильно зависят от MySQL (и часто от нескольких таблиц на сервис), иметь удобную инфраструктуру тестирования, включающую тестирование логики запросов, действительно удобно. Мы моделируем большое количество наших зависимостей в наших модульных тестах, но не MySQL.
У нас есть набор классов, которые проще всего обернуть, чтобы обеспечить эту функциональность. Это работает примерно так:
- Инструкции по созданию каждой таблицы базы данных хранятся в файле на
tests/etc/schemas/table.sql
. Он содержит данные схемы, а также вставки для всех стандартных данных, которые тест может найти.
- Каждый тест, для которого требуется база данных, расширяет класс
Test_DbCase
, который предоставляет функциональные возможности для построения таблиц.
- Класс начальной загрузки заботится о создании и удалении базы данных при конструировании и уничтожении.
- Во время выполнения тест вызывает
loadTables('foo', 'bar')
в методе setUp для выполнения команд sql в foo.sql
и bar.sql
.
- Тесты выполняются на основе постоянных данных .. остальное очевидно.
Еще один инструмент, который у нас есть, это bash-скрипт, который облегчает создание файлов table.sql
. Это действительно удобно, потому что в противном случае мы будем писать SQL вручную - вы можете взять существующий набор таблиц, настроить все свои данные в MySQL, а затем экспортировать их для создания тестовых файлов.
Это работает очень хорошо для нас, хотя в итоге нам пришлось свернуть многие из них самим.