TestCase

Basit testlerde assertion'lar birbiri ardına gelebilir. Ancak bazen onları yapılandırmak için bir test sınıfının içine almak avantajlıdır.

Sınıf Tester\TestCase sınıfını genişletmelidir ve ona kısaca TestCase deriz. Sınıf, test ile başlayan test metotları içermelidir. Bu metotlar test olarak çalıştırılır:

use Tester\Assert;

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

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

# Test metotlarını çalıştır
(new RectangleTest)->run();

Bu şekilde yazılan bir TestCase, setUp() ve tearDown() metotlarıyla daha da geliştirilebilir. Bunlar sırasıyla her test metodundan önce ve sonra çağrılır:

use Tester\Assert;

class NextTest extends Tester\TestCase
{
	protected function setUp()
	{
		# Hazırlık
	}

	protected function tearDown()
	{
		# Temizlik
	}

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

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

# Test metotlarını çalıştır
(new NextTest)->run();

/*


Metot Çağrı Sırası
------------------
setUp()
testOne()
tearDown()

setUp()
testTwo()
tearDown()
*/

setUp() ya da tearDown() aşamasında bir hata oluşursa, test bütünüyle başarısız olur. Hata test metodunun kendisinde oluşursa tearDown() metodu yine de çalıştırılır, ama içindeki hatalar bastırılır.

Bir test metodunun içinde, örneğin bir önkoşul karşılanmadığında, $this->skip('gerekçe') çağırarak geçerli testi istediğiniz an atlayabilirsiniz.

Test dosyasının başına @testCase annotation'ını yazmanızı öneririz. Komut satırı test çalıştırıcısı o zaman tek tek TestCase metotlarını ayrı süreçlerde ve birden çok iş parçacığı kullanarak paralel çalıştırır. Bu, test sürecinin tamamını belirgin biçimde hızlandırabilir.

<?php
/** @testCase */

Metot Annotation'ları

Testi kolaylaştırmak için test metotlarında çeşitli annotation'lar kullanılabilir. Onları test metodunun üstüne yazın.

@throws

Test metodunun içinde Assert::exception() kullanmakla eşdeğerdir, ama yazımı daha anlaşılırdır:

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


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

@dataProvider

Bu annotation, test metodunu farklı parametrelerle defalarca çalıştırmak istediğinizde yararlıdır. (Onu test dosyaları için aynı adı taşıyan annotation ile karıştırmayın.)

Ondan sonra, test metodunun argümanlarını döndüren bir metodun adını belirtin. Bu metot bir dizi ya da Traversable nesnesi 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)
{
	// ...
}

@dataProvider annotation'ının ikinci varyasyonu, parametre olarak bir INI dosyasının yolunu (test dosyasına göre) kabul eder. Metot, INI dosyasındaki bölüm sayısı kadar çağrılır. loop-args.ini dosyası:

[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 metot:

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

Benzer şekilde, INI dosyası yerine bir PHP betiğine başvurabilirsiniz. Bir dizi ya da Traversable nesnesi döndürmelidir. loop-args.php dosyası:

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

Test dosyaları için data provider ile olduğu gibi, metodun yalnızca uyan bölümler için çalışması amacıyla dosya adının ardına bir süzme sorgusu ekleyebilirsiniz.