Nette/Tester a PhpStorm
Rozhodl jsem se přepsat všechny svoje testy z PHPUnitu na Nette\Tester a po prvním týdnu mohu s klidným svědomím říct, že se přepisování velice daří a jsem s Testerem spokojený.
Vytvoření ekosystému
Abychom mohli testy spouštět, potřebujeme do projektu nainstalovat Nette\Tester a nakopírovat pár kraťoučkých scriptů. Instalovat doporučuji pomocí Composeru
"require-dev": {
"nette/tester": "@dev"
},
Pomocí příznaku --dev
nainstalujeme i “vývojové” závislosti (tedy nette/tester
)
$ composer update --dev
Potřebujeme testy spouštět, takže vytvoříme soubor tests/run-tests.sh
(předpokládám linux) a nakopírujeme do něj tento script. Pokud chcete spouštět testy i na Windows, potřebujete takovýto .bat soubor.
Vytvořím si prázdný tests/php.ini-unix
, nebo jeho alternativu pro Windows tests/php.ini-win
. Do tohoto .ini
souboru můžeme zapisovat specifické nastavení pro testovací prostředí. Například inicializaci memcache, nebo jiných php rozšíření.
S oblibou používám i script na php lint, který zkontroluje syntaxi všech php scriptů, předtím, než spustí testy.
Testy v Travisu spouštím jednoduše $ ./tests/run-tests.sh -s tests/KdybyTests/
, viz konfigurace.
Jednotlivé testy
Každý test potřebuje základní bootstrap.php
soubor, podobný tomuto, který jsem si umístil do tests/KdybyTests/bootstrap.php
. Obsahuje načtení autoloaderu, který vygeneroval Composer, zavěšení error/exception handlerů, unikátní temp složka (aby se testy mohly spouštět paralelně), vynulování proměnných prostředí, inicializace code coverage a pomocné funkce.
Každý test musí mít koncovku .phpt
a obsahuje načtení bootstrapu, hlavičku s metadaty o testu a samotné spuštění testu
Jednotlivé testy dědí od Tester\TestCase
a obsahují klasické test
metody, jaké známe z PHPUnitu.
Asserty nevoláme nad testem, ale pomocí statické třídy Tester\Assert
.
Šablona pro rychlé vytváření testů
V PhpStormu jsem si nadefinoval šablonu, díky které je vytvoření nového testu otázka tří vteřin. Šablony jsou v “File > Settings > File Templates > záložka Templates”. Šablonu pojmenujeme například “Nette test” a dáme jí koncovku phpt
.
<?php
/**
* Test: Kdyby\\${PACKAGE}\\${NAME}${DESCRIPTION}.
*
* @testCase Kdyby\\${PACKAGE}\\${NAME}Test
* @author Filip Procházka <[email protected]>
* @package Kdyby\\${PACKAGE}
*/
namespace KdybyTests\\${PACKAGE};
use Kdyby;
use Nette;
use Tester;
use Tester\Assert;
require_once __DIR__ . '/../bootstrap.php';
/**
* @author Filip Procházka <[email protected]>
*/
class ${NAME}Test extends Tester\TestCase
{
public function setUp()
{
}
public function test()
{
}
}
\run(new ${NAME}Test());
Spouštěč testů
PhpStorm obsahuje podporu pro spouštění bashových scriptů (a nejspíš i .bat
, ale to zjišťovat nebudu). Je nutné nainstalovat plugin BashSupport, ideálně pomocí repozitáře v Settings > Plugins > Browse repositories
.
Konfiguruje se velice snadno. Kliknu pravým tlačítkem ma tests/run-tests.sh
a zvolím “Create ‘run-tests’”
a nastavím složku s testy a pracovní adresář.
Testy spustím tak, že vyberu příslušný spouštěč a kliknu na zelené “Play”
Průběh testů pak vypadá takto
Není také problém, zvolit kterýkoliv test a jednoduše ho spustit. Každý test je díky bootstrapu a funkci run()
na konci soběstačným scriptem, který je možné spouštět bez jakýchkoliv dalších závislostí.
Závěrem
Nette/Tester samozřejmě ještě není dokonalý. Chybí mockovací nástroj (naštěstí si můžeme vybírat z několika jiných) a také má pár drobných mušek, co se týče použitelnosti. Kvalitativně je ovšem na úplně jiné úrovni, než přeplácaný a zbastlený PHPUnit a vřele ho doporučuji. Jako bonus je jeho používání v PhpStormu velice pohodlné.
Autor: Filip Procházka