TestCase
V jednoduchých testech mohou aserce následovat jedna za druhou. Někdy je ale výhodnější aserce zabalit do testovací třídy a tak je strukturovat.
Třída musí být potomkem Tester\TestCase
a zjednodušeně o ní mluvíme jako o testcase. Třída
musí obsahovat testovací metody začínající na test
. Tyto metody budou spuštěny jako testy:
use Tester\Assert;
class RectangleTest extends Tester\TestCase
{
public function testOne()
{
Assert::same(/* ... */);
}
public function testTwo()
{
Assert::match(/* ... */);
}
}
# Spuštění testovacích metod
(new RectangleTest)->run();
Takto napsaný test lze dále obohatit o metody setUp()
a tearDown()
. Jsou volány před, resp. za
každou testovací metodou:
use Tester\Assert;
class NextTest extends Tester\TestCase
{
public function setUp()
{
# Příprava
}
public function tearDown()
{
# Úklid
}
public function testOne()
{
Assert::same(/* ... */);
}
public function testTwo()
{
Assert::match(/* ... */);
}
}
# Spuštění testovacích metod
(new NextTest)->run();
/*
Pořadí volání metod
-------------------
setUp()
testOne()
tearDown()
setUp()
testTwo()
tearDown()
*/
Pokud dojde k chybě v setUp()
nebo tearDown()
fázi, test celkově selže. Pokud dojde k chybě
v testovací metodě, i přes to se metoda tearDown()
spustí, avšak s potlačením chyb v ní.
Doporučujeme na začátek testu napsat anotaci @testCase, potom bude spouštěč testů z příkazové řádky pouštět jednotlivé metody testcase v samostatných procesech a paralelně ve více vláknech. To může výrazně urychlit celý proces testování.
<?php
/** @testCase */
Anotace metod
U testovacích metod máme k dispozici několik anotací, které nám testování usnadní. Zapisujeme je k testovací metodě.
@throws
Je ekvivalentem použití Assert::exception()
uvnitř testovací metody. Zápis je ale přehlednější:
/**
* @throws RuntimeException
*/
public function testOne()
{
// ...
}
/**
* @throws LogicException Wrong argument order
*/
public function testTwo()
{
// ...
}
@dataProvider
Chceme-li testovací metodu spustit vícekrát, ale s jinými parametry, hodí se právě tato anotace. (Nezaměňujte se stejnojmennou anotací pro soubory.)
Za ní uvedeme název metody, která vrací argumenty pro testovací metodu. Metoda musí vrátit pole nebo Traversable. Jednoduchý příklad:
public function getLoopArgs()
{
return [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
}
/**
* @dataProvider getLoopArgs
*/
public function testLoop($a, $b, $c)
{
// ...
}
Druhá varianta anotace @dataProvider přijímá jako parametr cestu k INI souboru (relativně k souboru s testem).
Metoda je volána tolikrát, kolik je v INI souboru sekcí. Soubor loop-args.ini
:
[one]
a=1
b=2
c=3
[two]
a=4
b=5
c=6
[three]
a=7
b=8
c=9
a metoda, která INI soubor využívá:
/**
* @dataProvider loop-args.ini
*/
public function testLoop($a, $b, $c)
{
// ...
}
Obdobně můžeme namísto INI souboru odkázat na PHP skript. Ten musí vrátit pole nebo Traversable. Soubor
loop-args.php
:
return [
['a' => 1, 'b' => 2, 'c' => 3],
['a' => 4, 'b' => 5, 'c' => 6],
['a' => 7, 'b' => 8, 'c' => 9],
];