Ejecutar pruebas

La parte más visible de Nette Tester es el ejecutor de pruebas de la línea de comandos. Es extremadamente rápido y robusto, porque ejecuta automáticamente todas las pruebas como procesos separados en paralelo, usando varios hilos. También puede ejecutarse en modo watch.

El ejecutor se invoca desde la línea de comandos. Pásele como parámetro el directorio que contiene las pruebas. Para el directorio actual basta con escribir un punto:

vendor/bin/tester .

El ejecutor recorre el directorio indicado y todos sus subdirectorios buscando pruebas, que son los archivos terminados en *.phpt o *Test.php. También lee y evalúa sus anotaciones para determinar qué pruebas ejecutar y cómo.

Cada archivo de prueba se ejecuta en su propio proceso PHP aislado, y el ejecutor lanza varios a la vez, así que la unidad de paralelismo es el archivo. Por eso, el código de un mismo archivo se ejecuta secuencialmente. Un TestCase vive en un solo archivo, así que de forma predeterminada sus métodos se ejecutan uno tras otro en un único proceso; márquelo con la anotación @testCase para que el ejecutor ejecute cada método de prueba como un proceso paralelo aparte.

Después ejecuta las pruebas. Durante la ejecución imprime caracteres en el terminal para señalar el progreso:

  • . – prueba superada
  • s – prueba omitida
  • F – prueba fallida

La salida puede tener este aspecto:

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.6.1

PHP 8.5.2 (cli) | php | 8 threads

........s..........................

OK (35 tests, 1 skipped, 1.7 seconds)

Al ejecutarlo de nuevo, ejecuta primero las pruebas que fallaron en la ejecución anterior, para que sepa de inmediato si ha arreglado el error.

El código de salida de Tester es cero si no falla ninguna prueba. En caso contrario es distinto de cero.

Opciones de la línea de comandos

Puede obtener un resumen de las opciones de la línea de comandos ejecutando Tester sin parámetros o con la opción -h:

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.6.1

Usage:
    tester [options] [<test file> | <directory>]...

Options:
    -p <path>                    Specify PHP interpreter to run (default: php).
    -c <path>                    Use custom php.ini, ignore system configuration.
    -C                           With -c, include system configuration as well.
    -d <key=value>...            Define INI entry 'key' with value 'value'.
    -s                           Show information about skipped tests.
    --stop-on-fail               Stop execution upon the first failure.
    -j <num>                     Run <num> jobs in parallel (default: 8).
    -o <console|console-lines|tap|junit|log|none>  (e.g. -o junit:output.xml)
                                 Specify one or more output formats with optional file name.
    -w | --watch <path>          Watch directory.
    -i | --info                  Show tests environment info and exit.
    --setup <path>               Script for runner setup.
    --temp <path>                Path to temporary directory. Default by sys_get_temp_dir().
    --colors [1|0]               Enable or disable colors.
    --coverage <path>            Generate code coverage report to file.
    --coverage-src <path>        Path to source code.
    -h | --help                  This help.

-p <path>

Indica el binario de PHP que se usará para ejecutar las pruebas. De forma predeterminada es php.

tester -p /home/user/php-7.2.0-beta/php-cgi tests

-c <path>

Usa un archivo php.ini propio e ignora la configuración del sistema. Es útil para ejecutar las pruebas con ajustes concretos. Véase php.ini propio para más información.

-C

Usado junto con -c, incluye también la configuración del sistema (no la ignora). Véase la sección php.ini propio.

-d <key=value>

Establece el valor de una directiva de configuración de PHP para las pruebas. Este parámetro se puede usar varias veces.

tester -d max_execution_time=20

-s

Muestra información sobre las pruebas omitidas.

--stop-on-fail

Tester detiene las pruebas en la primera que falle.

-j <num>

Indica el número de procesos paralelos en los que se ejecutan las pruebas. El valor predeterminado es 8. Para ejecutar las pruebas secuencialmente use el valor 1.

-o <console|console-lines|tap|junit|log|none>

Establece el formato de salida. El predeterminado es el formato console. Puede indicar el nombre del archivo en el que se escribirá la salida (p. ej. -o junit:output.xml). La opción -o se puede repetir varias veces para generar varios formatos a la vez.

  • console: igual que el formato predeterminado, pero en este caso no se imprime el logo ASCII
  • console-lines: parecido a console, pero el resultado de cada prueba se lista en una línea aparte con información adicional
  • tap: formato TAP, adecuado para el procesamiento automático
  • junit: formato JUnit XML, también adecuado para el procesamiento automático
  • log: imprime el avance de las pruebas. Incluye todas las pruebas fallidas, omitidas y también las correctas
  • none: no se imprime nada

