Nette Documentation Preview

syntax
TestCase
********

.[perex]
Egyszerű tesztekben az asszertek egymás után következhetnek. Néha azonban előnyösebb az asszerteket egy tesztosztályba csomagolni, és így strukturálni őket.

Az osztálynak a `Tester\TestCase` leszármazottjának kell lennie, és egyszerűsítve **testcase**-nek nevezzük. Az osztálynak tartalmaznia kell `test`-tel kezdődő tesztmetódusokat. Ezek a metódusok tesztekként lesznek futtatva:

```php
use Tester\Assert;

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

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

# Tesztmetódusok futtatása
(new RectangleTest)->run();
```

Az így megírt tesztet tovább lehet gazdagítani `setUp()` és `tearDown()` metódusokkal. Ezek minden tesztmetódus előtt, illetve után hívódnak meg:

```php
use Tester\Assert;

class NextTest extends Tester\TestCase
{
	public function setUp()
	{
		# Előkészítés
	}

	public function tearDown()
	{
		# Takarítás
	}

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

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

# Tesztmetódusok futtatása
(new NextTest)->run();

/*


Metódushívások sorrendje
------------------------
setUp()
testOne()
tearDown()

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

Ha hiba történik a `setUp()` vagy `tearDown()` fázisban, a teszt összességében meghiúsul. Ha hiba történik a tesztmetódusban, a `tearDown()` metódus ennek ellenére lefut, de a benne lévő hibák elnyomásával.

Javasoljuk, hogy a teszt elejére írjon [@testCase |test-annotations#testCase] annotációt, ekkor a parancssori tesztfuttató az egyes tesztcase metódusokat külön folyamatokban és párhuzamosan, több szálon futtatja. Ez jelentősen felgyorsíthatja az egész tesztelési folyamatot.

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


Metódus annotációk
==================

A tesztmetódusoknál rendelkezésünkre áll néhány annotáció, amelyek megkönnyítik a tesztelést. Ezeket a tesztmetódushoz írjuk.


@throws .[filter]
-----------------
Ez az `Assert::exception()` használatának ekvivalense a tesztmetóduson belül. Az írásmód azonban áttekinthetőbb:

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


/**
 * @throws LogicException  Rossz argumentum sorrend
 */
public function testTwo()
{
	// ...
}
```


@dataProvider .[filter]
-----------------------
Ha a tesztmetódust többször szeretnénk futtatni, de más paraméterekkel, akkor ez az annotáció hasznos. (Ne keverjük össze az azonos nevű annotációval a [fájlokra |test-annotations#dataProvider].)

Utána megadjuk annak a metódusnak a nevét, amely visszaadja a tesztmetódus argumentumait. A metódusnak tömböt vagy Traversable-t kell visszaadnia. Egyszerű példa:

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


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

A **@dataProvider** annotáció második változata paraméterként egy INI fájl elérési útját fogadja el (a tesztfájlhoz képest relatívan). A metódus annyiszor hívódik meg, ahány szekció van az INI fájlban. `loop-args.ini` fájl:

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

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

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

és a metódus, amely az INI fájlt használja:

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

Hasonlóképpen, INI fájl helyett hivatkozhatunk PHP szkriptre is. Ennek tömböt vagy Traversable-t kell visszaadnia. `loop-args.php` fájl:

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

TestCase

Egyszerű tesztekben az asszertek egymás után következhetnek. Néha azonban előnyösebb az asszerteket egy tesztosztályba csomagolni, és így strukturálni őket.

Az osztálynak a Tester\TestCase leszármazottjának kell lennie, és egyszerűsítve testcase-nek nevezzük. Az osztálynak tartalmaznia kell test-tel kezdődő tesztmetódusokat. Ezek a metódusok tesztekként lesznek futtatva:

use Tester\Assert;

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

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

# Tesztmetódusok futtatása
(new RectangleTest)->run();

Az így megírt tesztet tovább lehet gazdagítani setUp() és tearDown() metódusokkal. Ezek minden tesztmetódus előtt, illetve után hívódnak meg:

use Tester\Assert;

class NextTest extends Tester\TestCase
{
	public function setUp()
	{
		# Előkészítés
	}

	public function tearDown()
	{
		# Takarítás
	}

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

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

# Tesztmetódusok futtatása
(new NextTest)->run();

/*


Metódushívások sorrendje
------------------------
setUp()
testOne()
tearDown()

setUp()
testTwo()
tearDown()
*/

Ha hiba történik a setUp() vagy tearDown() fázisban, a teszt összességében meghiúsul. Ha hiba történik a tesztmetódusban, a tearDown() metódus ennek ellenére lefut, de a benne lévő hibák elnyomásával.

Javasoljuk, hogy a teszt elejére írjon @testCase annotációt, ekkor a parancssori tesztfuttató az egyes tesztcase metódusokat külön folyamatokban és párhuzamosan, több szálon futtatja. Ez jelentősen felgyorsíthatja az egész tesztelési folyamatot.

<?php
/** @testCase */

Metódus annotációk

A tesztmetódusoknál rendelkezésünkre áll néhány annotáció, amelyek megkönnyítik a tesztelést. Ezeket a tesztmetódushoz írjuk.

@throws

Ez az Assert::exception() használatának ekvivalense a tesztmetóduson belül. Az írásmód azonban áttekinthetőbb:

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


/**
 * @throws LogicException  Rossz argumentum sorrend
 */
public function testTwo()
{
	// ...
}

@dataProvider

Ha a tesztmetódust többször szeretnénk futtatni, de más paraméterekkel, akkor ez az annotáció hasznos. (Ne keverjük össze az azonos nevű annotációval a fájlokra.)

Utána megadjuk annak a metódusnak a nevét, amely visszaadja a tesztmetódus argumentumait. A metódusnak tömböt vagy Traversable-t kell visszaadnia. Egyszerű példa:

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


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

A @dataProvider annotáció második változata paraméterként egy INI fájl elérési útját fogadja el (a tesztfájlhoz képest relatívan). A metódus annyiszor hívódik meg, ahány szekció van az INI fájlban. loop-args.ini fájl:

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

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

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

és a metódus, amely az INI fájlt használja:

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

Hasonlóképpen, INI fájl helyett hivatkozhatunk PHP szkriptre is. Ennek tömböt vagy Traversable-t kell visszaadnia. loop-args.php fájl:

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