TestCase

V preprostih testih lahko asercije sledijo ena za drugo. Včasih pa je bolj ugodno asercije zapakirati v testni razred in jih tako strukturirati.

Razred mora biti potomec Tester\TestCase in poenostavljeno o njem govorimo kot o testcase. Razred mora vsebovati testne metode, ki se začnejo s test. Te metode se bodo zagnale kot testi:

use Tester\Assert;

class RectangleTest extends Tester\TestCase
{
	public function testOne()
	{
		Assert::same(/* ... */);
	}

	public function testTwo()
	{
		Assert::match(/* ... */);
	}
}

# Zagon testnih metod
(new RectangleTest)->run();

Tako napisan test lahko nadalje obogatite z metodama setUp() in tearDown(). Klicani sta pred oz. za vsako testno metodo:

use Tester\Assert;

class NextTest extends Tester\TestCase
{
	public function setUp()
	{
		# Priprava
	}

	public function tearDown()
	{
		# Čiščenje
	}

	public function testOne()
	{
		Assert::same(/* ... */);
	}

	public function testTwo()
	{
		Assert::match(/* ... */);
	}
}

# Zagon testnih metod
(new NextTest)->run();

/*


Vrstni red klica metod
----------------------
setUp()
testOne()
tearDown()

setUp()
testTwo()
tearDown()
*/

Če pride do napake v fazi setUp() ali tearDown(), test na splošno ne uspe. Če pride do napake v testni metodi, se kljub temu metoda tearDown() zažene, vendar z zatrtjem napak v njej.

Priporočamo, da na začetek testa napišete opombo @testCase, potem bo zaganjalnik testov iz ukazne vrstice zaganjal posamezne metode testcase v ločenih procesih in vzporedno v več nitih. To lahko znatno pospeši celoten proces testiranja.

<?php
/** @testCase */

Opombe metod

Pri testnih metodah imate na voljo več opomb, ki vam olajšajo testiranje. Zapišete jih k testni metodi.

@throws

Je ekvivalent uporabe Assert::exception() znotraj testne metode. Zapis pa je preglednejši:

/**
 * @throws RuntimeException
 */
public function testOne()
{
	// ...
}


/**
 * @throws LogicException  Wrong argument order
 */
public function testTwo()
{
	// ...
}

@dataProvider

Če želite testno metodo zagnati večkrat, vendar z drugačnimi parametri, je uporabna prav ta opomba. (Ne zamenjujte z istoimensko opombo za datoteke.)

Za njo navedite ime metode, ki vrača argumente za testno metodo. Metoda mora vrniti polje ali Traversable. Preprost primer:

public function getLoopArgs()
{
	return [
		[1, 2, 3],
		[4, 5, 6],
		[7, 8, 9],
	];
}


/**
 * @dataProvider getLoopArgs
 */
public function testLoop($a, $b, $c)
{
	// ...
}

Druga različica opombe @dataProvider sprejema kot parameter pot do datoteke INI (relativno glede na datoteko s testom). Metoda se kliče tolikokrat, kolikor je odsekov v datoteki INI. Datoteka loop-args.ini:

[one]
a=1
b=2
c=3

[two]
a=4
b=5
c=6

[three]
a=7
b=8
c=9

in metoda, ki uporablja datoteko INI:

/**
 * @dataProvider loop-args.ini
 */
public function testLoop($a, $b, $c)
{
	// ...
}

Podobno lahko namesto datoteke INI pokažete na skript PHP. Ta mora vrniti polje ali Traversable. Datoteka loop-args.php:

return [
	['a' => 1, 'b' => 2, 'c' => 3],
	['a' => 4, 'b' => 5, 'c' => 6],
	['a' => 7, 'b' => 8, 'c' => 9],
];