Ajutoarele

DomQuery

Tester\DomQuery este o clasă care extinde SimpleXMLElement cu metode care facilitează testarea conținutului HTML sau XML.

# let's have an HTML document in $html that we load
$dom = Tester\DomQuery::fromHtml($html);

# we can test the presence of elements using CSS selectors
Assert::true($dom->has('form#registration'));
Assert::true($dom->has('input[name="username"]'));
Assert::true($dom->has('input[type="submit"]'));

# or select elements as array of DomQuery
$elems = $dom->find('input[data-autocomplete]');

FileMock

Tester\FileMock emulează fișiere în memorie pentru a vă ajuta să testați un cod care utilizează funcții precum fopen(), file_get_contents() sau parse_ini_file(). De exemplu:

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

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

# New empty file
$file = Tester\FileMock::create('');

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

# Created content testing
Assert::same("Login\nLogout\n", file_get_contents($file));

Assert::with()

Aceasta nu este o afirmație, ci un ajutor pentru testarea metodelor private și a obiectelor de proprietate.

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

$ent = new Entity;

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

Helpers::purge()

Metoda purge() creează directorul specificat și, dacă acesta există deja, șterge întregul său conținut. Această metodă este utilă pentru crearea de directoare temporare. De exemplu, în tests/bootstrap.php:

@mkdir(__DIR__ . '/tmp');  # @ - directory may already exist

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

Environment::lock()

Testele se execută în paralel. Uneori este nevoie să nu suprapunem rularea testelor. De obicei, testele bazelor de date trebuie să pregătească conținutul bazei de date și nu trebuie să fie perturbate de nimic în timpul rulării testului. În aceste cazuri, folosim Tester\Environment::lock($name, $dir):

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

Primul argument este un nume de blocare. Al doilea este o cale către directorul în care se salvează blocajul. Testul care obține primul blocajul se execută. Celelalte teste trebuie să aștepte până la finalizarea acestuia.

Environment::bypassFinals()

Clasele sau metodele marcate ca final sunt greu de testat. Apelarea Tester\Environment::bypassFinals() într-un început de test determină eliminarea cuvintelor cheie final în timpul încărcării codului.

require __DIR__ . '/bootstrap.php';

Tester\Environment::bypassFinals();

class MyClass extends NormallyFinalClass  # <-- NormallyFinalClass is not final anymore
{
	// ...
}

Environment::setup()

  • îmbunătățește lizibilitatea descărcării erorilor (colorare inclusă), în caz contrar, se tipărește implicit stack trace-ul PHP
  • permite verificarea faptului că aserțiunile au fost apelate în test, în caz contrar, testele fără aserțiuni (de exemplu, uitate) trec și ele
  • pornește automat colectorul de acoperire a codului atunci când se utilizează --coverage (descris mai târziu)
  • tipărește starea OK sau FAILURE la sfârșitul scriptului.

Environment::setupFunctions()

Creează funcțiile globale test(), testException(), setUp() și tearDown() în care puteți împărți testele.

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

Environment::VariableRunner

Vă permite să aflați dacă testul a fost executat direct sau prin intermediul Tester.

if (getenv(Tester\Environment::VariableRunner)) {
	# run by Tester
} else {
	# another way
}

Environment::VariableThread

Tester execută testele în paralel într-un anumit număr de fire de execuție. Vom găsi un număr de fire într-o variabilă de mediu atunci când suntem interesați:

echo "I'm running in a thread number " . getenv(Tester\Environment::VariableThread);