Qué necesitas saber para comenzar con el testing de aplicaciones Laravel. Desde la organización de los test en carpetas, la ejecución, los tipos de pruebas y la configuración de las variables de entorno.
Con este artículo comenzamos el Manual de Testing en Laravel. A lo largo de éste y los próximos artículos podrás aprender a testear tus aplicaciones desarrolladas con este framework para PHP.
Este es un manual pensado para personas que tengan un conocimiento medio a avanzado de Laravel, por lo tanto si no es así te recomendamos leer primero el Manual de Laravel de DesarrolloWeb.com. Algunas nociones básicas de PHPUnit también te serían de utilidad, aunque nosotros iremos explicando lo suficiente para que puedas entender todo bastante bien aunque no tengas un conocimiento previo.
Para comenzar con buen pie y ubicarnos en el desarrollo de pruebas del software con Laravel, en esta primera entrega explicaremos algunas cuestiones básicas sobre cómo se organizan los test dentro de las aplicaciones, las carpetas donde se sitúan, los tipos de test que existen y, finalmente, cómo podremos ejecutar los test de nuestra aplicación.
Adicionalmente, en este primer artículo dedicado al desarrollo de pruebas con Laravel, explicaremos cómo utilizar variables de entorno específicas para la configuración de los test, que prevalezcan sobre las variables de entorno comunes.
Para comenzar el manual veremos una serie de Generalidades de testing con Laravel que dividimos en los siguientes apartados.
Laravel ya está preparado para realizar los test
El framework Laravel está preparado para incorporar de una manera sencilla los test de tus aplicaciones. Eso quiere decir que ya viene listo con los archivos de configuración necesarios para implementar las pruebas, como por ejemplo la declaración de las dependencias como PHPUnit o el archivo de configuración phpunit.xml
.
Esto nos ahorrará una serie de trabajo para montar las carpetas de los tests, la instalación de dependencias, etc.
Además de PHPUnit Laravel actualmente es capaz de funcionar también con Pest, otro framework de pruebas. Si lo prefieres lo podrías usar. Nosotros en este manual trabajaremos solamente con PHPUnit.
Carpetas de los test
Laravel propone una arquitectura de carpetas para alojar los test bastante comprensible y habitual. Veremos que en la instalación inicial de un proyecto Laravel hay ya creada una carpeta llamada "test", que a su vez tiene dos subdirectorios:
- El directorio "Unit" está pensado para las pruebas unitarias
- El directorio "Feature" está pensado para las pruebas de funcionalidades
En ambas carpetas encontrarás un archivo llamado ExampleTest.php
donde puedes ver un minúsculo ejemplo de test de cada tipo (test unitarios y test de funcionalidad).
Entendiendo los distintos tipos de pruebas
Como hemos visto, existen dos carpetas donde colocaremos dos tipos de tests. Vamos a ver cuáles son los motivos y los condicionantes de esta clasificación.
Tests unitarios
Por un lado tenemos los test unitarios, que son tests sencillos de clases bien concretas, qe se crean en la carpeta Unit
. Cada uno de los métodos de las clases de test unitarios probará algo muy específico, generalmente un método de una clase de tu proyecto o incluso un método dada una entrada de datos determinada.
Lo importante que debemos saber es que cuando se ejecutan los tests unitarios en Laravel no se arranca el framework completo, sino que se ejercita únicamente la clase que se está probando. Por ello no podrás acceder a servicios del framework como las bases de datos o los sistemas de colas, envío de emails, etc. El objetivo de los tests unitarios no es probar estos servicios, sino probar las clases accesorias que tú tengas en tu aplicación creadas por invención propia.
En Laravel los test unitarios se realizan según el modo de trabajo general que aplica a PHPUnit. No hay mucha diferencia con lo que ya puedas conocer de PHPUnit. Vamos a aportar un poco más adelante una explicación básica de test unitarios, así que aunque no tengas experiencia con el framework de pruebas PHPUnit podrás ver cómo funciona también.
Los test de funcionalidades
Por otra parte, en la carpeta Feature
se alojan los tests de funcionalidad de la aplicación. Los test de funcionalidad generalmente hacen cosas como probar que cuando se envían datos por post a una ruta se producen los efectos esperados. Esto puede involucrar diferentes servicios de Laravel como por ejemplo el acceso y manipulación de las tablas de la base de datos, el envío de notificaciones, etc.
Por tanto, para probar funcionalidades el framework levantará todo el motor de aplicación y lo tendrás disponible en tus pruebas.
Lo que en Laravel toma el nombre de Feature Testing puede tener varios nombres distintos por ahí y por tanto a veces se presta a confusión el término, ya que resulta un tanto laxo. A este tipo de pruebas del software en español le llamaríamos testing de funcionalidad o pruebas funcionales, lo que en inglés se conoce también como "Functional Testing". A veces también lo oiremos nombrar como "pruebas de integración", porque los test de feature generalmente se encargan de probar cosas que involucran a distintos componentes dentro del framework, como las bases de datos o los sistemas de colas. Este término también se conoce a veces como "End-to-End Testing" o pruebas de extremo a extremo en español, solo que este tipo de pruebas se suelen usar más para cuando testeamos las aplicaciones con el navegador, algo que veremos bastante más adelante en el manual. Como ves, este término puede tener varios nombres con ligeros matices, por lo que entendemos que a veces sea confuso. Nosotros nos referiremos a este tipo de pruebas según la costumbre de Laravel, como Pruebas funcionales o testing de funcionalidades.
Justamente es aquí donde Laravel ofrece su mejor cara para el desarrollo de test, ya que la mayor parte de las pruebas complicadas se dan sobre las funcionalidades y son los test que pueden aportarte mayor confianza de que tu aplicación está haciendo lo que debe y que no hay nada roto por ahí.
Dicho sea de paso, en este manual trabajaremos en la mayoría de los casos con tests de funcionalidad, que son donde Laravel más puede ayudarte.
Cómo ejecutar los tests en Laravel
Si examinas las carpetas dentro de test (Unit
y Feature
) verás que Laravel nos proporciona de entrada dos archivos de tests ya listos, uno para tests unitarios y otro para test de funcionalidad. Gracias a que tenemos estos tests iniciales, podemos arrancar el proceso de testing nada más acabamos de instalar la aplicación.
Para correr los test en Laravel simplemente debemos lanzar un comando de Artisan.
php artisan test
Pero también podríamos lanzar el comando de PHPUnit para correr los tests.
./vendor/bin/phpunit
Observarás que la salida no es exactamente la misma, ya que el comando de Artisan, proporcionado por Laravel, tiene algunas ventajas como un formato de salida mejorado, en el que se añaden más datos y permite una lectura más amigable para las personas, que incluye colores y una estructura de log de los resultados de los tests más clara y detallada.
Además, si usas el comando de Artisan también te estarás beneficiando de una detección automática de configuraciones para el entorno testing sin necesidad de configurar manualmente el propio Laravel y su integración con PHPUnit.
Por su parte, el comando que ejecuta directamente PHPUnit de la carpeta vendor tiene la ventaja de funcionar de manera externa al framework, por lo que no necesitarías Laravel para poder arrancar los test. Sin embargo no sería tan común su uso porque tiene algunas limitaciones en lo que respecta a la integración con el framework y tu aplicación.
Flags de PHPUnit o Pest en Artisan
Es importante mencionar que si necesitas enviar configuraciones específicas en el comando de Artisan para configurar la ejecución de los test, lo puedes hacer enviando los mismos flags que usarías con los frameworks de test.
php artisan test --testsuite=Unit --stop-on-failure
O por ejemplo filtrar por una clase determinada:
php artisan test --filter=UnaClaseDeTest
Hablando de filtros, también puedes filtrar por un nombre de un método de test que quieras probar:
php artisan test --filter=it_creates_a_customer
Ejecutar los test en paralelo
Existe la posibilidad de ejecutar los test en paralelo, algo que se puede hacer para ahorrar tiempo, en comparación con la ejecución normal que se hace en secuencia.
Para conseguir ejecutar los test en paralelo tenemos que instalar una dependencia adicional.
composer require brianium/paratest --dev
Luego lanzamos el comando siguiente:
php artisan test --parallel
Puedes indicarle que se usen un número de procesos determinados con el flag --processes. El comando te quedaría:
php artisan test --parallel --processes=2
Por defecto se usan tantos procesos como núcleos tenga la CPU.
Existen unas consideraciones relevantes con respecto a la ejecución de los test en paralelo y básicamente es que los tienes que haber desarrollado para que no haya dependencias entre tests. Algunas consideraciones extra las puedes encontrar en la documentación de Laravel.
Entorno de testing y variables de entorno
Los tests se ejecutan en un entorno especial llamado testing. Esto es importante porque al correr los tests debemos trabajar con configuraciones distintas, que no son las de desarrollo y mucho menos las de producción.
Si te fijas, en el archivo phpunit.xml
encontrarás que se definen una serie de variables de entorno que afectan directamente al entorno de testing.
Entre esas variables se definen cosas interesantes como que el driver de sesiones será "array", igual que el driver de cache o el de mail. Tú lo podrías cambiar, pero generalmente no será necesario ya que son configuraciones bastante normales para el entorno de test.
También podrías añadir otras variables de entorno en este archivo de configuración phpunit.xml
pero ten en cuenta que los datos que coloques ahí se van al repositorio, por lo que no siempre sería adecuado porque ciertas configuraciones podrían quedar publicas.
Si necesitas crear otras variables de entorno para el testing existe la posibilidad de usar el archivo .env.testing
. Todo lo que coloques en ese archivo afectará a los tests.
Ten en cuenta que
.env.testing
debería tener una referencia a toda variable que requiera tu aplicación. No puedes poner unas pocas variables pensando que solamente tendrán prioridad frente a otras configuraciones de entorno en el.env
. En realidad cuando tiene un.env.testing
se ignorará cualquier contenido del.env
normal.
Conclusión
Solo hemos comenzado a explicar cómo trabajar con los test de las aplicaciones Laravel pero ya tienes información bastante útil para empezar a entender el flujo de testing optimizado que nos ofrece el framework.
En el siguiente artículo empezaremos a crear nuestros primeros test dentro de la aplicación Laravel, tanto test unitarios como tests de funcionalidad.
Miguel Angel Alvarez
Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...