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
.