Instalar PHPUnit y primeros pasos

Para los test automatizados en PHP una de las herramientas que uso es PHPUnit. Y también es la que suelo usar en mis talleres y cursos sobre TDD en PHP. Por eso voy a dejar aquí unas instrucciones de cómo se instala y los primeros pasos con ella.

Instalación con Composer

La instalación de PHPUnit la suelo hacer por proyecto, no uso una versión global. La razón más importante es que me permite tener una versión de PHPUnit diferente en cada proyecto.

Para instalarlo uso la herramienta Composer. Puedes usar su asistente de instalación:

$ composer init

NOTA: PHPUnit suele ser mejor que vaya en la sección require-dev.

O puedes crear a mano el fichero composer.json con un contenido similar a éste:

{
    "name": "gorka/taller-tdd",
    "require-dev": {
        "phpunit/phpunit": "^9.0",
    },
    "authors": [
        {
            "name": "Gorka Urrutia",
            "email": "gorka@emailfalso.es"
        }
    ],
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    }
}

También podemos instalarlo directamente con el comando:

$ composer require --dev phpunit/phpunit ^9.0

Una vez creado el fichero composer.json ya podemos instalarlo:

$ composer install

Lanzar PHPUnit

Como tenemos PHPUnit en nuestro proyecto (y no instalado como un programa global) tenemos que lanzarlo desde la carpeta que lo contiene:

$ vendor/phpunit/phpunit/phpunit

Si lo ejecutamos así, sin parámetros, nos mostrará la ayuda. Tenemos la opción de pasarle parámetros o de usar un fichero de configuración (phpunit.xml). Lo del fichero de configuración lo dejo para otro día. Por ahora nos arreglaremos con la línea de comandos.

El primer parámetro que debemos pasar es la carpeta que contiene nuestros tests. Yo suelo ponerlos en ‘tests/’:

$ vendor/phpunit/phpunit/phpunit tests

Si no existe la carpeta se quejará, claro.

Vamos a crear nuestro primer test en esa carpeta.

El nombre del fichero debe acabar en Test para que PHPUnit lo reconozca como un fichero de test. Por ejemplo:

PruebaTest.php

Esqueleto de un fichero test

Todos los ficheros de test deben contener este esqueleto:

<?php

use PHPUnit\Framework\TestCase;

class PruebaTest extends TestCase
{

}

Notas:

  • El nombre de la clase PruebaTest no tiene por qué coincidir con el del fichero aunque es habitual hacerlo.
  • Si te olvidas de extends TestCase no se reconocerá como un test.
  • Si te olvidas del use tendrás un error.

Nuestro primer test

Un test tiene este formato:

    /** @test */
    public function comprobar_que_uno_es_uno()
    {
        // Setup

        // Acción a probar

        // Aserciones
        $this->assertEquals(1, 1);
    }

En un test puede haber tres partes:

  • Setup. Aquí es donde preparamos el entorno del test (creamos los objetos necesarios, damos de alta registros en base de datos, etc.). Es opcional.
  • Acción a probar. Aquí es donde realizamos la acción que queremos probar. Por ejemplo crear un objeto, llamar a un método, etc.
  • Asercciones. Aquí es donde hacemos las comprobaciones para ver si la acción se ha realizado correctamente. En este ejemplo estamos comprobando que 1 es igual 1 (assertEquals). Como imaginarás es absurdo.

Te habrás fijado en que he añadido antes del nombre de la función:

/** @test */

Esto es lo que usamos para decir a PHPUnit que el método a continuación es un test.

También podemos indicarlo añadiendo el prefijo test_ al nombre de la función, pero yo prefiero la forma que he usado:

public function test_comprobar_que_uno_es_uno()

Ahora si lanzas PHPUnit verás el primer resultado de tu primer test:

PHPUnit 9.0.1 by Sebastian Bergmann and contributors.
 .                                                                   1 / 1 (100%)
 Time: 59 ms, Memory: 4.00 MB
 OK (1 test, 1 assertion)

A partir de este punto ya puedes empezar a investigar sobre los test con PHPUnit, seguirme en este blog para más artículos sobre el tema o apuntarte a uno de mis talleres sobre PHPUnit y otros temas de JavaScript y PHP.

1 comentario en “Instalar PHPUnit y primeros pasos”

Me siento solo, dime algo...