Ejecución de pruebas

La parte más visible de Nette Tester es el ejecutor de pruebas desde la línea de comandos. Es extraordinariamente rápido y robusto, ya que ejecuta automáticamente todas las pruebas como procesos separados y en paralelo en múltiples hilos. También puede ejecutarse a sí mismo en el llamado modo watch.

El ejecutor de pruebas se llama desde la línea de comandos. Como parámetro indicamos el directorio con las pruebas. Para el directorio actual basta con indicar un punto:

vendor/bin/tester .

El ejecutor de pruebas buscará en el directorio especificado y en todos los subdirectorios y encontrará las pruebas, que son los archivos *.phpt y *Test.php. Al mismo tiempo, lee y evalúa sus anotaciones, para saber cuáles de ellas y cómo ejecutarlas.

Luego ejecuta las pruebas. Durante la ejecución de las pruebas, imprime continuamente los resultados en el terminal como caracteres:

  • . – la prueba pasó
  • s – la prueba fue omitida (skipped)
  • F – la prueba falló (failed)

La salida puede verse así:

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

Note: No php.ini is used.
PHP 8.3.2 (cli) | php -n | 8 threads

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

OK (35 tests, 1 skipped, 1.7 seconds)

En ejecuciones repetidas, primero ejecuta las pruebas que fallaron en la ejecución anterior, por lo que te enterarás inmediatamente si lograste corregir el error.

Si ninguna prueba falla, el código de retorno de Tester es cero. De lo contrario, el código de retorno es distinto de cero.

Tester ejecuta los procesos PHP sin php.ini. Más detalladamente en la sección php.ini personalizado.

Parámetros de la línea de comandos

Obtenemos un resumen de todas las opciones de la línea de comandos ejecutando Tester sin parámetros, o con el parámetro -h:

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

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

Options:
    -p <path>                    Specify PHP interpreter to run (default: php).
    -c <path>                    Look for php.ini file (or look in directory) <path>.
    -C                           Use system-wide php.ini.
    -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>

Especifica el binario PHP que se utilizará para ejecutar las pruebas. Por defecto es php.

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

-c <path>

Especifica qué php.ini se utilizará al ejecutar las pruebas. Por defecto, no se utiliza ningún php.ini. Más en la sección php.ini personalizado.

-C

Se utiliza el php.ini del sistema. En UNIX también todos los archivos INI relevantes /etc/php/{sapi}/conf.d/*.ini. Más en la sección php.ini personalizado.

-d <key=value>

Establece el valor de la directiva de configuración de PHP para las pruebas. El parámetro puede usarse varias veces.

tester -d max_execution_time=20

-s

Se mostrará información sobre las pruebas omitidas.

--stop-on-fail

Tester detendrá las pruebas en la primera prueba fallida.

-j <num>

Especifica cuántos procesos paralelos con pruebas se ejecutarán. El valor predeterminado es 8. Si queremos que todas las pruebas se ejecuten en serie, usamos el valor 1.

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

Establece el formato de salida. El predeterminado es el formato para la consola. Puedes indicar un nombre de 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 múltiples formatos a la vez.

  • console: idéntico al formato predeterminado, pero en este caso no se muestra el logo ASCII
  • console-lines: similar a console, pero el resultado de cada prueba se indica en una línea separada con información adicional
  • tap: formato TAP adecuado para el procesamiento automático
  • junit: formato XML JUnit, también adecuado para el procesamiento automático
  • log: Salidas del progreso de las pruebas. Todas las pruebas fallidas, omitidas y también las exitosas
  • none: no se imprime nada

-w | --watch <path>

Después de completar las pruebas, Tester no termina, sino que permanece en ejecución y vigila los archivos PHP en el directorio especificado. Al cambiar, vuelve a ejecutar las pruebas. El parámetro puede usarse varias veces si queremos vigilar múltiples directorios.

Es útil al refactorizar una librería o depurar pruebas.

tester --watch src tests

-i | --info

Muestra información sobre el entorno de ejecución para 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 al iniciar carga el script PHP especificado. En él está disponible la variable Tester\Runner\Runner $runner. Supongamos el archivo tests/runner-setup.php con el contenido:

$runner->outputHandlers[] = new MyOutputHandler;

Ejecutamos Tester:

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

--temp <path>

Establece la ruta al directorio para los archivos temporales de Tester. El valor predeterminado lo devuelve sys_get_temp_dir(). Si el valor predeterminado no es válido, serás advertido.

Si no estamos seguros de qué directorio se utiliza, ejecutamos Tester con el parámetro --info.

--colors 1|0

Por defecto, Tester detecta un terminal a color y colorea su salida. Esta opción anula la autodetección. Globalmente podemos configurar la coloración con la variable de entorno del sistema NETTE_TESTER_COLORS.

--coverage <path>

Tester generará un informe con un resumen de cuánto código fuente cubren las pruebas. Esta opción requiere la extensión PHP instalada Xdebug, o PCOV, o PHP 7 con PHPDBG SAPI, que es más rápido. La extensión del archivo de destino determina su formato. Ya sea HTML o Clover XML.

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

La prioridad de selección del mecanismo es la siguiente:

  1. PCOV
  2. PHPDBG
  3. Xdebug

Al usar PHPDBG, en pruebas extensas podemos encontrar un fallo de la prueba debido al agotamiento de la memoria. La recopilación de información sobre el código cubierto consume mucha memoria. En este caso, nos ayuda la llamada a Tester\CodeCoverage\Collector::flush() dentro de la prueba. Escribe los datos recopilados en el disco y libera la memoria. Si la recopilación de datos no se está realizando, o se utiliza Xdebug, la llamada no tiene ningún efecto.

Muestra de informe HTML con cobertura de código.

--coverage-src <path>

Se utiliza junto con la opción --coverage. <path> es la ruta a los códigos fuente para los que se genera el informe. Se puede usar repetidamente.

php.ini personalizado

Tester ejecuta los procesos PHP con el parámetro -n, lo que significa que no se carga ningún php.ini. En UNIX, tampoco los de /etc/php/conf.d/*.ini. Esto asegura un entorno idéntico para la ejecución de las pruebas, pero también deshabilita todas las extensiones PHP normalmente cargadas por el PHP del sistema.

Si deseas conservar la carga de los archivos php.ini del sistema, utiliza el parámetro -C.

Si necesitas algunas extensiones o configuraciones INI especiales para las pruebas, recomendamos crear tu propio archivo php.ini, que se distribuirá con las pruebas. Luego, ejecutamos Tester con el parámetro -c, por ejemplo tester -c tests/php.ini tests, donde el archivo INI puede verse así:

[PHP]

extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll

memory_limit=512M

La ejecución de Tester en UNIX con el php.ini del sistema, por ejemplo tester -c /etc/php/cli/php.ini, no carga los demás INI de /etc/php/conf.d/*.ini. Esta es una característica de PHP, no de Tester.