Adnotări de testare
Adnotările determină modul în care testele vor fi gestionate de către programul de execuție a testelor din linia de comandă. Ele sunt scrise la începutul fișierului de test.
Adnotările nu țin cont de majuscule și minuscule. De asemenea, acestea nu au niciun efect dacă testul este rulat manual ca un script PHP obișnuit.
Exemplu:
/**
* TEST: Basic database query test.
*
* @dataProvider files/databases.ini
* @exitCode 56
* @phpVersion < 5.5
*/
require __DIR__ . '/../bootstrap.php';
TEST
De fapt, nu este o adnotare. Setează doar titlul testului care este tipărit la eșec sau în jurnale.
@skip
Testul este omis. Este utilă pentru dezactivarea temporară a testului.
@phpVersion
Testul este omis dacă nu este executat de versiunea PHP corespunzătoare. Scriem adnotarea ca
@phpVersion [operator] version
. Putem omite operatorul, implicit este >=
. Exemple:
/**
* @phpVersion 5.3.3
* @phpVersion < 5.5
* @phpVersion != 5.4.5
*/
@phpExtensiune
Testul este omis dacă toate extensiile PHP menționate nu sunt încărcate. Într-o singură adnotare pot fi scrise mai multe extensii sau putem folosi adnotarea de mai multe ori.
/**
* @phpExtension pdo, pdo_pgsql, pdo_mysql
* @phpExtension json
*/
@dataProvider
Această adnotare se potrivește atunci când dorim să executăm testul de mai multe ori, dar cu date diferite. (A nu se confunda cu adnotarea cu același nume pentru TestCase).
Scriem adnotarea ca @dataProvider file.ini
. Calea fișierului INI este relativă la fișierul de test. Testul se
execută de atâtea ori cât numărul de secțiuni conținute în fișierul INI. Să presupunem că fișierul 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:"
și fișierul database.phpt
în același director:
/**
* @dataProvider databases.ini
*/
$args = Tester\Environment::loadData();
Testul se execută de trei ori, iar $args
va conține valori din secțiunile mysql
,
postgresql
sau sqlite
.
Mai există o variantă atunci când scriem adnotările cu semnul întrebării ca @dataProvider? file.ini
. În
acest caz, testul este sărit dacă fișierul INI nu există.
Posibilitățile de adnotare nu au fost menționate încă toate. Putem scrie condiții după fișierul INI. Testul se execută pentru secțiunea dată numai dacă toate condițiile corespund. Să extindem fișierul 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:"
și vom folosi adnotarea cu condiția:
/**
* @dataProvider databases.ini postgresql, >=9.0
*/
Testul se execută o singură dată pentru secțiunea postgresql 9.1
. Celelalte secțiuni nu corespund
condițiilor.
În mod similar, putem trece calea către un script PHP în loc de INI. Acesta trebuie să returneze array sau Traversable.
Fișierul databases.php
:
return [
'postgresql 8.4' => [
'dsn' => '...',
'user' => '...',
],
'postgresql 9.1' => [
'dsn' => '...',
'user' => '...',
],
];
@multiple
O scriem ca @multiple N
unde N
este un număr întreg. Testul se execută exact de N ori.
@testCase
Adnotarea nu are parametri. O folosim atunci când scriem un test sub formă de clase TestCase. În acest caz, executorul de teste din linia de comandă va rula metodele individuale în procese separate și în paralel în mai multe fire de execuție. Acest lucru poate accelera semnificativ întregul proces de testare.
@exitCode
Îl scriem ca @exitCode N
în cazul în care N
is the exit code of the test. For example if
exit(10)
este apelat în test, scriem adnotarea ca @exitCode 10
. Se consideră că testul eșuează
dacă se încheie cu un cod diferit. Codul de ieșire 0 (zero) este verificat dacă omitem adnotarea
@httpCode
Adnotarea este evaluată numai dacă binarul PHP este CGI. În caz contrar, este ignorată. O scriem ca
@httpCode NNN
unde NNN
este codul HTTP așteptat. Codul HTTP 200 este verificat dacă nu includem
adnotarea. Dacă scriem NNN
ca un șir de caractere evaluat ca zero, de exemplu any
, codul HTTP nu este
verificat deloc.
@outputMatch a @outputMatchFile
Comportamentul adnotărilor este în concordanță cu aserțiunile Assert::match()
și
Assert::matchFile()
. Dar modelul se găsește în ieșirea standard a testului. Un caz de utilizare adecvat este
atunci când presupunem că testul se încheie cu o eroare fatală și trebuie să verificăm ieșirea acestuia.
@phpIni
Setează valorile de configurare INI pentru test. De exemplu, îl scriem ca @phpIni precision=20
și
funcționează în același mod ca și cum am trece valoarea din linia de comandă prin parametrul
-d precision=20
.