Apéndice 1: PhpUnit

PhpUnit es el framework de test por excelencia de PHP. Pertenece a la familia xUnit y con él puedes desarrollar todo tipo de tests.

Instalación

Nos situamos dentro de la carpeta del proyecto, creándola si es necesario:

1 mkdir dojo
2 cd dojo

Dentro del proyecto asumimos la convención de tener las las carpetas src y tests

1 mkdir src
2 mkdir tests

Si no lo hemos hecho antes, iniciamos el proyecto mediante composer init y como primera dependencia requerimos phpunit.

1 composer init
2 # Fill in with the data needed
3 composer require --dev phpunit/phpunit

Por último, configuraremos los namespaces del proyecto en composer.json, que quedará más o menos así:

 1 {
 2   "name": "talkingbit/dojo",
 3   "description": "A simple space to practice testing",
 4   "minimum-stability": "dev",
 5   "license": "MIT",
 6   "type": "library",
 7   "config": {
 8     "bin-dir": "bin"
 9   },
10   "authors": [
11     {
12       "name": "Fran Iglesias",
13       "email": "franiglesiad@mac.com"
14     }
15   ],
16   "require-dev": {
17     "phpunit/phpunit": "^7.4@dev"
18   },
19   "autoload": {
20     "psr-4": {
21       "TalkingBit\\Dojo\\": "src/"
22     }
23   },
24   "autoload-dev": {
25     "psr-4": {
26       "Tests\\TalkingBit\\Dojo\\": "tests/"
27     }
28   }
29 }

También hemos añadido la clave config, con bin-dir, de este modo, los paquetes como phpunit y otros crearán un alias de su ejecutable en la carpeta bin, con lo que podremos lanzarlos fácilmente con bin/phpunit.

Después de este cambio puedes hacer un composer install o un composer dump-autoload, para ponerte en marcha.

1 composer install

Configuración básica

phpunit necesita un poco de configuración, así que vamos a prepararla ejecutando lo siguiente. Es un interactivo y normalmente nos servirán las respuestas por defecto.

1 bin/phpunit --generate-configuration

Esto generará un archivo de configuración por defecto phpunit.xml (más información en este artículo). Normalmente hago un pequeño cambio para poder tener medida de cobertura en cualquier código y no tener que pedir explícitamente en cada test, poniendo el parámetro forceCoversAnnotation a false:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3          xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/7.4/phpunit.xsd"
 4          bootstrap="vendor/autoload.php"
 5          forceCoversAnnotation="false"
 6          beStrictAboutCoversAnnotation="true"
 7          beStrictAboutOutputDuringTests="true"
 8          beStrictAboutTodoAnnotatedTests="true"
 9          verbose="true">
10     <testsuites>
11         <testsuite name="default">
12             <directory suffix="Test.php">tests</directory>
13         </testsuite>
14     </testsuites>
15 
16     <filter>
17         <whitelist processUncoveredFilesFromWhitelist="true">
18             <directory suffix=".php">src</directory>
19         </whitelist>
20     </filter>
21 </phpunit>

Si es necesario, añadimos el control de versiones:

1 git init

Y con esto, podemos empezar.