Nette Documentation Preview

syntax
TestCase
********

.[perex]
Οι ισχυρισμοί μπορούν να ακολουθούν έναν προς έναν σε απλές δοκιμές. Αλλά μερικές φορές είναι χρήσιμο να περικλείονται οι ισχυρισμοί σε κλάση δοκιμής και να δομούνται με αυτόν τον τρόπο.

Η κλάση πρέπει να είναι απόγονος της `Tester\TestCase` και μιλάμε για αυτήν απλά ως **testcase**.

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

Μπορούμε να εμπλουτίσουμε ένα testcase με τις μεθόδους `setUp()` και `tearDown()`. Καλούνται πριν/μετά από κάθε μέθοδο δοκιμής:

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

Εάν προκύψει σφάλμα σε μια φάση `setUp()` ή `tearDown()`, η δοκιμή θα αποτύχει. Εάν το σφάλμα εμφανιστεί στη μέθοδο δοκιμής, η μέθοδος `tearDown()` καλείται ούτως ή άλλως, αλλά με κατασταλμένα σφάλματα σε αυτήν.

Συνιστούμε να γράφετε τον σχολιασμό [@testCase |test-annotations#@testCase] στην αρχή της δοκιμής, τότε ο test runner της γραμμής εντολών θα εκτελέσει τις επιμέρους μεθόδους testcase σε ξεχωριστές διεργασίες και παράλληλα σε πολλαπλά νήματα. Αυτό μπορεί να επιταχύνει σημαντικά ολόκληρη τη διαδικασία δοκιμής.

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


Σχολιασμός μεθόδων .[#toc-annotation-of-methods]
================================================

Υπάρχουν μερικοί σχολιασμοί που είναι διαθέσιμοι για να μας βοηθήσουν με τον έλεγχο των μεθόδων. Τις γράφουμε προς τη μέθοδο δοκιμής.


@throws .[filter]
-----------------
Πρόκειται για ισότιμη χρήση του `Assert::exception()` μέσα σε μια μέθοδο δοκιμής. Αλλά η σημειογραφία είναι πιο ευανάγνωστη:

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


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


@dataProvider .[filter]
-----------------------
Αυτός ο σχολιασμός ταιριάζει όταν θέλουμε να εκτελέσουμε τη μέθοδο δοκιμής πολλές φορές αλλά με διαφορετικά ορίσματα. (Δεν πρέπει να συγχέεται με τον σχολιασμό με το ίδιο όνομα για [αρχεία |test-annotations#dataProvider]).

Ως όρισμα γράφουμε το όνομα της μεθόδου που επιστρέφει τις παραμέτρους για τη μέθοδο δοκιμής. Η μέθοδος πρέπει να επιστρέφει έναν πίνακα ή ένα Traversable. Απλό παράδειγμα:

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


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

Η άλλη παραλλαγή **@dataProvider** δέχεται ως όρισμα τη διαδρομή προς το αρχείο INI (σχετικά με το αρχείο δοκιμής). Η μέθοδος καλείται τόσες φορές όσες είναι ο αριθμός των τμημάτων που περιέχονται στο αρχείο INI. Αρχείο `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
```

και η μέθοδος που χρησιμοποιεί το αρχείο INI:

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

Ομοίως, μπορούμε να περάσουμε τη διαδρομή σε ένα σενάριο PHP αντί για INI. Πρέπει να επιστρέφει array ή Traversable. Αρχείο `loop-args.php`:

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

TestCase

Οι ισχυρισμοί μπορούν να ακολουθούν έναν προς έναν σε απλές δοκιμές. Αλλά μερικές φορές είναι χρήσιμο να περικλείονται οι ισχυρισμοί σε κλάση δοκιμής και να δομούνται με αυτόν τον τρόπο.

Η κλάση πρέπει να είναι απόγονος της Tester\TestCase και μιλάμε για αυτήν απλά ως 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();

Μπορούμε να εμπλουτίσουμε ένα testcase με τις μεθόδους setUp() και tearDown(). Καλούνται πριν/μετά από κάθε μέθοδο δοκιμής:

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

Εάν προκύψει σφάλμα σε μια φάση setUp() ή tearDown(), η δοκιμή θα αποτύχει. Εάν το σφάλμα εμφανιστεί στη μέθοδο δοκιμής, η μέθοδος tearDown() καλείται ούτως ή άλλως, αλλά με κατασταλμένα σφάλματα σε αυτήν.

Συνιστούμε να γράφετε τον σχολιασμό @testCase στην αρχή της δοκιμής, τότε ο test runner της γραμμής εντολών θα εκτελέσει τις επιμέρους μεθόδους testcase σε ξεχωριστές διεργασίες και παράλληλα σε πολλαπλά νήματα. Αυτό μπορεί να επιταχύνει σημαντικά ολόκληρη τη διαδικασία δοκιμής.

<?php
/** @testCase */

Σχολιασμός μεθόδων

Υπάρχουν μερικοί σχολιασμοί που είναι διαθέσιμοι για να μας βοηθήσουν με τον έλεγχο των μεθόδων. Τις γράφουμε προς τη μέθοδο δοκιμής.

@throws

Πρόκειται για ισότιμη χρήση του Assert::exception() μέσα σε μια μέθοδο δοκιμής. Αλλά η σημειογραφία είναι πιο ευανάγνωστη:

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


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

@dataProvider

Αυτός ο σχολιασμός ταιριάζει όταν θέλουμε να εκτελέσουμε τη μέθοδο δοκιμής πολλές φορές αλλά με διαφορετικά ορίσματα. (Δεν πρέπει να συγχέεται με τον σχολιασμό με το ίδιο όνομα για αρχεία).

Ως όρισμα γράφουμε το όνομα της μεθόδου που επιστρέφει τις παραμέτρους για τη μέθοδο δοκιμής. Η μέθοδος πρέπει να επιστρέφει έναν πίνακα ή ένα Traversable. Απλό παράδειγμα:

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


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

Η άλλη παραλλαγή @dataProvider δέχεται ως όρισμα τη διαδρομή προς το αρχείο INI (σχετικά με το αρχείο δοκιμής). Η μέθοδος καλείται τόσες φορές όσες είναι ο αριθμός των τμημάτων που περιέχονται στο αρχείο INI. Αρχείο loop-args.ini:

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

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

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

και η μέθοδος που χρησιμοποιεί το αρχείο INI:

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

Ομοίως, μπορούμε να περάσουμε τη διαδρομή σε ένα σενάριο PHP αντί για INI. Πρέπει να επιστρέφει array ή Traversable. Αρχείο loop-args.php:

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