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.