Scaffolding de pruebas unitarias con PHPUnit

Author
By Darío Rivera
Posted on 2020-08-30 in PHPUnit

Agregar pruebas a tu software ya no 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)

Si te ha gustado este artículo puedes invitarme a tomar una taza de café

Acerca de Darío Rivera

Author

Ingeniero de desarrollo en PlacetoPay , Medellín. Darío ha trabajado por más de 6 años en lenguajes de programación web especialmente en PHP. Creador del microframework DronePHP basado en Zend y Laravel.

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.