Yardımcı Sınıflar

DomQuery

Tester\DomQuery, SimpleXMLElement'i CSS seçicileri kullanarak HTML veya XML'de kolay arama yapma özelliğiyle genişleten bir sınıftır.

# HTML dizesinden DomQuery oluşturma
$dom = Tester\DomQuery::fromHtml('
	<article class="post">
		<h1>Başlık</h1>
		<div class="content">Metin</div>
	</article>
');

# CSS seçicileri kullanarak öğelerin varlığını test etme
Assert::true($dom->has('article.post'));
Assert::true($dom->has('h1'));

# Öğeleri DomQuery nesneleri dizisi olarak bulma
$headings = $dom->find('h1');
Assert::same('Başlık', (string) $headings[0]);

# Öğenin seçiciyle eşleşip eşleşmediğini test etme (sürüm 2.5.3'ten itibaren)
$content = $dom->find('.content')[0];
Assert::true($content->matches('div'));
Assert::false($content->matches('p'));

# Seçiciyle eşleşen en yakın atayı bulma (2.5.5'ten itibaren)
$article = $content->closest('.post');
Assert::true($article->matches('article'));

FileMock

Tester\FileMock, bellekte dosyaları taklit eder ve fopen(), file_get_contents(), parse_ini_file() ve benzeri fonksiyonları kullanan kodun test edilmesini kolaylaştırır. Kullanım örneği:

# Test edilen sınıf
class Logger
{
	public function __construct(
		private string $logFile,
	) {
	}

	public function log(string $message): void
	{
		file_put_contents($this->logFile, $message . "\n", FILE_APPEND);
	}
}

# Yeni boş dosya
$file = Tester\FileMock::create('');

$logger = new Logger($file);
$logger->log('Giriş');
$logger->log('Çıkış');

# Oluşturulan içeriği test ediyoruz
Assert::same("Giriş\nÇıkış\n", file_get_contents($file));

Assert::with()

Bu bir doğrulama ifadesi değil, nesnelerin özel metotlarını ve özelliklerini test etmek için bir yardımcıdır.

class Entity
{
	private $enabled;
	// ...
}

$ent = new Entity;

Assert::with($ent, function () {
	Assert::true($this->enabled); // erişilebilir hale getirilen özel $ent->enabled
});

Helpers::purge()

purge() metodu belirtilen dizini oluşturur ve eğer zaten varsa, tüm içeriğini siler. Geçici bir dizin oluşturmak için kullanışlıdır. Örneğin tests/bootstrap.php içinde:

@mkdir(__DIR__ . '/tmp');  # @ - dizin zaten var olabilir

define('TempDir', __DIR__ . '/tmp/' . getmypid());
Tester\Helpers::purge(TempDir);

Environment::lock()

Testler paralel olarak çalıştırılır. Ancak bazen testlerin çalışmasının çakışmamasını isteriz. Tipik olarak veritabanı testlerinde, testin veritabanı içeriğini hazırlaması ve başka bir testin çalışma süresi boyunca veritabanına dokunmaması gerekir. Bu testlerde Tester\Environment::lock($name, $dir) kullanırız:

Tester\Environment::lock('database', __DIR__ . '/tmp');

İlk parametre kilit adıdır, ikincisi kilidi saklamak için dizin yoludur. Kilidi ilk alan test çalışır, diğer testler onun tamamlanmasını beklemek zorundadır.

Environment::bypassFinals()

final olarak işaretlenmiş sınıflar veya metotlar test edilmesi zordur. Testin başında Tester\Environment::bypassFinals() çağrısı, kod yüklenirken final anahtar kelimelerinin atlanmasına neden olur.

require __DIR__ . '/bootstrap.php';

Tester\Environment::bypassFinals();

class MyClass extends NormallyFinalClass  # <-- NormallyFinalClass artık final değil
{
	// ...
}

Environment::setup()

  • hata çıktısının okunabilirliğini artırır (renklendirme dahil), aksi takdirde varsayılan PHP yığın izi yazdırılır
  • testte doğrulama ifadelerinin çağrılıp çağrılmadığını kontrol etmeyi etkinleştirir, aksi takdirde doğrulama ifadesi olmayan (örneğin unutulmuş) bir test de geçer
  • --coverage kullanıldığında, çalıştırılan kod hakkındaki bilgilerin toplanmasını otomatik olarak başlatır (daha sonra açıklanmıştır)
  • betiğin sonunda OK veya FAILURE durumunu yazdırır

Environment::setupFunctions()

Testleri bölebileceğiniz test(), testException(), setUp() ve tearDown() global fonksiyonlarını oluşturur.

test('test açıklaması', function () {
	Assert::same(123, foo());
	Assert::false(bar());
	// ...
});

Environment::VariableRunner

Testin doğrudan mı yoksa Tester aracılığıyla mı çalıştırıldığını belirlemeyi sağlar.

if (getenv(Tester\Environment::VariableRunner)) {
	# Tester tarafından çalıştırıldı
} else {
	# Başka bir şekilde çalıştırıldı
}

Environment::VariableThread

Tester, testleri belirtilen sayıda iş parçacığında paralel olarak çalıştırır. İş parçacığı numarasını merak ediyorsak, onu ortam değişkeninden öğreniriz:

echo "Çalıştığım iş parçacığı numarası " . getenv(Tester\Environment::VariableThread);