En la primera entrada sobre los tests unitarios en WordPress te expliqué la importancia que tiene probar nuestro código de forma automatizada y qué tipos de tests existen. El objetivo de aquella entrada era darte las nociones básicas con las que empezar a jugar. Si no la has leído todavía, te recomiendo que lo hagas ahora; se lee muy rápido y te ayudará a situarte.
El mundo del testing de software es muy amplio; no sólo por la cantidad de tests diferentes que hay (unitario, integración, aceptación…), sino también por el montón de herramientas y frameworks que existen. Como nosotros estamos en el contexto de WordPress, lo que nos interesa es, obviamente, hablar de cómo testear los productos que montamos sobre WordPress. Estos «productos» suelen ser temas y plugins que, como ya sabes, programamos en PHP y JavaScript. Así que, lo siento por ti, pero hoy toca ponerse manos a la obra y empezar a jugar un poco con los tests unitarios. En concreto, hoy veremos cómo podemos usar PHPUnit para probar los componentes PHP de nuestro tema/plugin.

¿Qué es PHPUnit?
Un test cualquiera consta de 3 pasos: configurar el entorno, actuar sobre él y comprobar que los resultados son los que esperamos. Cuando decidimos que queremos testear nuestro código para garantizar su calidad, necesitaremos alguna herramienta o framework que nos permita definir los diferentes tests (los cuales deberán, insisto, realizar los 3 pasos anteriores), que los ejecute de forma automática, que verifique que los resultados de todos ellos son los esperados y que si algo ha fallado nos avise para que podamos corregirlo. Pues bien, tal y como podemos leer en la web del proyecto, PHPUnit es, precisamente, el «framework de test para PHP orientado a programadores» que usaremos aquí.
Aunque podríamos estar mucho rato hablando sobre qué es y qué permite PHPUnit, creo que lo más sencillo y útil es que empecemos con un pequeño ejemplo. De hecho, creo que podemos recuperar el ejemplo de nuestra entrada anterior. Si recuerdas, en ella teníamos una función que nos calculaba el IVA de un precio cualquiera:
También vimos cómo un test unitario pondría a prueba la anterior función. Básicamente, lo que debería hacer ese test es decir «oye función, si te paso este valor (1000€
), ¿qué resultado me devuelves? Yo espero que el IVA sean 210
€». Pues bien, este test en PHPUnit se vería así:
en el que podemos ver cómo cada prueba individual que realizamos sobre nuestra función se especifica como un método (testVatOfIntegerIsCorrect
y testVatOfStringIsCorrect
) de una clase VatFunctionTest
que nos ayuda a organizarlo. No es mi objetivo de hoy explicarte con detalle cómo organizar o crear tests, pero si te interesa profundizar un poco sobre el tema, te recomiendo que leas esta entrada sobre buenas prácticas en PHPUnit; es muy amena e interesante.
¿Qué pasaría si ejecutáramos los tests anteriores? Pues que el primer test pasaría (porque nuestra función es capaz de calcular el 0.21
de 1000
) pero el segundo fallaría (ya que nuestra función no está preparada para recibir un string como parámetro y calcular el 0.21
de '1.000€'
no tiene ningún sentido).
Cómo configurar el entorno PHPUnit en nuestro plugin/tema
Vale, ahora que ya sabes qué pinta tiene un test en PHPUnit viene la pregunta del millón: ¿cómo rayos montamos todo esto encima de WordPress? ¡Pues instalando y configurando las herramientas necesarias! En pippinsplugins tienen una entrada (en inglés, eso sí) donde se detalla el proceso. Básicamente, deberás:
- Instalar PHPUnit. Si quieres poder escribir y ejecutar tests en PHPUnit, necesitarás la plataforma, ¿no? Para ello, sigue las instrucciones de instalación que hay en el repositorio Github del proyecto (o, si estás en un sistema operativo de verdad-ejemlinuxejem) puedes instalar el paquete
phpunit
. - Instalar WP-CLI. Como estamos interesados en testear componentes de WordPress, necesitamos una forma rápida y cómoda de crear y gestionar instalaciones de WordPress. Lo más cómodo es hacerlo a través del terminal, sin tener que entrar en el navegador web y similares, con lo que necesitaremos una herramienta llamada WP-CLI (WordPress-Command Line Interface). Para instalarla, sigue las instrucciones que encontrarás en su web. (Por cierto, si estás usando VVV para desarrollar, creo que ya viene instalada por defecto).
Una vez instaladas las diferentes herramientas, únicamente tendrás que preparar el «entorno de test». Para ello, ve al directorio raíz de tu instalación WordPress (el que sea):
cd vagrant-local/www/wordpress-default/
y ejecuta el siguiente comando:
wp scaffold plugin-tests nombre-del-plugin
donde nombre-del-plugin
es el nombre del plugin en el que quieres montar los tests. Por ejemplo, en nuestro caso podría ser nelio-content
.
Una vez lo hayas hecho, si accedes al directorio del plugin y listas sus contenidos, verás que han aparecido unos cuantos ficheros y directorios nuevos:
bin/
install-wp-tests.sh
phpunit.xml
test/
bootstrap.php
test-sample.php
.travis.yml
Ahora ejecuta el comando:
bash bin/install-wp-tests.sh wordpress_test root password localhost latest
donde wordpress_test
será el nombre de una nueva base de datos con los datos de test que generemos, root
es el nombre de usuario con el que nos conectaremos a tu servidor de base de datos, password
es su contraseña y localhost
es el servidor en el que está corriendo (todo esto lo puedes encontrar en el fichero wp-config.php
de tu instalación de WordPress).
Una vez completado el proceso, ejecuta phpunit
y, como pudiste leer en la entrada de pippinsplugins, verás que todo funciona correctamente:

