Teszt annotációk
Az annotációk határozzák meg, hogyan kezelje a teszteket a parancssori tesztfuttató. A tesztfájl elejére íródnak.
Az annotációknál nem számít a kis- és nagybetűk mérete. Nincs hatásuk sem, ha a tesztet manuálisan futtatják, mint egy szokásos PHP szkriptet.
Példa:
/**
* TEST: Alapvető adatbázis-lekérdezési teszt.
*
* @dataProvider files/databases.ini
* @exitCode 56
* @phpVersion < 5.5
*/
require __DIR__ . '/../bootstrap.php';
TEST
Ez valójában nem is annotáció, csupán a teszt címét határozza meg, amely hiba esetén vagy a naplóba íródik ki.
@skip
A teszt kihagyásra kerül. Hasznos a tesztek ideiglenes kikapcsolására.
@phpVersion
A teszt kihagyásra kerül, ha nem a megfelelő PHP verzióval futtatják. Az annotációt
@phpVersion [operator] verzió formában írjuk. Az operátort elhagyhatjuk, az alapértelmezett >=.
Példák:
/**
* @phpVersion 5.3.3
* @phpVersion < 5.5
* @phpVersion != 5.4.5
*/
@phpExtension
A teszt kihagyásra kerül, ha nem töltődnek be az összes megadott PHP kiterjesztés. Több kiterjesztést is megadhatunk egy annotációban, vagy használhatjuk többször is.
/**
* @phpExtension pdo, pdo_pgsql, pdo_mysql
* @phpExtension json
*/
@dataProvider
Ha a tesztfájlt többször szeretnénk futtatni, de más bemeneti adatokkal, akkor ez az annotáció hasznos. (Ne keverjük össze az azonos nevű annotációval a TestCase számára.)
@dataProvider file.ini formában írjuk, a fájl elérési útja a tesztfájlhoz képest relatív. A teszt
annyiszor fut le, ahány szekció van az INI fájlban. Tegyük fel, hogy van egy databases.ini INI fájlunk:
[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:"
és ugyanabban a könyvtárban a database.phpt teszt:
/**
* @dataProvider databases.ini
*/
$args = Tester\Environment::loadData();
A teszt háromszor fut le, és az $args mindig a mysql, postgresql vagy
sqlite szekció értékeit fogja tartalmazni.
Létezik még egy változat, amikor az annotációt kérdőjellel írjuk, mint @dataProvider? file.ini. Ebben az
esetben a teszt kihagyásra kerül, ha az INI fájl nem létezik.
Ezzel az annotáció lehetőségei nem érnek véget. Az INI fájl neve után megadhatunk feltételeket, amelyek mellett a teszt az adott szekcióhoz fut le. Bővítsük ki az INI fájlt:
[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:"
és használjunk annotációt feltétellel:
/**
* @dataProvider databases.ini postgresql, >=9.0
*/
A teszt csak egyszer fut le, és csak a postgresql 9.1 szekcióhoz. A többi szekció nem megy át a feltétel
szűrőjén.
Hasonlóképpen, INI fájl helyett hivatkozhatunk PHP szkriptre is. Ennek tömböt vagy Traversable-t kell visszaadnia.
databases.php fájl:
return [
'postgresql 8.4' => [
'dsn' => '...',
'user' => '...',
],
'postgresql 9.1' => [
'dsn' => '...',
'user' => '...',
],
];
@multiple
@multiple N formában írjuk, ahol N egy egész szám. A teszt pontosan N-szer fut le.
@testCase
Az annotációnak nincsenek paraméterei. Akkor használjuk, ha a teszteket TestCase osztályokként írjuk. Ebben az esetben a parancssori tesztfuttató az egyes metódusokat külön folyamatokban és párhuzamosan, több szálon futtatja. Ez jelentősen felgyorsíthatja az egész tesztelési folyamatot.
@exitCode
@exitCode N formában írjuk, ahol N a futtatott teszt visszatérési értéke. Ha a tesztben
például exit(10) hívás van, az annotációt @exitCode 10-ként írjuk, és ha a teszt más kóddal
fejeződik be, az hibának minősül. Ha az annotációt nem adjuk meg, a 0 (nulla) visszatérési érték kerül
ellenőrzésre.
@httpCode
Az annotáció csak akkor érvényesül, ha a PHP bináris CGI. Egyébként figyelmen kívül hagyódik.
@httpCode NNN formában írjuk, ahol NNN a várt HTTP kód. Ha az annotációt nem adjuk meg, a
200 HTTP kód kerül ellenőrzésre. Ha az NNN-t nullára kiértékelődő stringként írjuk, például
any, a HTTP kód nem kerül ellenőrzésre.
@outputMatch és @outputMatchFile
Az annotációk funkciója megegyezik az Assert::match() és Assert::matchFile() asszerciókéval.
A minta (pattern) azonban abban a szövegben keresendő, amelyet a teszt a standard kimenetére küldött. Akkor hasznos, ha
feltételezzük, hogy a teszt fatális hibával ér véget, és ellenőriznünk kell annak kimenetét.
@phpIni
A teszthez beállítja a konfigurációs INI értékeket. Például @phpIni precision=20 formában írjuk, és
ugyanúgy működik, mintha a parancssorból adtuk volna meg az értéket a -d precision=20 paraméterrel.