Scaffolding de pruebas unitarias con PHPUnit
Agregar pruebas a tu software ya no es una curiosidad más de aquellos programadores geeks. En la actualidad se hace cada vez más necesario implementar pruebas automatizadas y que estas estén ligadas a implementaciones de integración continua. El día de hoy, veremos cómo puedes agregar un scaffolding de pruebas unitarias con PHPUnit en tus proyectos PHP tal y como se hace en un etorno profesional.
Requerimientos
Para poder desarrollar este tutorial, es necesario:
- Tener configurado tu proyecto con composer. Es decir, que tengas un archivo composer.json y puedas instalar paquetes mediante composer.
- Tener el código de tu proyecto configurado en el autoloader del archivo composer.json.
Si aún no tienes tu proyecto configurado con composer te invito a tomar lo necesario de este tutorial Crear librería en PHP instalable con composer.
Configuración de la carpeta de tests
El primer paso consiste en crear alguna carpeta como por ejemplo tests, y agregar el atoloader respectivo en el archivo composer.json.
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
}
Nota que el autoloader solo se configurará en tu entorno de desarrollo. Esto evita que todas las clases de testing que realices se carguen en producción.
Instalación de PHPUnit
Lo siguiente que debes hacer es instalar la última versión de phpunit.
composer require phpunit/phpunit --dev
De igual manera como en la configuración de autoloader, esta librería será instalada solamente en entorno de desarrollo. Es por esto que se debe instalar con el argumento --dev.
Crear la configuración de pruebas del proyecto
Una vez hecho esto ya puedes generar la configuración de pruebas inicial para tu proyecto con el siguiente comando.
vendor/bin/phpunit --generate-configuration
Obtendrás una salida similar a la siguiente. Si has hecho todo bien hasta aquí, será cuestión de tomar los valores por defecto y dar enter a las preguntas de phpunit.
PHPUnit 9.3.8 by Sebastian Bergmann and contributors.
Generating phpunit.xml in /var/www/...
Bootstrap script (relative to path shown above; default: vendor/autoload.php):
Tests directory (relative to path shown above; default: tests):
Source directory (relative to path shown above; default: src):
Generated phpunit.xml in /var/www/...
Este comando te generará un archivo llamada phpunit.xml que contiene la configuración para phpunit. Seguramente querrás evitarte dolores de cabeza y cambiar algunos valores en este archivo. Yo personalmente cambio los siguientes atributos a false
en la etiqueta phpunit.
forceCoversAnnotation="false"
beStrictAboutCoversAnnotation="false"
Adicional a esto, si quieres ver un poco mejor la ejecución de tus tests recomiendo colocar el siguiente atributo en la misma etiqueta.
colors="true"
Creación de tu primera prueba unitaria
Hecho esto ya puedes crear tu primera prueba unitaria. Solo para efectos de tests se ha creado una aserción obvia. La idea es que como ya tienes autocargado tu proyecto, puedas testear tus componentes de software.
namespace Tests;
use PHPUnit\Framework\TestCase;
class ExampleTest extends TestCase
{
/**
* @test
*/
public function itCanTestSomething()
{
$this->assertTrue(true);
}
}
Ejecución de las pruebas
Para ejecutar las pruebas en la clase creada anteriormente basta ejecutar el siguiente comando.
vendor/bin/phpunit --configuration "phpunit.xml" --filter=ExampleTest
Si todo ha salido bien, deberías obtener una salida como la siguiente.
PHPUnit 9.3.8 by Sebastian Bergmann and contributors.
Runtime: PHP 7.4.3
Configuration: phpunit.xml
. 1 / 1 (100%)
Time: 00:00.011, Memory: 6.00 MB
OK (1 test, 1 assertion)