Construí un complemento para Symfony 1.4 (PHP) para abordar este problema (entre otros). Se basa en el modo en que el marco de prueba de Django (Python) opera : framework crea y llena una base de datos de prueba separada antes de que comience cada prueba, y destruye la base de datos de prueba una vez que se completa cada prueba.
Tenía un par de preocupaciones sobre esta estrategia, tanto en términos de rendimiento (si el esquema no cambia, ¿por qué no simplemente borra los datos en lugar de reconstruir toda la estructura?) y la conveniencia (a veces quiero inspeccionar la estructura) base de datos después de una prueba fallida, así que no la destruyas indiscriminadamente), por lo que adopté un enfoque ligeramente diferente.
Antes de que se ejecute la primera prueba, la base de datos se destruye y se reconstruye, en caso de que haya cambios en el modelo desde la última prueba. Antes de que se ejecute cada prueba subsiguiente, los datos en la base de datos se borran, pero la estructura no se reconstruye (aunque se puede iniciar una reconstrucción manual desde una prueba si es necesario).
Al cargar de forma selectiva los datos en cada prueba, uno puede crear el entorno adecuado para esa prueba sin interferir con las pruebas posteriores. Los archivos de aparatos también pueden reutilizarse, lo que hace que esta tarea sea mucho menos onerosa (¡aunque es mi parte menos favorita de las pruebas de escritura!).
En ambos marcos de prueba, el adaptador de base de datos está configurado para usar la conexión de prueba en lugar de la conexión de "producción" para evitar que la ejecución de la prueba corrompa los datos existentes.