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.