TestCase

V preprostih testih si lahko trditve sledijo ena za drugo. Včasih pa je koristno trditve zapreti v testni razred in jih tako strukturirati.

Razred mora biti potomec Tester\TestCase in o njem govorimo preprosto kot o testcase.

use Tester\Assert;

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

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

# Run testing methods
(new RectangleTest)->run();

Testni primer lahko obogatimo z metodami setUp() in tearDown(). Pokličemo jih pred/za vsako testno metodo:

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()
*/

Če pride do napake v fazi setUp() ali tearDown(), bo test neuspešen. Če se napaka pojavi v testni metodi, se metoda tearDown() vseeno pokliče, vendar z zatrtimi napakami v njej.

Priporočamo, da anotacijo @testCase zapišete na začetku testa, potem bo izvajalec testov v ukazni vrstici izvajal posamezne metode testne zadeve v ločenih procesih in vzporedno v več nitih. To lahko znatno pospeši celoten postopek testiranja.

<?php
/** @testCase */

Anotacija metod

Na voljo je nekaj opomb, ki nam pomagajo pri testiranju metod. Zapišemo jih v smeri testne metode.

@throws

To je enaka uporaba Assert::exception() znotraj testne metode. Vendar je zapis bolj berljiv:

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


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

@dataProvider

Ta opomba je primerna, kadar želimo testno metodo zagnati večkrat, vendar z različnimi argumenti. (Ne smemo ga zamenjati z istoimensko opombo za datoteke.)

Kot argument zapišemo ime metode, ki vrne parametre 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 anotacija @dataProvider kot argument sprejme pot do datoteke INI (relativno do testne datoteke). Metoda se pokliče tolikokrat, kolikor odsekov vsebuje datoteka 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 posredujemo pot do skripte PHP. Vrniti mora 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],
];