Integración continua con PHP (II). Pruebas unitarias.

27/12/2008

En el proceso de construcción del software la implementación y ejecución de pruebas unitarias es, entre otros, uno de los pilares fundamentales. La creación de tests unitarios y su ejecución automatizada permiten dotar a dicho proceso de construcción del software de confianza y calidad, permitiendo éstos parámetros, a su vez, la puesta en marcha de metodologías de trabajo ágiles.

En la actualidad existen en el mercado del software libre multitud de frameworks que facilitan la tarea de implementación y ejecución de pruebas  unitarias, concretamente, para entornos de desarrollo basados en tecnología PHP nos encontramos con frameworks como PHPUnit o SimpleTest, aunque también existen frameworks de desarrollo, como Symfony, que proporcionan su propia suite de testing.

En el presente post nos centraremos en PHPUnit y su integración con Phing para un proyecto basado en Symfony 1.0 (instrucciones de instalacion).

Para instalar PHPUnit ejecutaremos las siguientes instrucciones (se supone que tenemos instalado pear):

  • pear channel-discover pear.phpunit.de
  • pear install -a phpunit/PHPUnit

Una vez instalado PHPUnit, crearemos un proyecto symfony (con la correspondiente aplicación y módulo), para este post vamos a crear una clase Contact con su correspondiente test ContactTest. Para ejecutar los tests nos situaremos en la carpeta “/lib/classes/” del proyecto y ejecutaremos la siguiente instrucción:

  • phpunit *Test.class.php

Pero, cómo podemos automatizar la ejecución de las pruebas, es en este punto donde entra en juego la herramienta de la que hablamos en el anterior post, phing, con ella podemos declarar una nueva tarea que ejecutará todas las pruebas unitarias que hayamos implementado para la aplicación que estamos desarrollando. veámoslo.

En primer lugar tendremos que crear un nuevo fichero build.xml con el que construiremos nuestra aplicación, este fichero contará, entre otras, una tarea de ejecución de pruebas que será algo como lo siguiente:

<target name=”test”>
<phpunit2 haltonfailure=”false” printsummary=”true”>
<batchtest>
<fileset dir=”./lib/classes/”>
<include name=”*Test.class.php”/>
</fileset>
</batchtest>
</phpunit2>
</target>

Con esta tarea le estamos indicando a phing que queremos ejecutar todas las pruebas que se encuentran en el directorio “lib/classes/”, que no queremos que se pare si encuentra alguna prueba no satisfactoria y que queremos que se muestre por pantalla el resumen, a su vez existen otras tareas ligadas a phpunit que permiten obtener reportes más completos como gráficas estadísticas, niveles de covertura, etc.

Como podemos ver la integración de phpunit en phing nos proporciona una forma ágil de ejecutar tests unitarios obteniendo los reportes oportunos.

Aquí dejo el proyecto symfony con el fichero build.xml

En esta ocasión voy a optar por no escribir una frase célebre que más o menos resuma la idea que se escondía detrás de este post, como es mi costumbre, sino que voy a aprovechar para felicitaros a todos estas fiestas y desearos un feliz comienzo de año 2009.