Nota para los usuarios de Vagrant-VVV
Si estás usando Vagrant-VVV, lo más probable es que los comandos anteriores no te hayan funcionado. Para que funcionen, debes ejecutarlos dentro de la máquina virtual. Entra usando el siguiente comando:
vagrant ssh
Una vez estés dentro, ahora ya sí puedes dirigirte al directorio de tu instalación WordPress:
cd /srv/www/wordpress-default/
y seguir los pasos anteriores. ¡Ah! Y cada vez que quieras ejecutar los tests también deberás realizarlo desde dentro de la máquina virtual. (Si alguno de vosotros sabe cómo hacerlo desde fuera, le agradeceré un montón que me lo diga en los comentarios).
Ejemplo sencillo de test con todo el montaje
Para poner en práctica todo lo anterior, simplemente descarga este plugin que he creado para ti y configúralo como hemos visto:
cd /srv/www/wordpress-default/wp-content/plugins git clone https://github.com/davilera/nelio-vat-example.git cd /srv/www/wordpress-default wp scaffold plugin-tests nelio-vat-example cd /srv/www/wordpress-default/wp-content/plugins/nelio-vat-example bash bin/install-wp-tests.sh wordpress_vat_example root root localhost latest
Una vez tengas esto listo, cárgate el test de prueba test-sample.php
que hay en la carpeta tests
/
y crea uno nuevo test-vat-function.php
con el test VatFunctionTest
que hemos visto más arriba. Una vez lo hayas hecho, si ejecutas phpunit
verás lo siguiente:

¡Vaya, qué sorpresa! Tal y como habíamos previsto, las cosas no funcionan… Fíjate que el test te está diciendo que hay dos aserciones (¿recuerdas que teníamos dos métodos en la clase, cada uno de ellos comprobando cosas diferentes?) y que una de ellas nos está fallando; parece ser que el número 0.209999
no es 210
?
Pues bien, hoy te voy a poner deberes: reescribe la función neliovat_get_iva
para que cadenas de texto con un precio como por ejemplo (15,20
, 1.000
y 3€
)(donde los separadores de miles son .
, los de decimales son ,
, no hay nunca espacios pero puede haber moneda al final) pase el test. ¡En la próxima entrada vemos la solución y seguimos!

Nelio Unlocker
Pásate a WordPress manteniendo tus diseños y contenidos
Mejora hoy mismo el SEO de tu web y acelera su velocidad de carga convirtiendo tus páginas a estándares HTML, CSS y WordPress. No necesitas conocimientos técnicos y solo pagarás por aquello que necesites.
Resumiendo
Hoy hemos visto qué es PHPUnit y cómo podemos configurar un plugin WordPress para testearlo con él. Básicamente, PHPUnit es una herramienta con la que crear, ejecutar y verificar tests unitarios de nuestro código PHP.
También hemos aprendido a configurar el entorno para trabajar. Reconozco que el proceso de configuración es un poco tedioso, pero una vez esté en marcha, escribir tests (que de eso se trata) es bastante sencillo, especialmente si estás acostumbrado a PHP.
Espero que te haya gustado la entrada de hoy y no te pierdas la que tenemos preparada para la semana que viene.
Imagen destacada de Jessica C.
Deja una respuesta