Te decidiste. Llegó la hora de incorporar el testing automatizado a tus proyectos.
Permitime que te felicite, es un gran paso hacia la generación de software de calidad superior.
Después de hacer la debida investigación hay pocas dudas: PHPUnit es la herramienta que debes conocer.
Para hacerte un poco más sencillo el camino, te dejo los lineamientos para dar tus primeros pasos.
Cómo instalar PHPUnit
Lo primero, como de costumbre, será instalar la herramienta.
Si vas al sitio de phpunit.de encontrarás algo como:
Nada mal para tener a mano pero, para empezar de cero… puede ser algo intimidante.
Antes de continuar, una advertencia: las versiones de phpUnit están bastante ligadas a las de php. Esto significa que, para asegurarte de elegir una versión que puedas utilizar, debes saber qué versión de php tienes instalada (O piensas instalar, por ejemplo, si utilizarás docker).
Seleccionar la versión de phpunit
Asumamos que, para arrancar, usarás el php instalado en tu propio host.
Un simple php -v
alcanzará:
Pues bien, en este caso, la versión que más conviene utilizar es la 11, como puede verse aquí:
El siguiente paso: instalar la librería.
Instalar phpunit mediante el phar
La primera opción disponible es descargar el paquete cerrado (el archivo .phar) de aquí y hacerlo ejecutable.
Esta opción puede resultar útil si quieres dejar una única versión de phpunit disponible para todos tus proyectos.
Instalar phpunit usando composer
Por lejos, la forma que recomiendo (y utilizo) es hacerlo a través de composer.
De esta forma, la dependencia quedará circunscripta al proyecto en el que estás trabajando en este momento, a la vez que puedes compartir esta configuración con el resto de tu equipo.
Usa composer require --dev phpunit/phpunit ^11
y composer se encargará de todo.
Para verificar tu instalación usa el comando ./vendor/bin/phpunit --version
Si ves algo como
PHPUnit 11.4.4 by Sebastian Bergmann and contributors.
PHPUnit 11.4.4 by Sebastian Bergmann and contributors.
Estás listo para avanzar.
Cómo escribir un test con PHPUnit
Escribir un test de PHPUnit supone crear una nueva clase que extienda de TestCase
:
<?php declare(strict_types=1); use PHPUnit\Framework\TestCase; final class MyTest extends TestCase { }
Para ejecutar tus tests puedes utilizar el comando ./vendor/bin/phpunit MyTest.php
y obtendrás una salida como:
PHPUnit 11.4.4 by Sebastian Bergmann and contributors. Runtime: PHP 8.4.1 There was 1 PHPUnit test runner warning: 1) No tests found in class "MyTest". No tests executed!
Bastante razonable ¿no? Al fin y al cabo, se ha definido un TestCase pero ningún test dentro. Corrijamos eso.
Por convención, PHPUnit entenderá que cualquier método de una clase TestCase cuyo nombre comience por test
debe ser ejecutado por él, es decir, lo próximo que deberías hacer es agregar un método como este:
<?php declare(strict_types=1); use PHPUnit\Framework\TestCase; final class MyTest extends TestCase { public function testSomething(): void { } }
Al ejecutar este test verás algo como:
PHPUnit 11.4.4 by Sebastian Bergmann and contributors. Runtime: PHP 8.4.1 R 1 / 1 (100%) Time: 00:00.003, Memory: 8.00 MB There was 1 risky test: 1) MyTest::testSomething This test did not perform any assertions /home/mauro/phpunit-poc/MyTest.php:6 OK, but there were issues! Tests: 1, Assertions: 0, Risky: 1.
Es decir, se ha ejecutado un test, sólo que este test no ha verificado nada, es decir, no hay realizado ningún assertion.
Para que efectivamente aporte algo de información, dentro del cuerpo del test debe utilizarse alguno de los métodos assert*
que provee phpUnit, por ejemplo:
<?php declare(strict_types=1); use PHPUnit\Framework\TestCase; final class MyTest extends TestCase { public function testSomething(): void { $this->assertTrue(true); } }
Y ahora sí, llegarás a una salida algo más parecida a lo deseable:
PHPUnit 11.4.4 by Sebastian Bergmann and contributors. Runtime: PHP 8.4.1 . 1 / 1 (100%) Time: 00:00.003, Memory: 8.00 MB OK (1 test, 1 assertion)
Por supuesto que este test en la realidad no aporta mucho. Depende de vos hacer tests que sean relevantes para tu aplicación.
Ejemplo de un test con PHPUnit
Veamos un ejemplo algo más realista de lo que se puede hacer con phpUnit.
Imaginemos que tienes una función que, recibe una lista de números de teléfono y una lista de prefijos y retorna aquellos que comienzan por alguno de los prefijos indicados por el segundo argumento.
Un test para dicha función podría ser este:
<?php declare(strict_types=1); use PHPUnit\Framework\TestCase; final class MyTest extends TestCase { public function testPhoneFilter(): void { $filteredPhoneNumbers = filter_phone_numbers( [ '(34) 665-55-22-112', '34 992 11 22 33', '+54 9 11 5494 2211', '054 121 123123' ], [ '34', '054' ], ); $this->assertEquals( [ '34 992 11 22 33', '054 121 123123'] , $filteredPhoneNumbers ); } }
Por dónde continuar aprendiendo
PHPUnit ofrece una cantidad de posibilidades realmente interesante pero, para no marearte con todo al comienzo te recomiendo continuar aprendiendo sobre dobles de test y sobre la configuración de phpUnit.
Ya habrá tiempo para lo demás.
- Cómo enviarencabezados SOAP desde PHP - 09/12/2024
- Por qué PHP 8 no satisface el requisito ^7.3 de composer - 09/12/2024
- Cómo usar PHPUnit - 03/12/2024