Pomožni razredi

DomQuery

Tester\DomQuery je razred, ki razširja SimpleXMLElement z enostavnim iskanjem v HTML ali XML s pomočjo CSS selektorjev.

# ustvarjanje DomQuery iz HTML niza
$dom = Tester\DomQuery::fromHtml('
	<article class="post">
		<h1>Naslov</h1>
		<div class="content">Besedilo</div>
	</article>
');

# test obstoja elementov s pomočjo CSS selektorjev
Assert::true($dom->has('article.post'));
Assert::true($dom->has('h1'));

# iskanje elementov kot polje DomQuery objektov
$headings = $dom->find('h1');
Assert::same('Naslov', (string) $headings[0]);

# test, ali element ustreza selektorju (od različice 2.5.3)
$content = $dom->find('.content')[0];
Assert::true($content->matches('div'));
Assert::false($content->matches('p'));

# iskanje najbližjega prednika, ki ustreza selektorju (od 2.5.5)
$article = $content->closest('.post');
Assert::true($article->matches('article'));

FileMock

Tester\FileMock emulira datoteke v pomnilniku in tako olajša testiranje kode, ki uporablja funkcije fopen(), file_get_contents(), parse_ini_file() in podobne. Primer uporabe:

# Testirani razred
class Logger
{
	public function __construct(
		private string $logFile,
	) {
	}

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

# Nova prazna datoteka
$file = Tester\FileMock::create('');

$logger = new Logger($file);
$logger->log('Prijava');
$logger->log('Odjava');

# Testiramo ustvarjeno vsebino
Assert::same("Prijava\nOdjava\n", file_get_contents($file));

Assert::with()

Ne gre za asercijo, ampak pomočnika za testiranje zasebnih metod in lastnosti objektov.

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

$ent = new Entity;

Assert::with($ent, function () {
	Assert::true($this->enabled); // dostopna zasebna $ent->enabled
});

Helpers::purge()

Metoda purge() ustvari navedeni imenik, in če že obstaja, izbriše celotno njegovo vsebino. Uporabno za ustvarjanje začasnega imenika. Na primer v tests/bootstrap.php:

@mkdir(__DIR__ . '/tmp');  # @ - imenik že lahko obstaja

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

Environment::lock()

Testi se izvajajo vzporedno. Včasih pa potrebujemo, da se izvajanje testov ne prekriva. Tipično pri podatkovnih testih je nujno, da si test pripravi vsebino podatkovne baze in da mu drug test med izvajanjem ne posega v podatkovno bazo. V teh testih uporabimo Tester\Environment::lock($name, $dir):

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

Prvi parameter je ime ključavnice, drugi je pot do imenika za shranjevanje ključavnice. Test, ki prvi pridobi ključavnico, se izvede, ostali testi morajo počakati na njegovo dokončanje.

Environment::bypassFinals()

Razredi ali metode, označene kot final, se težko testirajo. Klic Tester\Environment::bypassFinals() na začetku testa povzroči, da se ključne besede final med nalaganjem kode izpustijo.

require __DIR__ . '/bootstrap.php';

Tester\Environment::bypassFinals();

class MyClass extends NormallyFinalClass  # <-- NormallyFinalClass ni več final
{
	// ...
}

Environment::setup()

  • izboljša berljivost izpisa napak (vključno z barvanjem), sicer je izpisan privzeti PHP stack trace
  • vklopi preverjanje, ali so bile v testu klicane asercije, sicer test brez asercij (na primer pozabljenih) prav tako uspe
  • pri uporabi --coverage samodejno zažene zbiranje informacij o zagnani kodi (opisano naprej)
  • izpiše stanje OK ali FAILURE na koncu skripta

Environment::setupFunctions()

Ustvari globalne funkcije test(), testException(), setUp() in tearDown(), v katere lahko členite teste.

test('opis testa', function () {
	Assert::same(123, foo());
	Assert::false(bar());
	// ...
});

Environment::VariableRunner

Omogoča ugotoviti, ali je bil test zagnan neposredno ali s pomočjo Testerja.

if (getenv(Tester\Environment::VariableRunner)) {
	# zagnano s Testerjem
} else {
	# zagnano drugače
}

Environment::VariableThread

Tester zažene teste vzporedno v navedenem številu niti. Če nas zanima številka niti, jo ugotovimo iz spremenljivke okolja:

echo "Tečem v niti številka " . getenv(Tester\Environment::VariableThread);