2010-09-13 17 views
24

PHPUnit tienen su propio manual some as-yet-unwritten sections titulado "Operaciones" y "Mejores prácticas de prueba de base de datos".Las mejores prácticas para probar las bases de datos con PHPUnit

¿Cuáles son las mejores prácticas para probar una base de datos con PHPUnit, particularmente en MySQL?

+1

posible duplicado de [/ ¿Cuáles son las mejores prácticas estándar para la creación de pruebas unitarias para las bases de datos utilizando la funcionalidad?] (http: // stackoverflow .com/questions/3560116/what-are-standard-best-practices-for-creating-unit-tests-for-functional-using) – Gordon

+0

Gordon, de hecho escribí esta pregunta específicamente *** porque *** las respuestas están ahí no parece entrar en mucha profundidad, ni el capítulo 'PHPUnit' sobre las pruebas de bases de datos hace referencia allí. Me gustaría ver más sobre esto. –

+1

Para aclarar las cosas: tiene una función que realiza algunas consultas (o consultas) en un DB basado en una entrada conocida. Esto arrojará un resultado y ahora desea verificar si ese resultado es lo que esperaría. Si es así, entonces comenzar desde un estado conocido (donde también se sabe cuál debería ser el resultado real) sería un buen comienzo (y eso es a lo que todos se refieren en la pregunta duplicada). Simplemente restaure este estado conocido en cada ejecución de prueba. – wimvds

Respuesta

9

Cuando estoy haciendo pruebas de base de datos con PHPUnit cargo mi volcado de MySQL al comienzo de la primera suite que contiene la información que supongo es cierta en todas las pruebas. Cuando se inicia cada prueba, uso un método setupDatabase. Este método elimina todas las filas de las tablas que sé que han cambiado y luego carga un conjunto de datos XML plano que contiene los datos que necesito para mantener como verdadero. Una vez hecho esto, ejecuto el código que estoy probando. Finalmente, uso una colección de métodos simples para seleccionar filas de la base de datos para afirmar que los cambios que hice se realizaron correctamente.

No diría que es una buena práctica, pero funcionó bastante bien para mí. Los únicos problemas con los que me he encontrado son tener que buscar y reemplazar en los datasets XML cada vez que el esquema cambia y las pruebas se ejecutan lentamente como resultado de todas las eliminaciones e inserciones.

Zend Framework tiene una biblioteca interesante para PHPUnit que permite realizar pruebas compare a database table en un conjunto de datos XML plano, pero no he tenido la oportunidad de utilizarlo todavía.

+0

Para la lentitud de la base de datos: instale otro servidor mysql y tenga toda su carpeta de datos en el punto de montaje del backend de la memoria (por ejemplo, tmpfs en linux). Eso acelerará notablemente la creación y las operaciones de db. –

3

Algunos pensamientos desordenados:

Es bueno tener accesorios (con o sin estructura db), cargan en dB en el arranque() de cada prueba. Puede venir, es decir. de archivos JSON o XML, uno para cada tabla. Si lo combina con funciones como getNthFixture ($ sTable, $ nIndex) o countFixtures ($ sTable), puede probar fácilmente sus consultas. Aún más, puede usar [LINQ] [1] para obtener los resultados esperados del conjunto de aparatos con poca o ninguna diferencia entre DB & consulta de aparatos. Encuentro que es bastante fácil adaptarme en la fase inicial de creación de prototipos/desarrollo, cuando la estructura db está cambiando muy a menudo. Agregar una afirmación para comparar directamente el resultado de la consulta LINQ con el resultado de la consulta db hace que crear pruebas sea puro placer;)

Otras sugerencias: db debe reiniciarse antes de cada método de prueba, no antes de la prueba. Idealmente, debería dejar caer la base y reconstruirla a partir de un conjunto completo de accesorios.

Y, si puede, intente realizar pruebas que funcionen con diferentes bases de datos (algunas cosas, por supuesto, no son portátiles, pero la mayoría lo es). Utilice al menos sqlite aparte de mysql/postgres/other_big_rdbm.

Si está probando framework u otro sistema complejo, probablemente debería simular el acceso a la base de datos singleton. Si algunas cosas codificadas están enterradas profundamente en un orbe no tan flexible, puede ser dolor en el cuello, por así decirlo.

La buena idea es registrar todas las consultas que no pasaron la prueba y/o mostrarlas en mensajes de error. También para mensajes de error db. Si está probando grandes bases de datos cuando el rendimiento es una preocupación, intente registrar consultas lentas al mismo tiempo.

Más mágico y tal vez un poco más difícil, es automatizar la prueba de si todas las columnas utilizadas en where/having/joins están indexadas. Es tal vez algo que debería pertenecer a Jointed Php/Database Code Sniffer (tm) en lugar de pruebas unitarias, y no es muy fácil de implementar, pero una vez utilizado se asegura en gran medida la calidad del código.

Otro buen consejo, que va desde la triste experiencia personal: siempre agregue pruebas para conjuntos de caracteres muy pequeños, especialmente si trabaja con muchos idiomas diferentes.mundo ISO-8859-1 es muy pequeña;)

[1]: http://phplinq.codeplex.com/ LINQ

Cuestiones relacionadas