Esecuzione dei test

La parte più visibile di Nette Tester è l'esecutore di test dalla riga di comando. È straordinariamente veloce e robusto, poiché avvia automaticamente tutti i test come processi separati e in parallelo su più thread. Sa anche avviarsi da solo nella cosiddetta modalità watch.

L'esecutore di test viene chiamato dalla riga di comando. Come parametro indichiamo la directory con i test. Per la directory corrente basta inserire un punto:

vendor/bin/tester .

L'esecutore di test esamina la directory specificata e tutte le sottodirectory e cerca i test, che sono i file *.phpt e *Test.php. Allo stesso tempo legge e valuta le loro annotazioni, per sapere quali di essi e come eseguirli.

Successivamente esegue i test. Durante l'esecuzione dei test visualizza continuamente i risultati sul terminale come caratteri:

  • . – test superato
  • s – test saltato (skipped)
  • F – test fallito (failed)

L'output può apparire ad esempio così:

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  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)

All'esecuzione ripetuta, esegue prima i test che sono falliti nell'esecuzione precedente, così scoprirete immediatamente se siete riusciti a correggere l'errore.

Se nessun test fallisce, il codice di ritorno di Tester è zero. Altrimenti, il codice di ritorno è diverso da zero.

Tester avvia i processi PHP senza php.ini. Più dettagliatamente nella sezione php.ini personalizzato.

Parametri della riga di comando

Otteniamo una panoramica di tutte le opzioni della riga di comando eseguendo Tester senza parametri, oppure con il parametro -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>

Specifica il binario PHP che verrà utilizzato per eseguire i test. Il default è php.

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

-c <path>

Specifica quale php.ini verrà utilizzato durante l'esecuzione dei test. Per impostazione predefinita non viene utilizzato alcun php.ini. Maggiori informazioni nella sezione php.ini personalizzato.

-C

Viene utilizzato il php.ini di sistema. Su UNIX anche tutti i file INI pertinenti /etc/php/{sapi}/conf.d/*.ini. Maggiori informazioni nella sezione php.ini personalizzato.

-d <key=value>

Imposta il valore della direttiva di configurazione PHP per i test. Il parametro può essere utilizzato più volte.

tester -d max_execution_time=20

-s

Vengono visualizzate informazioni sui test saltati.

--stop-on-fail

Tester interrompe il test al primo test fallito.

-j <num>

Specifica quanti processi paralleli con i test verranno avviati. Il valore predefinito è 8. Se vogliamo che tutti i test vengano eseguiti in serie, utilizziamo il valore 1.

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

Imposta il formato dell'output. Il predefinito è il formato per la console. Potete specificare il nome del file in cui verrà scritto l'output (ad esempio -o junit:output.xml). L'opzione -o può essere ripetuta più volte per generare più formati contemporaneamente.

  • console: identico al formato predefinito, ma in questo caso non viene visualizzato il logo ASCII
  • console-lines: simile a console, ma il risultato di ogni test è indicato su una riga separata con ulteriori informazioni
  • tap: formato TAP adatto all'elaborazione automatica
  • junit: formato XML JUnit, anch'esso adatto all'elaborazione automatica
  • log: Output dell'avanzamento dei test. Tutti i test falliti, saltati e anche quelli riusciti
  • none: non viene visualizzato nulla

-w | --watch <path>

Al termine del test, Tester non termina, ma rimane in esecuzione e monitora i file PHP nella directory specificata. In caso di modifica, esegue nuovamente i test. Il parametro può essere utilizzato più volte se si desidera monitorare più directory.

È utile durante il refactoring di una libreria o il debug dei test.

tester --watch src tests

-i | --info

Visualizza informazioni sull'ambiente di esecuzione per i test. Ad esempio:

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 all'avvio carica lo script PHP specificato. In esso è disponibile la variabile Tester\Runner\Runner $runner. Supponiamo il file tests/runner-setup.php con il contenuto:

$runner->outputHandlers[] = new MyOutputHandler;

Avviamo Tester:

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

--temp <path>

Imposta il percorso della directory per i file temporanei di Tester. Il valore predefinito viene restituito da sys_get_temp_dir(). Se il valore predefinito non è valido, sarete avvisati.

Se non siamo sicuri di quale directory venga utilizzata, avviamo Tester con il parametro --info.

--colors 1|0

Per impostazione predefinita Tester rileva un terminale a colori e colora il suo output. Questa opzione sovrascrive l'autodetection. Globalmente possiamo impostare la colorazione tramite la variabile d'ambiente di sistema NETTE_TESTER_COLORS.

--coverage <path>

Tester genererà un report con una panoramica di quanto codice sorgente coprono i test. Questa opzione richiede l'estensione PHP installata Xdebug, o PCOV, oppure PHP 7 con PHPDBG SAPI, che è più veloce. L'estensione del file di destinazione determina il suo formato. O HTML o Clover XML.

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

La priorità di selezione del meccanismo è la seguente:

  1. PCOV
  2. PHPDBG
  3. Xdebug

Utilizzando PHPDBG, possiamo riscontrare il fallimento del test a causa dell'esaurimento della memoria nei test estesi. La raccolta di informazioni sulla copertura del codice richiede molta memoria. In questo caso, ci aiuta la chiamata Tester\CodeCoverage\Collector::flush() all'interno del test. Scrive i dati raccolti su disco e libera la memoria. Se la raccolta dati non è in corso, o viene utilizzato Xdebug, la chiamata non ha alcun effetto.

Esempio di report HTML con la copertura del codice.

--coverage-src <path>

Utilizziamo contemporaneamente all'opzione --coverage. <path> è il percorso dei codici sorgente per i quali viene generato il report. Può essere utilizzato ripetutamente.

php.ini personalizzato

Tester avvia i processi PHP con il parametro -n, il che significa che nessun php.ini viene caricato. Su UNIX nemmeno quelli da /etc/php/conf.d/*.ini. Ciò garantisce un ambiente identico per l'esecuzione dei test, ma disabilita anche tutte le estensioni PHP normalmente caricate dal PHP di sistema.

Se desiderate mantenere il caricamento dei file php.ini di sistema, utilizzate il parametro -C.

Se avete bisogno di alcune estensioni o impostazioni INI speciali per i test, consigliamo di creare un proprio file php.ini, che sarà distribuito con i test. Tester viene quindi avviato con il parametro -c, ad esempio tester -c tests/php.ini tests, dove il file INI può apparire così:

[PHP]

extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll

memory_limit=512M

L'avvio di Tester su UNIX con il php.ini di sistema, ad esempio tester -c /etc/php/cli/php.ini non carica gli altri INI da /etc/php/conf.d/*.ini. Questa è una caratteristica di PHP, non di Tester.