Introducción a los tests unitarios en WordPress – PHPUnit

Publicada en WordPress.

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.

¡Vamos a por todas! (fuente)
¡Vamos a por todas! (fuente)

¿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:

  1. 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.
  2. 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:

PHPUnit Test Example
Resultado de ejecutar PHPUnit por primera vez. Imagen de pippinsplugins.

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:

Test fallido en PHPUnit
Test fallido en PHPUnit.

¡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!

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.

FlojaNo está malBienMuy bien¡Impecable! (1 votos, promedio: 5,00 de 5)
Cargando…

2 comentarios en «Introducción a los tests unitarios en WordPress – PHPUnit»

  1. Muchas gracias por la mención, por cierto muy interesante el tema de hacer tests en WordPress

    1. Gracias a ti por pasarte por aquí, Jesús. Estaba buscando artículos en español sobre PHPUnit y he encontrado el tuyo; un buen artículo con consejos útiles.

Deja un comentario

No publicaremos tu correo electrónico. Los campos obligatorios están marcados con: •

He leído y acepto la Política de privacidad de Nelio Software

Al marcar la casilla de aceptación estás dando tu legítimo consentimiento para que tu información personal se almacene en SiteGround y sea usada por Nelio Software con el propósito único de publicar aquí este comentario. Contáctanos para corregir, limitar, eliminar o acceder a tu información.