Я создал плагин для Symfony 1.4 (PHP) для решения этой проблемы (среди прочих). Он моделируется по принципу работы тестовой среды Django (Python) : среда создает и заполняет отдельную базу данных тестов перед началом каждого теста и уничтожает базу данных тестов после завершения каждого теста.
У меня была пара опасений по поводу этой стратегии, как с точки зрения производительности (если схема не меняется, почему бы просто не очистить данные вместо перестройки всей структуры?), Так и удобства (иногда я хочу проверять базу данных после провал теста, так что не разрушайте его без разбора!), поэтому я выбрал немного другой подход.
Перед выполнением первого теста база данных уничтожается и перестраивается, если с момента последнего теста произошли изменения в модели. Перед каждым последующим выполнением теста данные в базе данных очищаются, но структура не перестраивается (хотя перестройка вручную может быть запущена из теста при необходимости).
Выборочно загружая данные в каждом тесте, можно создать соответствующую среду для этого теста, не мешая последующим тестам. Файлы фикстур также можно использовать повторно, что делает эту задачу намного менее обременительной (хотя это все еще моя наименее любимая часть написания тестов!).
В обеих тестовых средах адаптер базы данных настроен на использование тестового соединения вместо «производственного» соединения для предотвращения повреждения существующих данных при выполнении теста.