Annotazioni del test
Le annotazioni determinano il modo in cui i test saranno gestiti dal test runner a riga di comando. Vengono scritte all'inizio del file di test.
Le annotazioni sono insensibili alle maiuscole e alle minuscole. Inoltre, non hanno alcun effetto se il test viene eseguito manualmente come un normale script PHP.
Esempio:
/**
* TEST: Basic database query test.
*
* @dataProvider files/databases.ini
* @exitCode 56
* @phpVersion < 5.5
*/
require __DIR__ . '/../bootstrap.php';
TEST
In realtà non è un'annotazione. Imposta solo il titolo del test che viene stampato in caso di fallimento o nei log.
@skip
Il test viene saltato. È utile per disattivare temporaneamente il test.
@phpVersion
Il test viene saltato se non viene eseguito dalla versione PHP corrispondente. Scriviamo l'annotazione come
@phpVersion [operator] version
. Si può omettere l'operatore, l'impostazione predefinita è >=
.
Esempi:
/**
* @phpVersion 5.3.3
* @phpVersion < 5.5
* @phpVersion != 5.4.5
*/
@phpExtension
Il test viene saltato se tutte le estensioni PHP menzionate non sono caricate. È possibile scrivere più estensioni in una singola annotazione, oppure utilizzare l'annotazione più volte.
/**
* @phpExtension pdo, pdo_pgsql, pdo_mysql
* @phpExtension json
*/
@dataProvider
Questa annotazione è adatta quando si vuole eseguire il test più volte, ma con dati diversi. (Da non confondere con l'annotazione omonima per TestCase).
Scriviamo l'annotazione come @dataProvider file.ini
. Il percorso del file INI è relativo al file di test. Il test
viene eseguito tante volte quante sono le sezioni contenute nel file INI. Supponiamo che il file INI
databases.ini
:
[mysql]
dsn = "mysql:host=127.0.0.1"
user = root
password = ******
[postgresql]
dsn = "pgsql:host=127.0.0.1;dbname=test"
user = postgres
password = ******
[sqlite]
dsn = "sqlite::memory:"
e il file database.phpt
nella stessa directory:
/**
* @dataProvider databases.ini
*/
$args = Tester\Environment::loadData();
Il test viene eseguito tre volte e $args
conterrà i valori delle sezioni mysql
,
postgresql
o sqlite
.
Esiste un'ulteriore variante quando si scrivono annotazioni con un punto interrogativo come
@dataProvider? file.ini
. In questo caso, il test viene saltato se il file INI non esiste.
Le possibilità di annotazione non sono state ancora menzionate tutte. È possibile scrivere condizioni dopo il file INI. Il test viene eseguito per la sezione indicata solo se tutte le condizioni corrispondono. Estendiamo il file INI:
[mysql]
dsn = "mysql:host=127.0.0.1"
user = root
password = ******
[postgresql 8.4]
dsn = "pgsql:host=127.0.0.1;dbname=test"
user = postgres
password = ******
[postgresql 9.1]
dsn = "pgsql:host=127.0.0.1;dbname=test;port=5433"
user = postgres
password = ******
[sqlite]
dsn = "sqlite::memory:"
e utilizzeremo l'annotazione con la condizione:
/**
* @dataProvider databases.ini postgresql, >=9.0
*/
Il test viene eseguito solo una volta per la sezione postgresql 9.1
. Le altre sezioni non corrispondono alle
condizioni.
Allo stesso modo, si può passare il percorso a uno script PHP invece di INI. Deve restituire un array o un Traversable. File
databases.php
:
return [
'postgresql 8.4' => [
'dsn' => '...',
'user' => '...',
],
'postgresql 9.1' => [
'dsn' => '...',
'user' => '...',
],
];
@multiplo
Si scrive come @multiple N
dove N
è un numero intero. Il test viene eseguito esattamente
N volte.
@testCase
L'annotazione non ha parametri. Si usa quando si scrive un test come classi TestCase. In questo caso, il test runner a riga di comando eseguirà i singoli metodi in processi separati e in parallelo in più thread. Questo può accelerare notevolmente l'intero processo di test.
@exitCode
Lo scriviamo come @exitCode N
dove N
is the exit code of the test. For example if
exit(10)
viene chiamato nel test, scriviamo l'annotazione come @exitCode 10
. Il test viene considerato
fallito se termina con un codice diverso. Il codice di uscita 0 (zero) è verificato se si tralascia l'annotazione
@httpCode
L'annotazione viene valutata solo se il binario PHP è CGI. Altrimenti viene ignorata. Si scrive come
@httpCode NNN
, dove NNN
è il codice HTTP atteso. Il codice HTTP 200 viene verificato se si omette
l'annotazione. Se si scrive NNN
come una stringa valutata come zero, per esempio any
, il codice HTTP non
viene verificato affatto.
@outputMatch a @outputMatchFile
Il comportamento delle annotazioni è coerente con le asserzioni Assert::match()
e
Assert::matchFile()
. Ma lo schema si trova nell'output standard del test. Un caso d'uso appropriato è quello in cui
si suppone che il test termini con un errore fatale e che sia necessario verificare il suo output.
@phpIni
Imposta i valori di configurazione INI per il test. Ad esempio, lo scriviamo come @phpIni precision=20
e funziona
come se avessimo passato il valore dalla riga di comando con il parametro -d precision=20
.