Test Annotation'ları

Annotation'lar, testlerin komut satırı test çalıştırıcısı tarafından nasıl ele alınacağını belirler. Test dosyasının başına yazılırlar.

Annotation'lar büyük/küçük harfe duyarsızdır. Test elle sıradan bir PHP betiği olarak çalıştırıldığında da etkileri yoktur.

Örnek:

/**
 * TEST: Basic database query test.
 *
 * @dataProvider files/databases.ini
 * @exitCode 56
 * @phpVersion < 8.4
 */

require __DIR__ . '/../bootstrap.php';

TEST

Bu aslında bir annotation değildir. Yalnızca, başarısızlık durumunda ya da günlüklerde görüntülenen test başlığını belirtir.

@skip

Test atlanır. Testleri geçici olarak devre dışı bırakmak için yararlıdır.

@phpVersion

Test, ilgili PHP sürümüyle çalıştırılmıyorsa atlanır. Annotation'ı @phpVersion [operatör] sürüm biçiminde yazın. Operatör atlanabilir; varsayılan >= olur. Örnekler:

/**
 * @phpVersion 8.1
 * @phpVersion < 8.4
 * @phpVersion != 8.2.5
 */

@phpExtension

Belirtilen PHP eklentilerinin tümü yüklü değilse test atlanır. Tek bir annotation'da birden çok eklenti listelenebilir ya da annotation defalarca kullanılabilir.

/**
 * @phpExtension pdo, pdo_pgsql, pdo_mysql
 * @phpExtension json
 */

@dataProvider

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

Onu @dataProvider file.ini biçiminde yazın. Dosya yolu test dosyasına görelidir. Test, INI dosyasındaki bölüm sayısı kadar çalıştırılır. databases.ini INI dosyasını düşünün:

[mysql]
dsn = "mysql:host=127.0.0.1"
user = root
password = ******

[postgresql]
dsn = "pgsql:host=127.0.0.1;dbname=test"
user = postgres
password = ******

[sqlite]
dsn = "sqlite::memory:"

ve aynı dizindeki database.phpt dosyasını:

/**
 * @dataProvider databases.ini
 */

$args = Tester\Environment::loadData();

Test üç kez çalışacak ve $args, sırasıyla mysql, postgresql ya da sqlite bölümündeki değerleri içerecek.

Annotation'ı soru işaretiyle yazdığınız bir varyasyon daha var: @dataProvider? file.ini. Bu durumda INI dosyası yoksa test atlanır.

Bu annotation'ın olanakları burada bitmiyor. INI dosyasının adından sonra, testin belirli bir bölüm için çalışıp çalışmayacağını belirleyen koşullar belirtebilirsiniz. INI dosyasını genişletelim:

[mysql]
dsn = "mysql:host=127.0.0.1"
user = root
password = ******

[postgresql 8.4]
dsn = "pgsql:host=127.0.0.1;dbname=test"
user = postgres
password = ******

[postgresql 9.1]
dsn = "pgsql:host=127.0.0.1;dbname=test;port=5433"
user = postgres
password = ******

[sqlite]
dsn = "sqlite::memory:"

ve annotation'ı koşulla kullanalım:

/**
 * @dataProvider  databases.ini  postgresql, >=9.0
 */

Test yalnızca bir kez, postgresql 9.1 bölümü için çalışacak. Diğer bölümler koşul süzgecini karşılamıyor.

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

return [
	'postgresql 8.4' => [
		'dsn' => '...',
		'user' => '...',
	],

	'postgresql 9.1' => [
		'dsn' => '...',
		'user' => '...',
	],
];

@multiple

Onu @multiple N biçiminde yazın; N bir tam sayıdır. Test tam olarak N kez çalışacak.

@testCase

Bu annotation'ın parametresi yoktur. Testleri TestCase sınıfları olarak yazarken kullanın. Bu durumda komut satırı test çalıştırıcısı, tek tek metotları 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.

@exitCode

Onu @exitCode N biçiminde yazın; N testin beklenen çıkış kodudur. Örneğin testte exit(10) çağrılıyorsa annotation'ı @exitCode 10 olarak yazın. Test farklı bir kodla biterse başarısız sayılır. Annotation atlanırsa 0 (sıfır) çıkış kodu doğrulanır.

@httpCode

Bu annotation yalnızca PHP ikili dosyası CGI ise geçerlidir; aksi hâlde yok sayılır. Onu @httpCode NNN biçiminde yazın; NNN beklenen HTTP kodudur. Annotation atlanırsa 200 HTTP kodu doğrulanır. NNN, sıfıra karşılık gelen bir dize olarak yazılırsa (örneğin any), HTTP kodu denetlenmez.

@outputMatch ve @outputMatchFile

Bu annotation'ların işlevi Assert::match() ve Assert::matchFile() assertion'larıyla aynıdır. Ancak desen, testin standart çıktısına gönderdiği metinde aranır. Bu, bir testin ölümcül bir hatayla bitmesini beklediğinizde ve çıktısını doğrulamanız gerektiğinde yararlıdır.

@phpIni

Test için INI yapılandırma değerlerini ayarlar. Örneğin @phpIni precision=20 biçiminde yazın. Değeri komut satırından -d precision=20 parametresiyle belirtmişsiniz gibi çalışır.