Creé un complemento para Symfony 1.4 (PHP) para abordar este problema (entre otros). Está modelado según la forma en que opera el framework de prueba de Django (Python) : el framework construye 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 borrar los datos en lugar de reconstruir la estructura completa?) Y conveniencia (a veces quiero inspeccionar la base de datos después de un prueba fallida, ¡así que no la destruyas indiscriminadamente!), así que tomé 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 habido cambios en el modelo desde la última prueba. Antes de que se ejecute cada prueba posterior, los datos en la base de datos se borran, pero la estructura no se reconstruye (aunque una reconstrucción manual se puede activar a partir de una prueba si es necesario).
Al cargar de forma selectiva los dispositivos de datos en cada prueba, se puede crear el entorno adecuado para esa prueba sin interferir con las pruebas posteriores. Los archivos fixture también se pueden reutilizar, lo que hace que esta tarea sea mucho menos onerosa (¡aunque sigue siendo 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.