A Testerrel való kezdés
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ó programozó csak egyszer követi el, és legközelebb automatizált tesztek segítségével észleli a hibát.
- “Aki nem tesztel, arra van ítélve, hogy megismételje a saját hibáit.” (bölcs közmondás)
- “Amikor megszabadulunk egy hibától, megjelenik egy másik.” (Murphy törvénye)
- “Amikor kísértésbe esel, hogy kinyomtasd a kijelentést, írd meg helyette tesztként.” (Martin Fowler)
Írtad már a következő kódot PHP-ben?
$obj = new MyClass;
$result = $obj->process($input);
var_dump($result);
Szóval, dobtál már ki egy függvényhívás eredményét, csak azért, hogy szemrevételezéssel ellenőrizd, hogy azt adja-e vissza, amit vissza kell adnia? Bizonyára naponta többször is megteszed. Tenyeret a szívedre téve, ha minden működik, törlöd ezt a kódot, és elvárod, hogy az osztály a jövőben nem fog elromlani? Murphy törvénye garantálja az ellenkezőjét :-)
Tulajdonképpen te írtad a tesztet. Kisebb módosításra szorul, hogy ne legyen szükség a mi ellenőrzésünkre, egyszerűen csak képes legyen önmagát ellenőrizni. És ha nem törölted, akkor a jövőben bármikor lefuttathatjuk, hogy ellenőrizzük, hogy még mindig minden úgy működik, ahogyan kell. Idővel nagy mennyiségű ilyen tesztet hozhatsz létre, ezért jó lenne, ha automatikusan lefuttathatnánk őket.
A Nette Tester pedig pontosan ebben segít.
Mi teszi egyedivé a Testert?
A Nette Tester tesztek írása abban egyedülálló, hogy minden teszt egy szabványos PHP szkript, amely önállóan is futtatható.
Így amikor tesztet ír, egyszerűen lefuttathatja, hogy megnézze, van-e programozási hiba. Ha megfelelően működik. Ha nem, akkor egyszerűen végigléphetsz a programon az IDE-ben, és megkeresheted a hibát. Akár meg is nyithatja egy böngészőben.
És ami a legfontosabb – a futtatásával elvégzi a tesztet. Azonnal megtudod, hogy átment-e vagy nem ment át. Hogyan?
Mutassuk meg itt. Írjunk egy triviális tesztet a PHP tömb használatára, és mentsük el a ArrayTest.php
fájlba:
<?php
use Tester\Assert;
require __DIR__ . '/vendor/autoload.php'; # load Composer autoloader
Tester\Environment::setup(); # initialization of Nette Tester
$stack = [];
Assert::same(0, count($stack)); # we expect count() to return zero
$stack[] = 'foo';
Assert::same(1, count($stack)); # we expect count() to return one
Assert::contains('foo', $stack); # verify that the $stack contains the item 'foo'
Amint láthatjuk, az assertion metódusok, mint például a
Assert::same()
, annak biztosítására szolgálnak, hogy egy tényleges érték megegyezik egy elvárt
értékkel.
A teszt meg van írva, parancssorból futtathatjuk. Az első futtatás során kiderül, hogy van-e szintaxis hiba, és ha nem elírás, akkor látjuk:
$ php ArrayTest.php
OK
Próbáljuk meg a tesztben az utasítást Assert::contains('XXX', $stack);
címre változtatni, és figyeljük
meg, mi történik a futtatáskor:
$ php ArrayTest.php Failed: ['foo'] should contain 'XXX' in ArrayTest.php(17) Assert::contains('XXX', $stack); FAILURE
Az írásról a Tesztek írása fejezetben folytatjuk.
Telepítés és követelmények
A Tester által megkövetelt minimális PHP-verzió a 7.1 (további részletekért lásd a támogatott PHP-verziók táblázatot). A telepítés előnyben részesített módja a Composer:
composer require --dev nette/tester
Próbálja meg futtatni a Nette Testert a parancssorból (argumentumok nélkül csak egy súgóösszefoglalót fog mutatni):
vendor/bin/tester
A tesztek futtatása
Ahogy alkalmazásunk növekszik, úgy növekszik vele együtt a tesztek száma is. 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. A paraméter az a könyvtár, amelyben a tesztek találhatók. A pont az aktuális könyvtárat jelzi.
vendor/bin/tester .
A Nette Tester futóprogram átnézi a megadott könyvtárat és az összes alkönyvtárat, és megkeresi a teszteket, amelyek
a *.phpt
és a *Test.php
fájlok. A ArrayTest.php
tesztünket is megtalálja, mivel az
megfelel a maszknak.
Ezután megkezdi a tesztelést. Minden egyes tesztet új PHP-folyamatként futtat, így az a többitől teljesen elszigetelten fut. Párhuzamosan fut több szálon, így rendkívül gyors. És először azokat a teszteket futtatja le, amelyek az előző futtatás során nem sikerültek, így rögtön tudni fogja, hogy kijavította-e a hibát.
A futó minden egyes elvégzett teszt után kiír egy karaktert a haladás jelzésére:
.
– teszt átments
– a tesztet kihagytaF
– a teszt sikertelen
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)
A tesztek lefutottak, egy nem sikerült, egyet kihagytak.
Folytatjuk a tesztek futtatása fejezetben.
Figyelő üzemmód
Refaktorálod a kódot? Vagy egyáltalán a TDD (Test Driven Development) módszertan szerint fejlesztesz? Akkor tetszeni fog a figyelési mód. A Tester figyeli a forráskódokat, és lefuttatja magát, ha változik.
Fejlesztés közben van egy terminál a monitor sarkában, ahol a zöld státuszsáv világít rád, és amikor hirtelen pirosra vált, tudod, hogy éppen valami nem kívánt dolgot csináltál. Ez tulajdonképpen egy remek játék, ahol programozol, és próbálod betartani a színt.
A Watch módot a –watch paraméterrel indíthatod el.
CodeCoverage jelentések
A Tester jelentéseket készíthet, amelyek áttekintik, hogy a tesztek mennyi forráskódot fednek le. A jelentés készülhet ember által olvasható HTML formátumban vagy Clover XML formátumban a további gépi feldolgozáshoz.
Lásd a minta HTML-jelentést a kódlefedettséggel.
Támogatott PHP verziók
verzió | kompatibilis a PHP-vel |
---|---|
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 |
A legújabb javítási verziókra vonatkozik.
Az 1.7-es verzióig a Tester támogatta a HHVM 3.3.0 vagy újabb verziót (a
tester -p hhvm
segítségével). A Tester 2.0 óta a támogatás megszűnt. A használat egyszerű volt: