Nette Documentation Preview

syntax
TestCase
********

.[perex]
V jednoduchých testech mohou aserce následovat jedna za druhou. Někdy je ale výhodnější aserce zabalit do testovací třídy a tak je strukturovat.

Třída musí být potomkem `Tester\TestCase` a zjednodušeně o ní mluvíme jako o **testcase**. Třída musí obsahovat testovací metody začínající na `test`. Tyto metody budou spuštěny jako testy:

```php
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();
```

Takto napsaný test lze dále obohatit o metody `setUp()` a `tearDown()`. Jsou volány před, resp. za každou testovací metodou:

```php
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
-------------------
setUp()
testOne()
tearDown()

setUp()
testTwo()
tearDown()
*/
```

Pokud dojde k chybě v `setUp()` nebo `tearDown()` fázi, test celkově selže. Pokud dojde k chybě v testovací metodě, i přes to se metoda `tearDown()` spustí, avšak s potlačením chyb v ní.

Doporučujeme na začátek testu napsat anotaci [@testCase|test-annotations#@testCase], potom bude spouštěč testů z příkazové řádky pouštět jednotlivé metody testcase v samostatných procesech a paralelně ve více vláknech. To může výrazně urychlit celý proces testování.

/--php
<?php
/** @testCase */
\--


Anotace metod
=============

U testovacích metod máme k dispozici několik anotací, které nám testování usnadní. Zapisujeme je k testovací metodě.


@throws .[filter]
-----------------
Je ekvivalentem použití `Assert::exception()` uvnitř testovací metody. Zápis je ale přehlednější:

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


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


@dataProvider .[filter]
-----------------------
Chceme-li testovací metodu spustit vícekrát, ale s jinými parametry, hodí se právě tato anotace. (Nezaměňujte se stejnojmennou anotací pro [soubory|test-annotations#dataProvider].)

Za ní uvedeme název metody, která vrací argumenty pro testovací metodu. Metoda musí vrátit pole nebo Traversable. Jednoduchý příklad:

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


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

Druhá varianta anotace **@dataProvider** přijímá jako parametr cestu k INI souboru (relativně k souboru s testem). Metoda je volána tolikrát, kolik je v INI souboru sekcí. Soubor `loop-args.ini`:

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

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

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

a metoda, která INI soubor využívá:

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

Obdobně můžeme namísto INI souboru odkázat na PHP skript. Ten musí vrátit pole nebo Traversable. Soubor `loop-args.php`:

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

TestCase

V jednoduchých testech mohou aserce následovat jedna za druhou. Někdy je ale výhodnější aserce zabalit do testovací třídy a tak je strukturovat.

Třída musí být potomkem Tester\TestCase a zjednodušeně o ní mluvíme jako o testcase. Třída musí obsahovat testovací metody začínající na test. Tyto metody budou spuštěny 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();

Takto napsaný test lze dále obohatit o metody setUp() a tearDown(). Jsou volány před, resp. za každou testovací metodou:

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
-------------------
setUp()
testOne()
tearDown()

setUp()
testTwo()
tearDown()
*/

Pokud dojde k chybě v setUp() nebo tearDown() fázi, test celkově selže. Pokud dojde k chybě v testovací metodě, i přes to se metoda tearDown() spustí, avšak s potlačením chyb v ní.

Doporučujeme na začátek testu napsat anotaci @testCase, potom bude spouštěč testů z příkazové řádky pouštět jednotlivé metody testcase v samostatných procesech a paralelně ve více vláknech. To může výrazně urychlit celý proces testování.

<?php
/** @testCase */

Anotace metod

U testovacích metod máme k dispozici několik anotací, které nám testování usnadní. Zapisujeme je k testovací metodě.

@throws

Je ekvivalentem použití Assert::exception() uvnitř testovací metody. Zápis je ale přehlednější:

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


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

@dataProvider

Chceme-li testovací metodu spustit vícekrát, ale s jinými parametry, hodí se právě tato anotace. (Nezaměňujte se stejnojmennou anotací pro soubory.)

Za ní uvedeme název metody, která vrací argumenty pro testovací metodu. Metoda musí vrátit pole nebo Traversable. Jednoduchý příklad:

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


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

Druhá varianta anotace @dataProvider přijímá jako parametr cestu k INI souboru (relativně k souboru s testem). Metoda je volána tolikrát, kolik je v INI souboru sekcí. Soubor loop-args.ini:

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

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

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

a metoda, která INI soubor využívá:

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

Obdobně můžeme namísto INI souboru odkázat na PHP skript. Ten musí vrátit pole nebo Traversable. Soubor loop-args.php:

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