5. Organizar las Pruebas

Uno de los objetivos de PHPUnit es que las pruebas se puedan combinar: queremos ser capaces de ejecutar cualquier cantidad o combinación de pruebas, por ejemplo, todas las pruebas de un proyecto entero o las pruebas para todas las clases de un componente que es parte de un proyecto o solamente probar una clase.

PHPUnit soporta diferentes maneras de organizar y componer las pruebas dentro de una suite de prueba. Este capítulo muestra los enfoques que se usan comúnmente.

Componer una Suite de Prueba Usando el Sistema de Archivos

Probablemente la manera más fácil de componer una suite de prueba es tener todos los archivos fuente con los casos de prueba en una carpeta de prueba. PHPUnit puede descubrir automáticamente y ejecutar las pruebas recorriendo recursivamente el directorio de prueba.

Vamos a dar un vistazo a la suite de prueba de la biblioteca sebastianbergmann/money. Al ver la estructura de la carpeta del proyecto nos damos cuenta que las clases de casos de prueba en la carpeta tests son un espejo del paquete y de la estructura de clases del Sistema Bajo Prueba, en ingles System Under Test (SUT), en la carpeta src:

src                                 tests
`-- Currency.php                    `-- CurrencyTest.php
`-- IntlFormatter.php               `-- IntlFormatterTest.php
`-- Money.php                       `-- MoneyTest.php
`-- autoload.php

Para ejecutar todas las pruebas de la biblioteca solo necesitamos apuntar el ejecutor de pruebas en línea de comandos a la carpeta donde están las pruebas:

$ phpunit --bootstrap src/autoload.php tests
PHPUnit |version|.0 by Sebastian Bergmann.

.................................

Time: 636 ms, Memory: 3.50Mb

OK (33 tests, 52 assertions)

Nota

Si apuntamos el ejecutor de pruebas en línea de comandos a la carpeta, él buscará los archivos *Test.php.

Para ejecutar solamente las pruebas que están en la clase de prueba CurrencyTest del archivo tests/CurrencyTest.php, podemos usar el siguiente comando:

$ phpunit --bootstrap src/autoload.php tests/CurrencyTest
PHPUnit |version|.0 by Sebastian Bergmann.

........

Time: 280 ms, Memory: 2.75Mb

OK (8 tests, 8 assertions)

Para un control de tipo granular sobre que pruebas ejecutar podemos usar la opción --filter:

$ phpunit --bootstrap src/autoload.php --filter testObjectCanBeConstructedForValidConstructorArgument tests
PHPUnit |version|.0 by Sebastian Bergmann.

..

Time: 167 ms, Memory: 3.00Mb

OK (2 test, 2 assertions)

Nota

Una desventaja de este abordaje es que no tenemos control sobre el orden en que las pruebas se ejecutan. Esto puede causar problemas con las pruebas que tienen dependencias, ver Dependencia de Pruebas. En la siguiente sección veremos como podemos dar un orden de ejecución explicito usando un archivo de configuración XML.

Componer una Suite de Prueba con una Configuración XML

El archivo de configuración XML de PHPUnit (Archivo de Configuración XML) se puede usar, además, para componer una suite de prueba. El Example 5.1 muestra un archivo phpunit.xml que agregará todas las clases que se encuentran en los archivos *Test.php luego de recorrer recursivamente la carpeta tests.

Example 5.1 Componer una Suite de Prueba con Configuración XML
<phpunit bootstrap="src/autoload.php">
  <testsuites>
    <testsuite name="money">
      <directory>tests</directory>
    </testsuite>
  </testsuites>
</phpunit>

Si phpunit.xml o phpunit.xml.dist (en este orden) existen en la carpeta de trabajo actual y la opción --configuration no se usa, la configuración será leída automáticamente del aquellos archivos.

Se puede hacer explícito el orden en que las pruebas se ejecutan:

Example 5.2 Componer una Suite de Prueba con Configuración XML
<phpunit bootstrap="src/autoload.php">
  <testsuites>
    <testsuite name="money">
      <file>tests/IntlFormatterTest.php</file>
      <file>tests/MoneyTest.php</file>
      <file>tests/CurrencyTest.php</file>
    </testsuite>
  </testsuites>
</phpunit>