TestCase
Az egyszerű tesztekben az állítások egyenként követhetik egymást. Néha azonban hasznos az állításokat tesztosztályba foglalni és így strukturálni.
Az osztálynak a Tester\TestCase
leszármazottjának kell lennie, és egyszerűen testcase-ként
beszélünk róla.
use Tester\Assert;
class RectangleTest extends Tester\TestCase
{
public function testOne()
{
Assert::same(/* ... */);
}
public function testTwo()
{
Assert::match(/* ... */);
}
}
# Run testing methods
(new RectangleTest)->run();
A setUp()
és a tearDown()
metódusokkal gazdagíthatjuk a teszteseteket. Ezeket minden tesztelési
metódus előtt/után hívjuk meg:
use Tester\Assert;
class NextTest extends Tester\TestCase
{
public function setUp()
{
# Preparation
}
public function tearDown()
{
# Clean-up
}
public function testOne()
{
Assert::same(/* ... */);
}
public function testTwo()
{
Assert::match(/* ... */);
}
}
# Run testing methods
(new NextTest)->run();
/*
Method Calls Order
------------------
setUp()
testOne()
tearDown()
setUp()
testTwo()
tearDown()
*/
Ha hiba lép fel a setUp()
vagy a tearDown()
fázisban, a teszt sikertelen lesz. Ha a tesztelési
metódusban történik hiba, a tearDown()
metódus mindenképpen meghívásra kerül, de elnyomott hibákkal.
Javasoljuk, hogy a @testCase annotációt írjuk a teszt elejére, ekkor a parancssori tesztfutó az egyes teszteset metódusokat külön folyamatokban és párhuzamosan, több szálban futtatja. Ez jelentősen felgyorsíthatja a teljes tesztelési folyamatot.
<?php
/** @testCase */
Módszerek megjegyzése
A metódusok teszteléséhez néhány annotáció áll rendelkezésünkre. Ezeket a tesztelési módszer felé írjuk.
@throws
Ez a Assert::exception()
egyenlő használata egy tesztelési metóduson belül. De a jelölés olvashatóbb:
/**
* @throws RuntimeException
*/
public function testOne()
{
// ...
}
/**
* @throws LogicException Rossz argumentum sorrend
*/
public function testTwo()
{
// ...
}
@dataProvider
Ez az annotáció akkor illik, ha a tesztelési módszert többször, de különböző argumentumokkal akarjuk futtatni. (Nem tévesztendő össze a fájlokra vonatkozó azonos nevű annotációval.)
Érvként a metódus nevét írjuk, amely paramétereket ad vissza a tesztelési metódushoz. A metódusnak egy 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 másik @dataProvider megjegyzésváltozat argumentumként elfogadja az INI fájl elérési útvonalát (viszonylag a
tesztfájlhoz képest). A metódus annyiszor hívódik meg, ahány szakasz található az INI-fájlban. Fájl
loop-args.ini
:
[one]
a=1
b=2
c=3
[two]
a=4
b=5
c=6
[three]
a=7
b=8
c=9
és a módszer, amely az INI-fájlt használja:
/**
* @dataProvider loop-args.ini
*/
public function testLoop($a, $b, $c)
{
// ...
}
Hasonlóan átadhatjuk az INI fájl helyett egy PHP-szkript elérési útvonalát. Ennek tömböt vagy Traversable-t kell
visszaadnia. Fájl loop-args.php
:
return [
['a' => 1, 'b' => 2, 'c' => 3],
['a' => 4, 'b' => 5, 'c' => 6],
['a' => 7, 'b' => 8, 'c' => 9],
];