Nette Documentation Preview

syntax
TestCase
********

.[perex]
Az egyszerű tesztekben az állítások egyenként követhetik egymást. Néha azonban hasznos az állításokat tesztosztályba foglalni és így strukturálni.

Az osztálynak a `Tester\TestCase` leszármazottjának kell lennie, és egyszerűen **testcase**-ként beszélünk róla.

```php
use Tester\Assert;

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

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

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

A `setUp()` és a `tearDown()` metódusokkal gazdagíthatjuk a teszteseteket. Ezeket minden tesztelési metódus előtt/után hívjuk meg:

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

Ha hiba lép fel a `setUp()` vagy a `tearDown()` fázisban, a teszt sikertelen lesz. Ha a tesztelési metódusban történik hiba, a `tearDown()` metódus mindenképpen meghívásra kerül, de elnyomott hibákkal.

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

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


Módszerek megjegyzése .[#toc-annotation-of-methods]
===================================================

A metódusok teszteléséhez néhány annotáció áll rendelkezésünkre. Ezeket a tesztelési módszer felé írjuk.


@throws .[filter]
-----------------
Ez a `Assert::exception()` egyenlő használata egy tesztelési metóduson belül. De a jelölés olvashatóbb:

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


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


@dataProvider .[filter]
-----------------------
Ez az annotáció akkor illik, ha a tesztelési módszert többször, de különböző argumentumokkal akarjuk futtatni. (Nem tévesztendő össze a [fájlokra |test-annotations#dataProvider] vonatkozó azonos nevű annotációval.)

Érvként a metódus nevét írjuk, amely paramétereket ad vissza a tesztelési metódushoz. A metódusnak egy 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 másik **@dataProvider** megjegyzésváltozat argumentumként elfogadja az INI fájl elérési útvonalát (viszonylag a tesztfájlhoz képest). A metódus annyiszor hívódik meg, ahány szakasz található az INI-fájlban. Fájl `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
```

és a módszer, amely az INI-fájlt használja:

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

Hasonlóan átadhatjuk az INI fájl helyett egy PHP-szkript elérési útvonalát. Ennek tömböt vagy Traversable-t kell visszaadnia. Fájl `loop-args.php`:

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

TestCase

Az egyszerű tesztekben az állítások egyenként követhetik egymást. Néha azonban hasznos az állításokat tesztosztályba foglalni és így strukturálni.

Az osztálynak a Tester\TestCase leszármazottjának kell lennie, és egyszerűen testcase-ként beszélünk róla.

use Tester\Assert;

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

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

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

A setUp() és a tearDown() metódusokkal gazdagíthatjuk a teszteseteket. Ezeket minden tesztelési metódus előtt/után hívjuk meg:

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

Ha hiba lép fel a setUp() vagy a tearDown() fázisban, a teszt sikertelen lesz. Ha a tesztelési metódusban történik hiba, a tearDown() metódus mindenképpen meghívásra kerül, de elnyomott hibákkal.

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

<?php
/** @testCase */

Módszerek megjegyzése

A metódusok teszteléséhez néhány annotáció áll rendelkezésünkre. Ezeket a tesztelési módszer felé írjuk.

@throws

Ez a Assert::exception() egyenlő használata egy tesztelési metóduson belül. De a jelölés olvashatóbb:

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


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

@dataProvider

Ez az annotáció akkor illik, ha a tesztelési módszert többször, de különböző argumentumokkal akarjuk futtatni. (Nem tévesztendő össze a fájlokra vonatkozó azonos nevű annotációval.)

Érvként a metódus nevét írjuk, amely paramétereket ad vissza a tesztelési metódushoz. A metódusnak egy 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 másik @dataProvider megjegyzésváltozat argumentumként elfogadja az INI fájl elérési útvonalát (viszonylag a tesztfájlhoz képest). A metódus annyiszor hívódik meg, ahány szakasz található az INI-fájlban. Fájl loop-args.ini:

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

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

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

és a módszer, amely az INI-fájlt használja:

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

Hasonlóan átadhatjuk az INI fájl helyett egy PHP-szkript elérési útvonalát. Ennek tömböt vagy Traversable-t kell visszaadnia. Fájl loop-args.php:

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