TestCase

Basit testlerde assertion'lar tek tek takip edilebilir. Ancak bazen assertion'ları test sınıfına dahil etmek ve bu şekilde yapılandırmak faydalı olabilir.

Sınıf, Tester\TestCase adresinin soyundan gelmelidir ve biz bundan basitçe testcase olarak bahsederiz.

use Tester\Assert;

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

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

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

Bir test durumunu setUp() ve tearDown() yöntemleriyle zenginleştirebiliriz. Her test yönteminden önce/sonra çağrılırlar:

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

Bir setUp() veya tearDown() aşamasında hata oluşursa, test başarısız olur. Test yönteminde hata oluşursa, tearDown() yöntemi yine de çağrılır, ancak içindeki hatalar bastırılır.

Testin başına @testCase ek açıklamasını yazmanızı öneririz, ardından komut satırı test koşucusu ayrı test senaryosu yöntemlerini ayrı süreçlerde ve birden çok iş parçacığında paralel olarak çalıştıracaktır. Bu, tüm test sürecini önemli ölçüde hızlandırabilir.

<?php
/** @testCase */

Yöntemlerin Açıklanması

Test yöntemlerinde bize yardımcı olacak birkaç ek açıklama mevcuttur. Bunları test yöntemine doğru yazıyoruz.

@throws

Bir test yöntemi içinde Assert::exception() 'un eşit kullanımıdır. Ancak notasyon daha okunaklıdır:

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


/**
 * @throws LogicException Yanlış argüman sırası
 */
public function testTwo()
{
	// ...
}

@dataProvider

Bu ek açıklama, test yöntemini birden çok kez ancak farklı argümanlarla çalıştırmak istediğimizde uygundur. ( Dosyalar için aynı isimli ek açıklama ile karıştırılmamalıdır).

Argüman olarak, test yöntemi için parametreleri döndüren yöntem adını yazıyoruz. Metot bir dizi veya Traversable döndürmelidir. Basit bir örnek:

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


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

Diğer açıklama @dataProvider varyasyonu, INI dosyasına (nispeten test dosyasına) giden bir yolu argüman olarak kabul eder. Yöntem, INI dosyasında bulunan bölüm sayısı kadar çağrılır. Dosya loop-args.ini:

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

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

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

ve INI dosyasını kullanan yöntem:

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

Benzer şekilde, INI yerine bir PHP betiğine yol aktarabiliriz. Dizi veya Traversable döndürmelidir. Dosya loop-args.php:

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