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 ASCIIconsole-lines
: similar a console, pero el resultado de cada prueba se indica en una línea separada con información adicionaltap
: formato TAP adecuado para el procesamiento automáticojunit
: formato XML JUnit, también adecuado para el procesamiento automáticolog
: Salidas del progreso de las pruebas. Todas las pruebas fallidas, omitidas y también las exitosasnone
: 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:
- PCOV
- PHPDBG
- 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.