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 superatos
– 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 ASCIIconsole-lines
: simile a console, ma il risultato di ogni test è indicato su una riga separata con ulteriori informazionitap
: formato TAP adatto all'elaborazione automaticajunit
: formato XML JUnit, anch'esso adatto all'elaborazione automaticalog
: Output dell'avanzamento dei test. Tutti i test falliti, saltati e anche quelli riuscitinone
: 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:
- PCOV
- PHPDBG
- 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.