TestCase

Basit testlerde, doğrulama ifadeleri birbiri ardına gelebilir. Ancak bazen doğrulama ifadelerini bir test sınıfına sarmak ve böylece yapılandırmak daha avantajlıdır.

Sınıf Tester\TestCase sınıfından türetilmiş olmalı ve kısaca testcase olarak adlandırılır. Sınıf, test ile başlayan test metotlarını içermelidir. Bu metotlar test olarak çalıştırılacaktır:

use Tester\Assert;

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

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

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

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

use Tester\Assert;

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

	public function tearDown()
	{
		# Temizlik
	}

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

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

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

/*


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

setUp()
testTwo()
tearDown()
*/

setUp() veya tearDown() aşamasında bir hata oluşursa, test genel olarak başarısız olur. Test metodunda bir hata oluşursa, tearDown() metodu yine de çalıştırılır, ancak içindeki hatalar bastırılır.

Testin başına @testCase ek açıklamasını yazmanızı öneririz. Bu durumda komut satırı test çalıştırıcısı, testcase'in bireysel metotlarını ayrı işlemlerde ve paralel olarak birden fazla iş parçacığında çalıştıracaktır. Bu, tüm test sürecini önemli ölçüde hızlandırabilir.

<?php
/** @testCase */

Metot Ek Açıklamaları

Test metotları için, test etmeyi kolaylaştıran birkaç ek açıklamamız mevcuttur. Bunları test metoduna yazarız.

@throws

Test metodu içinde Assert::exception() kullanımına eşdeğerdir. Ancak yazım daha okunabilirdir:

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


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

@dataProvider

Test metodunu birden çok kez, ancak farklı parametrelerle çalıştırmak istiyorsak, bu ek açıklama kullanışlıdır. (Dosyalar için aynı adlı ek açıklamayla karıştırmayın.)

Ardından, test metodu için argümanları döndüren metodun adını belirtiriz. 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)
{
	// ...
}

@dataProvider ek açıklamasının ikinci varyantı, parametre olarak bir INI dosyasının yolunu kabul eder (test dosyasına göreceli). 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şvurabiliriz. Bu betik bir dizi veya Traversable 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],
];