TestCase

W prostych testach asercje mogą następować jedna po drugiej. Ale czasami wygodniej jest zawinąć asercje w klasie testowej, aby je ustrukturyzować.

Klasa musi być potomkiem Tester\TestCase, a my nazywamy ją w uproszczeniu testcase. Klasa musi zawierać metody testowe zaczynające się od test. Metody te będą uruchamiane jako testy:

use Tester\Assert;

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

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

# Spuštění testovacích metod
(new RectangleTest)->run();

Tak napisany test można dodatkowo wzbogacić o metody setUp() i tearDown(). Są one wywoływane odpowiednio przed i po każdej metodzie testowej:

use Tester\Assert;

class NextTest extends Tester\TestCase
{
	public function setUp()
	{
		# Příprava
	}

	public function tearDown()
	{
		# Úklid
	}

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

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

# Spuštění testovacích metod
(new NextTest)->run();

/*


Pořadí volání metod .[#toc-method-calls-order]
----------------------------------------------
setUp()
testOne()
tearDown()

setUp()
testTwo()
tearDown()
*/

Jeśli w fazie setUp() lub tearDown() wystąpi błąd, test zakończy się ogólnym niepowodzeniem. Jeśli błąd wystąpi w metodzie testowej, metoda tearDown() nadal działa, ale z tłumieniem błędów w tej metodzie.

Zaleca się napisanie adnotacji @testCase na początku testu, wtedy runner testowy linii poleceń uruchomi każdą metodę testcase w oddzielnych procesach i równolegle w wielu wątkach. Może to znacznie przyspieszyć cały proces testowania.

<?php
/** @testCase */

Adnotacja metod

Mamy kilka adnotacji do metod testowych, aby ułatwić testowanie. Zapisujemy je do metody badawczej.

@podrzuca

Jest to równoznaczne z zastosowaniem Assert::exception() wewnątrz metody badawczej. Jednak notacja jest bardziej przejrzysta:

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


/**
 * @throws LogicException Nieprawidłowa kolejność argumentów.
 */
public function testTwo()
{
	// ...
}

@dataProvider

Jeśli chcesz uruchomić metodę testową wiele razy, ale z różnymi parametrami, ta adnotacja jest przydatna. (Nie należy mylić z tą samą adnotacją dla plików).

Po niej podamy nazwę metody, która zwraca argumenty dla metody testowej. Metoda musi zwracać tablicę lub traversable. Prosty przykład:

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


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

Drugi wariant adnotacji @dataProvider przyjmuje jako parametr ścieżkę do pliku INI (względem pliku testowego). Metoda jest wywoływana tyle razy, ile jest sekcji w pliku INI. Plik loop-args.ini:

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

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

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

oraz metoda, która wykorzystuje plik INI:

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

Podobnie możemy odwołać się do skryptu PHP zamiast do pliku INI. Musi to zwrócić tablicę lub Traversable. Plik loop-args.php:

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