Tests en WordPress con PhpUnit

Tests en WordPress con PhpUnit

En este post voy a explicar como configurar PhpUnit y WordPress para que desarrollar plugins deje de ser una locura.

Desarrollar para WordPress puede parecer sencillo en algún momento. Pero desarrollar sin tests puede convertirse pronto en un auténtico dolor de cabeza.

Uno de los problemas que siempre me he encontrado al hacer código en WordPress es la dificultad de hacerlo con tests. Hace un tiempo usaba un proyecto de github que me permitía de una forma complicada tener tests en mis plugins, cuando aún no estaban incorporados en la evolución del propio CMS. Pero ahora existe una nueva forma de tener un sistema común para tener tests en todos los proyectos de WordPress.

Con estos 5 sencillos pasos podremos tener test con PhpUnit en nuestro desarrollo con WordPress:

Paso 1: Instala PhpUnit

Para instalar PhpUnit, podemos hacerlo de varias formas (global, directa, con composer).

Global:

Local :

Paso 2: Instala las WordPress Developers Tools

Para instalar las WordPress Developer Tools, basta con hacer un checkout del proyecto en el directorio escogido para su instalación. Lo podemos hacer en linea de comandos ejecutando siguientes instrucciones:

Paso 3: Sigue las instrucciones del fichero README.txt

El fichero que se encuentra en ~/projects/wordpress-dev/trunk/tests/phpunit/README.txt tiene las instrucciones para habilitar las WDT. Hay que seguir las indicaciones.

Básicamente dice nos insta a crear una base de datos vacía para los tests (la base de datos se borra cada vez que se corren tests, como no podía ser de otra forma), a duplicar el fichero wp-tests-config-sample.php con el nombre wp-tests-config.php y a completar en él con los parámetros de conexión a la base de datos (nombre, usuario y password).

Al terminar ya podremos probar todos los test de WordPress:

O uno específico en concreto:

Paso 4: Prepara tu plugin para soportar tests

El siguiente paso es preparar nuestro plugin para poder crear tests para nuestro código. Para ello debemos elegir dónde vamos a albergar los tests.
En el caso de las WordPress Developers Tools ellos optan por tener un directorio tests y src para tests y código, pero no hay que coger esta elección para nuestro desarrollo.
También es posible tener un directorio tests dentro de nuestro plugin, por ejemplo.
Realmente podemos crear los test en el directorio donde queramos, porque el directorio lo vamos a incluir en nuestro fichero de configuración bootstrap.php que veremos más adelante.

De momento lo que sí necesitamos es crear un fichero phpunit.xml en el directorio de tests que hayamos escogido, con la siguiente información:

En él estamos indicando que nuestros test tendrán el prefijo test- en el nombre del fichero.
También que incluimos un fichero bootstrap.php de este mismo directorio, que es el encargado de cargar nuestro plugin (y de cualquier otro del que dependamos en el desarrollo).

Para hacer esto hay que usar la función test_add_filter en lugar de add_filter, simplemente porque no la tenemos disponible aún en este punto de la ejecución de los tests. Por esta razón se carga el fichero functions.php. Pero veamos mejor el proceso viendo el código del fichero bootstrap.php que deberemos crear:

Podemos copiar y pegar este código, modificando las variables WP_TESTS_DIR y TEST_PLUGIN_FILE con nuestros valores.

Paso 5: Escribir nuestros test

Ahora ya podemos escribir nuestros tests. Hay que recordar que el nombre debe comenzar por test- si hemos mantenido ese valor en el fichero phpunit.xml.

Nuestro primer test pasando en verde, puede ser algo parecido a esto:

En este test estamos extendiendo de la clase WP_UnitTestCase en lugar de la PHPUnit_Framework_TestCase. Esto lo hacemos porque esta clase de WordPress viene preparada con cierta funcionalidad para hacernos la vida más fácil al crear nuestros tests para nuestros plugins de WordPress.

¿Te ha gustado? ¿Tienes otro sistema diferente para soportar tests? Explícalo en un comentario.

Show Comments Hide Comments

Leave a Reply

Your email address will not be published. Required fields are marked *