TestCase

În testele simple, afirmațiile pot urma una câte una. Dar, uneori, este utilă includerea aserțiunilor în clasa de testare și structurarea lor în acest mod.

Clasa trebuie să fie descendentă din Tester\TestCase și vorbim despre ea pur și simplu ca despre 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();

Putem îmbogăți un testcase prin metodele setUp() și tearDown(). Acestea sunt apelate înainte/după fiecare metodă de testare:

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

Dacă apare o eroare într-o fază setUp() sau tearDown(), testul va eșua. În cazul în care apare o eroare în metoda de testare, metoda tearDown() este oricum apelată, dar cu erori eliminate.

Vă recomandăm să scrieți adnotarea @testCase la începutul testului, după care executantul de teste în linie de comandă va rula metodele individuale ale cazului de test în procese separate și în paralel în mai multe fire de execuție. Acest lucru poate accelera semnificativ întregul proces de testare.

<?php
/** @testCase */

Adnotarea metodelor

Există câteva adnotări disponibile pentru a ne ajuta la testarea metodelor. Le scriem spre metoda de testare.

@throws

Este o utilizare egală a Assert::exception() în cadrul unei metode de testare. Dar notația este mai ușor de citit:

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


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

@dataProvider

Această adnotare se potrivește atunci când dorim să executăm metoda de testare de mai multe ori, dar cu argumente diferite. (A nu se confunda cu adnotarea cu același nume pentru fișiere).

Ca argument scriem numele metodei care returnează parametrii pentru metoda de testare. Metoda trebuie să returneze un array sau un Traversable. Exemplu simplu:

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


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

Cealaltă variație a adnotării @dataProvider acceptă ca argument o cale către un fișier INI (relativ la fișierul de test). Metoda este apelată de atâtea ori cât este numărul de secțiuni conținute în fișierul INI. Fișier loop-args.ini:

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

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

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

și metoda care utilizează fișierul INI:

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

În mod similar, putem trece calea către un script PHP în loc de INI. Acesta trebuie să returneze un array sau un Traversable. Fișier loop-args.php:

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