Unit tests: test doubles o database fixtures

Posted by victor on April 19th, 2013
unit-testsEn numerosas ocasiones, las pruebas unitarias de un proyecto incluyen consultas a base de datos. Estas pruebas se deben realizar en entornos estáticos donde para un mismo conjunto de datos de entrada, se obtiene la misma salida por lo que necesitamos disponer de una base de datos que parte de un mismo estado cada vez que comenzamos la batería de pruebas. La realización de pruebas en las que interviene información de base de datos es habitual realizarlas mediante test doubles o database fixtures. La primera consiste en crear mock, falsos objetos que simulan ser el original con los datos que se espera sin realizar consulta alguna al servidor. La segunda técnica consiste disponer de un conjunto de datos de prueba con los que inicializar las tablas de base de datos antes de comenzar las pruebas. La elección de una u otra puede depender del gusto de cada uno pero sobretodo dependerá de la naturaleza y del entorno en el que se encuentre el proyecto.

Database fixtures

Database fixtures requieren de un servidor de datos e incrementan el tiempo empleado en realizar las pruebas. En grandes proyectos con miles de ellas este parámetro puede ser crucial. Algunos programadores como Chris Hartjes, autor del libro "The grumpy programmer's", prefieren evitar esta técnica porque la misión es probar el código, no el drivers de conexión al servidor de datos. Además,  la base de datos se va "contaminando" con la propia ejecución de las pruebas pudiendo llegar a crear situaciones no favorables para algunas de ellas. El uso de data fixtures con PhpUnit requiere de un complemento extra llamado DbUnit que permite inicializar la base de datos a un estado conocido. Este tipo de complementos imponen limitaciones, como el tipo de servidor de datos que soporta: MySQL, PostgreSQL, Oracle y SQLite. Desde luego son motores comunes pero ¿Qué pasa si nuestro proyecto usa otro, como por ejemplo, un motor tipo NO-SQL?.

Test doubles

Los test doubles son rápidos, y probablemente requieran el mismo tiempo de preparación que los database fixtures. Se crean mediante algún mock framework como Phake o el proporcionado por PhpUnit. Quizá el problema en framework actuales, como Symfony, es el fuerte acoplamiento con base de datos en los que realizar test doubles para tareas que implican recuperar entidades puede llegar a ser complejo y tedioso.

Comments

comments powered by Disqus