Eseguire i test

La parte più visibile di Nette Tester è il runner dei test da riga di comando. È estremamente veloce e robusto, perché esegue automaticamente tutti i test come processi separati in parallelo su più thread. Sa anche eseguirsi in modalità watch.

Il runner si richiama dalla riga di comando. Come parametro indicate la directory che contiene i test. Per la directory corrente basta un punto:

vendor/bin/tester .

Il runner esplora la directory indicata e tutte le sue sottodirectory e cerca i test, cioè i file che finiscono con *.phpt oppure *Test.php. Legge e valuta anche le loro annotazioni per determinare quali test eseguire e come.

Ogni file di test gira nel proprio processo PHP isolato e il runner ne esegue diversi contemporaneamente, quindi l'unità di parallelismo è il file. Il codice dentro un singolo file gira perciò in sequenza. Un TestCase vive in un solo file, quindi per impostazione predefinita i suoi metodi girano uno dopo l'altro in un unico processo; contrassegnatelo con l'annotazione @testCase perché il runner esegua invece ogni metodo di test come processo parallelo separato.

Poi esegue i test. Durante l'esecuzione stampa nel terminale dei caratteri che indicano l'avanzamento:

  • . – test passato
  • s – test saltato
  • F – test fallito

L'output può apparire così:

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

PHP 8.5.2 (cli) | php | 8 threads

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

OK (35 tests, 1 skipped, 1.7 seconds)

Alla nuova esecuzione parte per primi dai test falliti nell'esecuzione precedente, così sapete subito se avete corretto l'errore.

Il codice di uscita di Tester è zero se nessun test fallisce. Altrimenti è diverso da zero.

Opzioni da riga di comando

Una panoramica delle opzioni da riga di comando la ottenete lanciando Tester senza parametri oppure con l'opzione -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 il binario PHP che verrà usato per eseguire i test. Per impostazione predefinita è php.

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

-c <path>

Usa un file php.ini personalizzato e ignora la configurazione di sistema. Torna utile per eseguire i test con impostazioni specifiche. Maggiori informazioni in Own php.ini.

-C

Usato insieme a -c include anche la configurazione di sistema (non la ignora). Vedi la sezione Own php.ini.

-d <key=value>

Imposta il valore di una direttiva di configurazione PHP per i test. Questo parametro si può usare più volte.

tester -d max_execution_time=20

-s

Mostra le informazioni sui test saltati.

--stop-on-fail

Tester interrompe i test al primo test fallito.

-j <num>

Indica quanti processi paralleli usare per eseguire i test. Il valore predefinito è 8. Per eseguire i test in sequenza usate il valore 1.

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

Imposta il formato dell'output. Quello predefinito è il formato console. Potete indicare il nome del file in cui scrivere l'output (per esempio -o junit:output.xml). L'opzione -o si può ripetere più volte per generare più formati in una volta.

  • console: come il formato predefinito, ma in questo caso non viene stampato il logo ASCII
  • console-lines: simile a console, ma il risultato di ogni test è su una riga separata con informazioni aggiuntive
  • tap: formato TAP adatto all'elaborazione automatica
  • junit: formato JUnit XML, adatto anch'esso all'elaborazione automatica
  • log: scrive l'andamento dei test. Comprende tutti i test falliti, saltati e anche riusciti
  • none: non viene stampato nulla

-w | --watch <path>

Dopo aver completato i test, Tester non esce ma continua a girare sorvegliando i file PHP nella directory indicata. Quando un file cambia, esegue di nuovo i test. Questo parametro si può usare più volte se volete sorvegliare più directory.

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

tester --watch src tests

-i | --info

Mostra le informazioni sull'ambiente di esecuzione dei test. Per 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>

All'avvio Tester carica lo script PHP indicato. Dentro questo script è disponibile la variabile Tester\Runner\Runner $runner. Supponiamo il file tests/runner-setup.php con questo contenuto:

$runner->outputHandlers[] = new MyOutputHandler;

Lanciamo Tester con:

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

--temp <path>

Imposta il percorso della directory per i file temporanei di Tester. Il valore predefinito lo restituisce sys_get_temp_dir(). Se il valore predefinito non è valido, verrete avvisati.

Se non siete sicuri di quale directory venga usata, lanciate Tester con il parametro --info.

--colors 1|0

Per impostazione predefinita Tester rileva se il terminale supporta i colori e colora l'output di conseguenza. Questa opzione ha la precedenza sul rilevamento automatico. La colorazione la potete impostare globalmente con la variabile d'ambiente NETTE_TESTER_COLORS.

--coverage <path>

Tester genera un report che mostra quanto codice sorgente è coperto dai test. Questa opzione richiede che sia installata l'estensione PHP XdebugPCOV, oppure la SAPI PHPDBG, che è più veloce. Il formato è determinato dall'estensione del file di destinazione: HTML o Clover XML.

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

La priorità nella scelta del motore di coverage è questa:

  1. PCOV
  2. PHPDBG
  3. Xdebug

Con PHPDBG i test estesi possono fallire per esaurimento della memoria. Raccogliere le informazioni sulla copertura del codice consuma molta memoria. In tal caso può aiutare chiamare Tester\CodeCoverage\Collector::flush() dentro il vostro test. Scrive su disco i dati raccolti e libera la memoria. La chiamata ha effetto solo con il motore PHPDBG; con PCOV, Xdebug o quando la raccolta dei dati non è in corso non fa nulla.

Guardate un `report HTML di esempio con la copertura del codice.

--coverage-src <path>

Si usa insieme all'opzione --coverage. <path> è il percorso del codice sorgente per cui viene generato il report. Si può usare più volte.

Own php.ini

Per i vostri test potete usare un file php.ini personalizzato. Se avete bisogno di estensioni specifiche o di impostazioni INI particolari, consigliamo di creare un vostro file php.ini e distribuirlo con i test. Poi lanciate Tester con l'opzione -c, per esempio tester -c tests/php.ini tests. Il file INI può apparire così:

[PHP]

extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll

memory_limit=512M

Con -c Tester ignora la configurazione di sistema (esegue PHP con il flag -n). Se volete includere anche la configurazione di sistema, aggiungete l'opzione -C: tester -c tests/php.ini -C tests. Anche combinando -c e -C, su UNIX gli altri file INI da /etc/php/conf.d/*.ini non vengono caricati. È un comportamento di PHP, non specifico di Tester.

Prima della versione 2.6, senza -c Tester eseguiva PHP con il flag -n, cioè senza php.ini; l'opzione -C lo impediva. Dalla versione 2.6 il php.ini di sistema viene caricato per impostazione predefinita. Il comportamento con -c resta invariato.