TestCase
Egyszerű tesztekben az asszertek egymás után következhetnek. Néha azonban előnyösebb az asszerteket egy tesztosztályba csomagolni, és így strukturálni őket.
Az osztálynak a Tester\TestCase
leszármazottjának kell lennie, és egyszerűsítve testcase-nek
nevezzük. Az osztálynak tartalmaznia kell test
-tel kezdődő tesztmetódusokat. Ezek a metódusok tesztekként
lesznek futtatva:
use Tester\Assert;
class RectangleTest extends Tester\TestCase
{
public function testOne()
{
Assert::same(/* ... */);
}
public function testTwo()
{
Assert::match(/* ... */);
}
}
# Tesztmetódusok futtatása
(new RectangleTest)->run();
Az így megírt tesztet tovább lehet gazdagítani setUp()
és tearDown()
metódusokkal. Ezek minden
tesztmetódus előtt, illetve után hívódnak meg:
use Tester\Assert;
class NextTest extends Tester\TestCase
{
public function setUp()
{
# Előkészítés
}
public function tearDown()
{
# Takarítás
}
public function testOne()
{
Assert::same(/* ... */);
}
public function testTwo()
{
Assert::match(/* ... */);
}
}
# Tesztmetódusok futtatása
(new NextTest)->run();
/*
Metódushívások sorrendje
------------------------
setUp()
testOne()
tearDown()
setUp()
testTwo()
tearDown()
*/
Ha hiba történik a setUp()
vagy tearDown()
fázisban, a teszt összességében meghiúsul. Ha hiba
történik a tesztmetódusban, a tearDown()
metódus ennek ellenére lefut, de a benne lévő hibák
elnyomásával.
Javasoljuk, hogy a teszt elejére írjon @testCase annotációt, ekkor a parancssori tesztfuttató az egyes tesztcase 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.
<?php
/** @testCase */
Metódus annotációk
A tesztmetódusoknál rendelkezésünkre áll néhány annotáció, amelyek megkönnyítik a tesztelést. Ezeket a tesztmetódushoz írjuk.
@throws
Ez az Assert::exception()
használatának ekvivalense a tesztmetóduson belül. Az írásmód azonban
áttekinthetőbb:
/**
* @throws RuntimeException
*/
public function testOne()
{
// ...
}
/**
* @throws LogicException Rossz argumentum sorrend
*/
public function testTwo()
{
// ...
}
@dataProvider
Ha a tesztmetódust többször szeretnénk futtatni, de más paraméterekkel, akkor ez az annotáció hasznos. (Ne keverjük össze az azonos nevű annotációval a fájlokra.)
Utána megadjuk annak a metódusnak a nevét, amely visszaadja a tesztmetódus argumentumait. A metódusnak tömböt vagy Traversable-t kell visszaadnia. Egyszerű példa:
public function getLoopArgs()
{
return [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
}
/**
* @dataProvider getLoopArgs
*/
public function testLoop($a, $b, $c)
{
// ...
}
A @dataProvider annotáció második változata paraméterként egy INI fájl elérési útját fogadja el (a
tesztfájlhoz képest relatívan). A metódus annyiszor hívódik meg, ahány szekció van az INI fájlban.
loop-args.ini
fájl:
[one]
a=1
b=2
c=3
[two]
a=4
b=5
c=6
[three]
a=7
b=8
c=9
és a metódus, amely az INI fájlt használja:
/**
* @dataProvider loop-args.ini
*/
public function testLoop($a, $b, $c)
{
// ...
}
Hasonlóképpen, INI fájl helyett hivatkozhatunk PHP szkriptre is. Ennek tömböt vagy Traversable-t kell visszaadnia.
loop-args.php
fájl:
return [
['a' => 1, 'b' => 2, 'c' => 3],
['a' => 4, 'b' => 5, 'c' => 6],
['a' => 7, 'b' => 8, 'c' => 9],
];