Kezdjük a Nette Testerrel
Még a jó programozók is követnek el hibákat. A különbség a jó és a rossz programozó között az, hogy a jó csak egyszer követi el, és legközelebb automatizált tesztek segítségével fedezi fel.
- “Aki nem tesztel, arra van ítélve, hogy megismételje hibáit.” (közmondás)
- “Amint megszabadulunk egy hibától, megjelenik egy másik.” (Murphy törvénye)
- “Amikor késztetést érzel arra, hogy kiírj egy változót a képernyőre, inkább írj egy tesztet.” (Martin Fowler)
Írtál már valaha ehhez hasonló kódot PHP-ban?
$obj = new MyClass;
$result = $obj->process($input);
var_dump($result);
Tehát kiírtad a függvényhívás eredményét csak azért, hogy szemmel ellenőrizd, hogy azt adja-e vissza, amit kell? Biztosan ezt teszed naponta sokszor. Őszintén: abban az esetben, ha minden rendben működik, törlöd ezt a kódot? Arra számítasz, hogy az osztály a jövőben nem fog elromlani? Murphy törvényei az ellenkezőjét garantálják :-)
Lényegében írtál egy tesztet. Csak kissé módosítani kell, hogy ne igényeljen szemrevételezést, hanem önmagát ellenőrizze. És ha nem törlöd a tesztet, bármikor futtathatod a jövőben, és ellenőrizheted, hogy minden továbbra is úgy működik-e, ahogy kell. Idővel sok ilyen tesztet hozol létre, ezért jó lenne automatizáltan futtatni őket.
És mindebben segít neked a Nette Tester.
Mitől egyedi a Tester?
A Nette Testerhez való tesztek írása abban egyedi, hogy minden teszt egy szokásos PHP szkript, amelyet önállóan lehet futtatni.
Tehát amikor tesztet írsz, egyszerűen futtathatod, és megállapíthatod, hogy nincs-e benne például programozási hiba. Hogy helyesen működik-e. Ha nem, könnyen lépésenként végigmehetsz rajta az IDE-dben, és keresheted a hibát. Akár meg is nyithatod a böngészőben.
És mindenekelőtt – azzal, hogy futtatod, végrehajtod a tesztet. Azonnal megtudod, hogy átment-e vagy meghiúsult.
Hogyan? Mutassuk meg. Írunk egy triviális tesztet a PHP tömbökkel való munkára, és elmentjük az ArrayTest.php
fájlba:
<?php
use Tester\Assert;
require __DIR__ . '/vendor/autoload.php'; # Composer autoloader betöltése
Tester\Environment::setup(); # Nette Tester inicializálása
$stack = [];
Assert::same(0, count($stack)); # elvárjuk, hogy a count() nullát adjon vissza
$stack[] = 'foo';
Assert::same(1, count($stack)); # elvárjuk, hogy a count() egyet adjon vissza
Assert::contains('foo', $stack); # ellenőrizzük, hogy a $stack tartalmazza-e a 'foo' elemet
Ahogy látod, az ún. assert metódusok, mint az
Assert::same()
, arra szolgálnak, hogy megerősítsék, hogy a tényleges érték megfelel a várt értéknek.
A tesztet megírtuk, és futtathatjuk a parancssorból. Az első futtatás felfedi az esetleges szintaktikai hibákat, és ha sehol sem vétettél elírást, kiíródik:
$ php ArrayTest.php
OK
Próbáld meg a tesztben az állítást hamisra változtatni: Assert::contains('XXX', $stack);
, és figyeld meg,
mi történik futtatáskor:
$ php ArrayTest.php Failed: ['foo'] should contain 'XXX' in ArrayTest.php(17) Assert::contains('XXX', $stack); FAILURE
A további írásról a Tesztek írása fejezetben folytatjuk.
Telepítés és követelmények
A Tester által igényelt minimális PHP verzió 7.1 (részletesebben a támogatott-php-verziók táblázatban). Az előnyben részesített telepítési mód a Composer segítségével történik:
composer require --dev nette/tester
Próbáld meg a parancssorból futtatni a Nette Testert (paraméterek nélkül csak a súgót írja ki):
vendor/bin/tester
Tesztek futtatása
Ahogy az alkalmazás növekszik, a tesztek száma is növekszik vele. Nem lenne praktikus a teszteket egyenként futtatni. Ezért a Tester rendelkezik egy tömeges tesztfuttatóval, amelyet a parancssorból hívunk meg. Paraméterként megadjuk azt a könyvtárat, amelyben a tesztek találhatók. A pont az aktuális könyvtárat jelenti.
vendor/bin/tester .
A tesztfuttató átvizsgálja a megadott könyvtárat és az összes alkönyvtárat, és megkeresi a teszteket, amelyek
*.phpt
és *Test.php
fájlok. Így megtalálja a mi ArrayTest.php
tesztünket is, mivel
megfelel a maszknak.
Ezután elindítja a tesztelést. Minden tesztet új PHP folyamatként futtat, így teljesen izoláltan zajlik a többitől. Párhuzamosan futtatja őket több szálon, és ennek köszönhetően rendkívül gyors. És elsőként azokat a teszteket futtatja, amelyek az előző futtatáskor meghiúsultak, így azonnal megtudod, hogy sikerült-e kijavítanod a hibát.
A tesztek végrehajtása során a Tester folyamatosan kiírja az eredményeket a terminálra karakterekként:
.
– a teszt sikeres volt (passed)s
– a teszt kihagyva (skipped)F
– a teszt meghiúsult (failed)
A kimenet így nézhet ki:
_____ ___ ___ _____ ___ ___ |_ _/ __)( __/_ _/ __)| _ ) |_| \___ /___) |_| \___ |_|_\ v2.5.2 Note: No php.ini is used. PHP 8.3.2 (cli) | php -n | 8 threads ........s................F......... -- FAILED: greeting.phpt Failed: 'Hello John' should be ... 'Hello Peter' in greeting.phpt(19) Assert::same('Hello Peter', $o->say('John')); FAILURES! (35 tests, 1 failures, 1 skipped, 1.7 seconds)
35 teszt futott le, egy meghiúsult, egyet kihagytak.
Tovább folytatjuk a Tesztek futtatása fejezetben.
Watch mód
Refaktorálod a kódot? Vagy akár a TDD (Test Driven Development) módszertan szerint fejlesztesz? Akkor tetszeni fog a watch mód. A Tester ebben figyeli a forráskódokat, és változás esetén önmagát futtatja.
Fejlesztés közben így a monitor sarkában van egy terminál, ahol zöld állapotjelző sor világít rád, és amikor hirtelen pirosra vált, tudod, hogy éppen valamit nem csináltál teljesen jól. Ez tulajdonképpen egy nagyszerű játék, ahol programozol, és próbálod tartani a színt.
A Watch mód a –watch paraméterrel indítható.
Kódlefedettségi jelentések
A Tester képes jelentéseket generálni arról, hogy a tesztek mennyi forráskódot fednek le. A jelentés lehet ember által olvasható HTML formátumban, vagy Clover XML formátumban további gépi feldolgozáshoz.
Nézze meg a HTML jelentés példája a kódlefedettséggel.
Támogatott PHP verziók {#támogatott-php-verziók}
verzió | kompatibilis PHP verzió |
---|---|
Tester 2.5 | PHP 8.0 – 8.3 |
Tester 2.4 | PHP 7.2 – 8.2 |
Tester 2.3 | PHP 7.1 – 8.0 |
Tester 2.1 – 2.2 | PHP 7.1 – 7.3 |
Tester 2.0 | PHP 5.6 – 7.3 |
Tester 1.7 | PHP 5.3 – 7.3 + HHVM 3.3+ |
Tester 1.6 | PHP 5.3 – 7.0 + HHVM |
Tester 1.3 – 1.5 | PHP 5.3 – 5.6 + HHVM |
Tester 0.9 – 1.2 | PHP 5.3 – 5.6 |
Az utolsó patch verzióra érvényes.
A Tester 1.7-es verzióig támogatta a HHVM 3.3.0 vagy újabb verzióját is (a
tester -p hhvm
segítségével). A támogatás a Tester 2.0 verziójától megszűnt.