-w | --watch <path>

Tras terminar las pruebas, Tester no sale, sino que sigue ejecutándose y vigila los archivos PHP del directorio indicado. Cuando un archivo cambia, vuelve a ejecutar las pruebas. Este parámetro se puede usar varias veces si quiere vigilar varios directorios.

Útil al refactorizar una biblioteca o al depurar pruebas.

tester --watch src tests

-i | --info

Muestra información sobre el entorno de ejecución de las pruebas. Por ejemplo:

tester -p /usr/bin/php7.1 -c tests/php.ini --info

PHP binary:
/usr/bin/php7.1

PHP version:
7.1.7-1+0~20170711133844.5+jessie~1.gbp5284f4 (cli)

Code coverage engines:
(not available)

Loaded php.ini files:
/var/www/dev/demo/tests/php.ini

PHP temporary directory:
/tmp

Loaded extensions:
Core, ctype, date, dom, ereg, fileinfo, filter, hash, ...

--setup <path>

Tester carga al arrancar el script PHP indicado. Dentro de ese script está disponible la variable Tester\Runner\Runner $runner. Supongamos un archivo tests/runner-setup.php con el siguiente contenido:

$runner->outputHandlers[] = new MyOutputHandler;

Ejecutamos Tester con:

tester --setup tests/runner-setup.php tests

--temp <path>

Establece la ruta al directorio de los archivos temporales de Tester. El valor predeterminado lo devuelve sys_get_temp_dir(). Se le avisará si el valor predeterminado no es válido.

Si no está seguro de qué directorio se está usando, ejecute Tester con el parámetro --info.

--colors 1|0

De forma predeterminada, Tester detecta si el terminal admite colores y colorea su salida en consecuencia. Esta opción anula esa detección automática. Puede fijar el coloreado globalmente con la variable de entorno NETTE_TESTER_COLORS.

--coverage <path>

Tester genera un informe que muestra cuánto código fuente cubren las pruebas. Esta opción requiere tener instalada la extensión de PHP XdebugPCOV, o bien el SAPI PHPDBG, que es más rápido. La extensión del archivo de destino determina su formato: HTML o Clover XML.

tester tests --coverage coverage.html  # HTML report
tester tests --coverage coverage.xml   # Clover XML report

La prioridad para elegir el motor de cobertura es la siguiente:

  1. PCOV
  2. PHPDBG
  3. Xdebug

Al usar PHPDBG, las pruebas extensas pueden fallar por agotamiento de memoria. Recoger la información de cobertura de código consume mucha memoria. En ese caso puede ayudar llamar a Tester\CodeCoverage\Collector::flush() dentro de su prueba. Escribe en disco los datos recogidos y libera memoria. La llamada solo tiene efecto con el motor PHPDBG; con PCOV, Xdebug o cuando no se está recogiendo datos, no hace nada.

Vea un `informe HTML de ejemplo con la cobertura de código.

--coverage-src <path>

Se usa junto con la opción --coverage. <path> es la ruta al código fuente para el que se genera el informe. Se puede usar varias veces.

php.ini propio

Puede usar un archivo php.ini propio para sus pruebas. Si necesita extensiones concretas o ajustes INI especiales, recomendamos crear su propio archivo php.ini y distribuirlo con las pruebas. Después ejecute Tester con la opción -c, por ejemplo tester -c tests/php.ini tests. El archivo INI puede tener este aspecto:

[PHP]

extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll

memory_limit=512M

Al usar -c, Tester ignora la configuración del sistema (ejecuta PHP con la bandera -n). Si quiere incluir también la configuración del sistema, añada la opción -C: tester -c tests/php.ini -C tests. Incluso combinando -c y -C, en UNIX no se cargan los demás archivos INI de /etc/php/conf.d/*.ini. Es un comportamiento de PHP, no algo propio de Tester.

Antes de la versión 2.6, sin -c, Tester ejecutaba PHP con la bandera -n, es decir, sin php.ini; la opción -C lo suprimía. Desde la versión 2.6, el php.ini del sistema se carga de forma predeterminada. El comportamiento al usar -c no ha cambiado.