Segédosztályok

DomQuery

A Tester\DomQuery egy osztály, amely kiterjeszti a SimpleXMLElement-et a HTML vagy XML dokumentumokban való könnyű kereséshez CSS szelektorok segítségével.

# DomQuery létrehozása HTML stringből
$dom = Tester\DomQuery::fromHtml('
	<article class="post">
		<h1>Title</h1>
		<div class="content">Text</div>
	</article>
');

# Elemek létezésének tesztelése CSS szelektorokkal
Assert::true($dom->has('article.post'));
Assert::true($dom->has('h1'));

# Elemek megtalálása DomQuery objektumok tömbjeként
$headings = $dom->find('h1');
Assert::same('Title', (string) $headings[0]);

# Teszt, hogy az elem megfelel-e a szelektornak (2.5.3 verziótól)
$content = $dom->find('.content')[0];
Assert::true($content->matches('div'));
Assert::false($content->matches('p'));

# Legközelebbi, szelektornak megfelelő ős megtalálása (2.5.5-től)
$article = $content->closest('.post');
Assert::true($article->matches('article'));

FileMock

A Tester\FileMock memóriában emulálja a fájlokat, és így megkönnyíti az olyan kód tesztelését, amely a fopen(), file_get_contents(), parse_ini_file() és hasonló függvényeket használja. Használati példa:

# Tesztelt osztály
class Logger
{
	public function __construct(
		private string $logFile,
	) {
	}

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

# Új üres fájl
$file = Tester\FileMock::create('');

$logger = new Logger($file);
$logger->log('Login');
$logger->log('Logout');

# Teszteljük a létrehozott tartalmat
Assert::same("Login\nLogout\n", file_get_contents($file));

Assert::with()

Ez nem egy assert, hanem egy segítő az objektumok privát metódusainak és property-jeinek tesztelésére.

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

$ent = new Entity;

Assert::with($ent, function () {
	Assert::true($this->enabled); // hozzáférhetővé tett privát $ent->enabled
});

Helpers::purge()

A purge() metódus létrehozza a megadott könyvtárat, és ha már létezik, törli annak teljes tartalmát. Hasznos ideiglenes könyvtár létrehozására. Például a tests/bootstrap.php-ban:

@mkdir(__DIR__ . '/tmp');  # @ - a könyvtár már létezhet

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

Environment::lock()

A tesztek párhuzamosan futnak. Néha azonban szükségünk van arra, hogy a tesztek futása ne fedje át egymást. Tipikusan adatbázis teszteknél szükséges, hogy a teszt előkészítse az adatbázis tartalmát, és egy másik teszt a futása alatt ne nyúljon az adatbázishoz. Ezekben a tesztekben használjuk a Tester\Environment::lock($name, $dir)-t:

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

Az első paraméter a zár neve, a második az elérési út a zár tárolására szolgáló könyvtárhoz. Az a teszt, amelyik először megszerzi a zárat, lefut, a többi tesztnek várnia kell a befejezésére.

Environment::bypassFinals()

A final-ként megjelölt osztályokat vagy metódusokat nehéz tesztelni. A Tester\Environment::bypassFinals() hívása a teszt elején azt eredményezi, hogy a final kulcsszavak a kód betöltése során kimaradnak.

require __DIR__ . '/bootstrap.php';

Tester\Environment::bypassFinals();

class MyClass extends NormallyFinalClass  # <-- A NormallyFinalClass már nem final
{
	// ...
}

Environment::setup()

  • javítja a hibakiírás olvashatóságát (beleértve a színezést), különben az alapértelmezett PHP stack trace jelenik meg
  • bekapcsolja annak ellenőrzését, hogy a tesztben hívtak-e assertokat, különben az assertok nélküli teszt (például elfelejtett) is sikeres lesz
  • a --coverage használatakor automatikusan elindítja a futtatott kódról szóló információk gyűjtését (tovább leírva)
  • kiírja az OK vagy FAILURE állapotot a szkript végén

Environment::setupFunctions()

Létrehozza a globális test(), testException(), setUp() és tearDown() függvényeket, amelyekbe tagolhatja a teszteket.

test('teszt leírása', function () {
	Assert::same(123, foo());
	Assert::false(bar());
	// ...
});

Environment::VariableRunner

Lehetővé teszi annak megállapítását, hogy a tesztet közvetlenül futtatták-e, vagy a Tester segítségével.

if (getenv(Tester\Environment::VariableRunner)) {
	# Tester által futtatva
} else {
	# Másképp futtatva
}

Environment::VariableThread

A Tester párhuzamosan futtatja a teszteket a megadott számú szálon. Ha érdekel minket a szál száma, azt a környezeti változóból tudjuk meg:

echo "A " . getenv(Tester\Environment::VariableThread) . ". számú szálban futok";