Test Ek Açıklamaları

Ek açıklamalar, 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.

Ek açıklamalarda büyük/küçük harf duyarlılığı yoktur. Ayrıca, test manuel olarak normal bir PHP betiği olarak çalıştırılırsa hiçbir etkileri yoktur.

Örnek:

/**
 * TEST: Temel veritabanı sorgu testi.
 *
 * @dataProvider files/databases.ini
 * @exitCode 56
 * @phpVersion < 5.5
 */

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

TEST

Bu aslında bir ek açıklama değil, yalnızca başarısızlık durumunda veya günlüğe yazdırılan test başlığını belirler.

@skip

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

@phpVersion

Test, uygun PHP sürümüyle çalıştırılmazsa atlanır. Ek açıklamayı @phpVersion [operatör] sürüm olarak yazarız. Operatörü atlayabiliriz, varsayılan >='dir. Örnekler:

/**
 * @phpVersion 5.3.3
 * @phpVersion < 5.5
 * @phpVersion != 5.4.5
 */

@phpExtension

Test, belirtilen tüm PHP uzantıları yüklenmezse atlanır. Bir ek açıklamada birden fazla uzantı belirtebilir veya birden çok kez kullanabiliriz.

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

@dataProvider

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

@dataProvider file.ini olarak yazarız, dosya yolu test dosyasına göreceli olarak alınır. Test, INI dosyasındaki bölüm sayısı kadar çalıştırılacaktır. databases.ini INI dosyasını varsayalım:

[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ı dizinde database.phpt testi:

/**
 * @dataProvider databases.ini
 */

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

Test üç kez çalıştırılacak ve $args her zaman mysql, postgresql veya sqlite bölümündeki değerleri içerecektir.

Ek açıklamayı soru işaretiyle @dataProvider? file.ini olarak yazdığımız bir varyant daha vardır. Bu durumda, INI dosyası mevcut değilse test atlanır.

Ek açıklamanın olanakları burada bitmiyor. INI dosyasının adından sonra, testin belirli bir bölüm için hangi koşullar altında çalıştırılacağını belirtebiliriz. 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 koşullu ek açıklamayı kullanalım:

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

Test yalnızca bir kez ve postgresql 9.1 bölümü için çalıştırılacaktır. Diğer bölümler koşul filtresinden geçmez.

Benzer şekilde, INI dosyası yerine bir PHP betiğine başvurabiliriz. Bu, bir dizi veya Traversable döndürmelidir. databases.php dosyası:

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

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

@multiple

@multiple N olarak yazarız, burada N bir tamsayıdır. Test tam olarak N kez çalıştırılacaktır.

@testCase

Ek açıklamanın parametreleri yoktur. Testleri TestCase sınıfları olarak yazarsak kullanırız. Bu durumda, komut satırı test çalıştırıcısı bireysel metotları 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.

@exitCode

@exitCode N olarak yazarız, burada N çalıştırılan testin dönüş kodudur. Örneğin, testte exit(10) çağrılırsa, ek açıklamayı @exitCode 10 olarak yazarız ve test farklı bir kodla biterse, bu bir başarısızlık olarak kabul edilir. Ek açıklamayı belirtmezsek, dönüş kodu 0 (sıfır) doğrulanır.

@httpCode

Ek açıklama yalnızca PHP ikili dosyası CGI ise geçerlidir. Aksi takdirde yok sayılır. @httpCode NNN olarak yazarız, burada NNN beklenen HTTP kodudur. Ek açıklamayı belirtmezsek, HTTP kodu 200 doğrulanır. Eğer NNN'yi sıfıra değerlendirilen bir dize olarak yazarsak, örneğin any, HTTP kodu doğrulanmaz.

@outputMatch ve @outputMatchFile

Ek açıklamaların işlevi Assert::match() ve Assert::matchFile() doğrulama ifadeleriyle aynıdır. Ancak desen, testin standart çıktısına gönderdiği metinde aranır. Testin ölümcül bir hatayla biteceğini varsaydığımızda ve çıktısını doğrulamamız gerektiğinde kullanışlıdır.

@phpIni

Test için yapılandırma INI değerlerini ayarlar. Örneğin @phpIni precision=20 olarak yazarız ve değeri komut satırından -d precision=20 parametresiyle belirtmişiz gibi çalışır.