Nette Documentation Preview

syntax
A Testerrel való kezdés
***********************

<div class=perex>

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)

</div>

Írtad már a következő kódot PHP-ben?

```php
$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? .[#toc-what-makes-tester-unique]
=============================================================

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 .{file:ArrayTest.php}
<?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 |Assertions], 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:

/--pre .[terminal]
$ php ArrayTest.php

<span style="color:#FFF; background-color:#090">OK</span>
\--

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:

/--pre .[terminal]
$ php ArrayTest.php

<span style="color: #FFF">Failed: </span><span style="color: #FF0">['foo']</span><span style="color: #FFF"> should contain </span><span style="color: #FF0">'XXX'</span>

<span style="color: #CCC">in </span><span style="color: #FFF">ArrayTest.php(17)</span><span style="color: #808080"> Assert::contains('XXX', $stack);</span>

<span style="color: #FFF; background-color: #900">FAILURE</span>
\--

Az írásról a [Tesztek írása |Writing Tests] fejezetben folytatjuk.


Telepítés és követelmények .[#toc-installation-and-requirements]
================================================================

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 |#supported PHP versions] táblázatot). A telepítés előnyben részesített módja a [Composer |best-practices:composer]:

/--pre .[terminal]
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):

/--pre .[terminal]
vendor/bin/tester
\--


A tesztek futtatása .[#toc-running-tests]
=========================================

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.

/--pre .[terminal]
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:

- <code style="color: #CCC; background-color: #000">.</code> - teszt átment
- <code style="color: #CCC; background-color: #000">s</code> - a tesztet kihagyta
- <code style="color: #FFF; background-color: #900">F</code> - a teszt sikertelen

A kimenet így nézhet ki:

/--pre .[terminal]
 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.5.2

Note: No php.ini is used.
PHP 8.3.2 (cli) | php -n | 8 threads

........s................<span style="color: #FFF; background-color: #900">F</span>.........

<span style="color: #F00">-- FAILED: greeting.phpt</span>
<span style="color: #CCC">   </span><span style="color: #FFF">Failed: </span><span style="color: #FF0">'Hello John'</span><span style="color: #FFF"> should be</span>
<span style="color: #FFF">       ... </span><span style="color: #FF0">'Hello Peter'</span>

<span style="color: #CCC">   in </span><span style="color: #FFF">greeting.phpt(19)</span><span style="color: #808080"> Assert::same('Hello Peter', $o->say('John'));</span>

<span style="color: #FFF; background-color: #900">FAILURES! (35 tests, 1 failures, 1 skipped, 1.7 seconds)</span>
\--

A tesztek lefutottak, egy nem sikerült, egyet kihagytak.

Folytatjuk a [tesztek futtatása |Running tests] fejezetben.


Figyelő üzemmód .[#toc-watch-mode]
==================================

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 |running-tests#w-watch-path] paraméterrel indíthatod el.


CodeCoverage jelentések .[#toc-codecoverage-reports]
====================================================

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":https://files.nette.org/tester/coverage.html a kódlefedettséggel.


Támogatott PHP verziók .[#toc-supported-php-versions]
=====================================================

| 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 |https://hhvm.com] 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:

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 átment
  • s – a tesztet kihagyta
  • F – 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: