Anotace testů

Anotace určují, jak bude s testy zacházet spouštěč testů z příkazové řádky. Zapisují se na začátek souboru s testem.

U anotací se nebere ohled na velikost písmen. Také nemají žádný vliv, pokud je test spuštěn ručně jako běžný PHP skript.

Příklad:

/**
 * TEST: Basic database query test.
 *
 * @dataProvider files/databases.ini
 * @exitCode 56
 * @phpVersion < 5.5
 */

require __DIR__ . '/../bootstrap.php';

TEST

To vlastně ani není anotace, pouze určuje nadpis testu, který se vypisuje při selhání nebo do logu.

@skip

Test se přeskočí. Hodí se pro dočasné vyřazení testů.

@phpVersion

Test se přeskočí pokud není spuštěn s odpovídající verzí PHP. Anotaci zapisujeme jako @phpVersion [operator] verze. Operátor můžeme vynechat, výchozí je >=. Příklady:

/**
 * @phpVersion 5.3.3
 * @phpVersion < 5.5
 * @phpVersion != 5.4.5
 */

@phpExtension

Test se přeskočí, pokud nejsou načtena všechna uvedená PHP rozšíření. Více rozšíření můžeme uvést v jedné anotaci, nebo ji použít vícekrát.

/**
 * @phpExtension pdo, pdo_pgsql, pdo_mysql
 * @phpExtension json
 */

@dataProvider

Chceme-li testovací soubor spustit vícekrát, ale s jinými vstupními daty, hodí se právě tato anotace. (Nezaměňujte se stejnojmennou anotací pro TestCase.)

Zapisujeme jako @dataProvider file.ini, cesta k souboru se bere relativně k souboru s testem. Test bude spuštěn tolikrát, kolik je sekcí v INI souboru. Předpokládejme INI soubor 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:"

a ve stejném adresáři test database.phpt :

/**
 * @dataProvider databases.ini
 */

$args = Tester\Environment::loadData();

Test bude spuštěn třikrát a $args bude obsahovat vždy hodnoty ze sekce mysql, postgresql nebo sqlite.

Existuje ještě varianta, kdy anotaci zapíšeme s otazníkem jako @dataProvider? file.ini. V tomto případě se test přeskočí, pokud INI soubor neexistuje.

Tím možnosti anotace nekončí. Za název INI souboru můžeme specifikovat podmínky, za kterých bude test pro danou sekci spuštěn. Rozšíříme INI soubor:

[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:"

a použijeme anotaci s podmínkou:

/**
 * @dataProvider  databases.ini  postgresql, >=9.0
 */

Test bude spuštěn pouze jednou a to pro sekci postgresql 9.1. Ostatní sekce filtrem podmínky neprojdou.

Obdobně můžeme namísto INI souboru odkázat na PHP skript. Ten musí vrátit pole nebo Traversable. Soubor databases.php:

return [
	'postgresql 8.4' => [
		'dsn' => '...',
		'user' => '...',
	],

	'postgresql 9.1' => [
		'dsn' => '...',
		'user' => '...',
	],
];

@multiple

Zapisujeme jako @multiple N, kde N je celé číslo. Test bude spuštěn právě N-krát.

@testCase

Anotace nemá parametry. Použijeme ji, pokud testy píšeme jako TestCase třídy. V tom případě bude spouštěč testů z příkazové řádky pouštět jednotlivé metody v samostatných procesech a paralelně ve více vláknech. To může výrazně urychlit celý proces testování.

@exitCode

Zapisujeme jako @exitCode N, kde N je návratový kód spuštěného testu. Je-li v testu například voláno exit(10), anotaci zapíšeme jako @exitCode 10 a pokud test skončí s jiným kódem, je to považováno za selhání. Pokud anotaci neuvedeme, je ověřen návratový kód 0 (nula).

@httpCode

Anotace se uplatní pouze pokud je PHP binárka CGI. Jinak se ignoruje. Zapisujeme jako @httpCode NNN kde NNN je očekávaný HTTP kód. Pokud anotaci neuvedeme, ověřuje se HTTP kód 200. Pokud NNN zapíšeme jako řetězec vyhodnocený na nulu, například any, HTTP kód se neověřuje.

@outputMatch a @outputMatchFile

Funkce anotací je shodná s asercemi Assert::match() a Assert::matchFile(). Vzor (pattern) se ale hledá v textu, který test poslal na svůj standardní výstup. Uplatnění najde, pokud předpokládáme, že test skončí fatal errorem a my potřebujeme ověřit jeho výstup.

@phpIni

Pro test nastavuje konfigurační INI hodnoty. Zapisujeme například jako @phpIni precision=20 a funguje stejně, jako kdybychom zadali hodnotu z příkazové řádky přes parametr -d precision=20.