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 passatos– test saltatoF– 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 ASCIIconsole-lines: simile a console, ma il risultato di ogni test è su una riga separata con informazioni aggiuntivetap: formato TAP adatto all'elaborazione automaticajunit: formato JUnit XML, adatto anch'esso all'elaborazione automaticalog: scrive l'andamento dei test. Comprende tutti i test falliti, saltati e anche riuscitinone: 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 Xdebug o PCOV, 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:
- PCOV
- PHPDBG
- 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.