Nette Documentation Preview

syntax
Noțiuni de bază pentru a începe cu Tester
*****************************************

<div class=perex>

Chiar și programatorii buni fac greșeli. Diferența dintre un programator bun și unul rău este că cel bun o va face o singură dată, iar data viitoare o va detecta cu ajutorul testelor automate.

- "Cel care nu testează este condamnat să își repete propriile greșeli." (proverb înțelept)
- "Când scăpăm de o eroare, apare alta." (Legea lui Murphy)
- "Ori de câte ori ești tentat să tipărești o afirmație, scrie-o în schimb ca pe un test." (Martin Fowler)

</div>

Ați scris vreodată următorul cod în PHP?

```php
$obj = new MyClass;
$result = $obj->process($input);

var_dump($result);
```

Deci, ați aruncat vreodată rezultatul apelului unei funcții doar pentru a verifica cu ochiul liber dacă returnează ceea ce ar trebui să returneze? Cu siguranță că o faceți de multe ori pe zi. Cu mâna pe inimă, dacă totul funcționează, ștergeți acest cod și vă așteptați ca clasa să nu fie stricată în viitor? Legea lui Murphy garantează contrariul :-)

De fapt, dumneavoastră ați scris testul. Acesta are nevoie de o ușoară modificare pentru a nu necesita inspecția noastră, ci pur și simplu pentru a se putea verifica singur. Iar dacă nu l-ați șters, am putea să-l rulăm oricând în viitor pentru a verifica dacă totul funcționează în continuare așa cum trebuie. Este posibil să creați o cantitate mare de astfel de teste de-a lungul timpului, așa că ar fi bine dacă am putea să le rulăm automat.

Iar Nette Tester vă ajută exact în acest sens.


Ce face ca Tester să fie unic? .[#toc-what-makes-tester-unique]
===============================================================

Scrierea testelor pentru Nette Tester este unică prin faptul că **fiecare test este un script PHP standard care poate fi rulat de sine stătător.**

Astfel, atunci când scrieți un test, îl puteți rula pur și simplu pentru a vedea dacă există o eroare de programare. Dacă funcționează corect. Dacă nu, puteți trece cu ușurință prin program în IDE-ul dvs. și căutați o eroare. Puteți chiar să-l deschideți într-un browser.

Și cel mai important - prin rularea acestuia, veți efectua testul. Veți afla imediat dacă a trecut sau a eșuat. Cum? Să ne arătăm aici. Să scriem un test trivial pentru utilizarea matricei PHP și să-l salvăm în fișierul `ArrayTest.php`:

```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'
```

După cum puteți vedea, [metodele de aserțiune |Assertions], cum ar fi `Assert::same()`, sunt utilizate pentru a afirma că o valoare reală corespunde unei valori așteptate.

Testul este scris, îl putem rula din linia de comandă. Prima rulare va dezvălui orice erori de sintaxă, iar dacă nu ați făcut o greșeală de scriere, veți vedea:

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

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

Încercați să schimbați declarația în `Assert::contains('XXX', $stack);` în test și urmăriți ce se întâmplă la execuție:

/--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>
\--

Continuăm despre scriere în capitolul [Scrierea testelor |Writing Tests].


Instalare și cerințe .[#toc-installation-and-requirements]
==========================================================

Versiunea minimă de PHP necesară pentru Tester este 7.1 (pentru mai multe detalii, consultați tabelul cu [versiunile PHP acceptate |#supported PHP versions] ). Modalitatea preferată de instalare este prin [Composer |best-practices:composer]:

/--pre .[terminal]
composer require --dev nette/tester
\--

Încercați să rulați Nette Tester din linia de comandă (fără argumente va afișa doar un rezumat de ajutor):

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


Rularea testelor .[#toc-running-tests]
======================================

Pe măsură ce aplicația noastră crește, numărul de teste crește odată cu ea. Nu ar fi practic să executăm testele unul câte unul. Prin urmare, Tester dispune de un rulator de teste în masă, pe care îl invocăm din linia de comandă. Parametrul este directorul în care se află testele. Punctul indică directorul curent.

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

Executantul Nette Tester caută în directorul specificat și în toate subdirectoarele și caută testele, care sunt fișierele `*.phpt` și `*Test.php`. Acesta va găsi, de asemenea, testul nostru `ArrayTest.php`, deoarece se potrivește cu masca.

Apoi începe testarea. Rulează fiecare test ca un nou proces PHP, astfel încât acesta se execută complet izolat de celelalte. Se execută în paralel în mai multe fire de execuție, ceea ce îl face extrem de rapid. Și rulează mai întâi testele care au eșuat în timpul rulării anterioare, astfel încât veți ști imediat dacă ați remediat eroarea.

Pentru fiecare test efectuat, executorul tipărește un caracter pentru a indica progresul:

- <code style="color: #CCC; background-color: #000">.</code> - test trecut
- <code style="color: #CCC; background-color: #000">s</code> - testul a fost sărit
- <code style="color: #FFF; background-color: #900">F</code> - testul a eșuat

Rezultatul poate arăta astfel:

/--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>
\--

Au fost rulate 35 de teste, unul a eșuat, unul a fost omis.

Continuăm în capitolul [Rularea testelor |Running tests].


Modul de supraveghere .[#toc-watch-mode]
========================================

Refaceți codul? Sau chiar dezvoltați în conformitate cu metodologia TDD (Test Driven Development)? Atunci vă va plăcea modul de supraveghere. Tester monitorizează codurile sursă și se execută singur atunci când sunt modificate.

În timpul dezvoltării, aveți un terminal în colțul monitorului, unde bara de stare verde se aprinde la dumneavoastră, iar când devine brusc roșie, știți că tocmai ați făcut ceva nedorit. Este de fapt un joc grozav în care programezi și încerci să te ții de culoare.

Modul Watch se pornește cu ajutorul parametrului [--watch |running-tests#w-watch-path].


Rapoarte CodeCoverage .[#toc-codecoverage-reports]
==================================================

Testerul poate genera rapoarte cu o imagine de ansamblu a cantității de cod sursă pe care o acoperă testele. Raportul poate fi fie în format HTML lizibil pentru oameni, fie în format Clover XML pentru procesarea ulterioară de către mașină.

Consultați "exemplul de raport HTML":https://files.nette.org/tester/coverage.html cu acoperirea codului.


Versiuni PHP acceptate .[#toc-supported-php-versions]
=====================================================

| versiune | compatibil cu PHP
|------------------|-------------------
| 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

Se aplică la cele mai recente versiuni de patch-uri.

Până la versiunea 1.7 Tester a acceptat [HHVM |https://hhvm.com] 3.3.0 sau mai nou (utilizând `tester -p hhvm`). Suportul a fost abandonat începând cu Tester 2.0. Utilizarea era simplă:

Noțiuni de bază pentru a începe cu Tester

Chiar și programatorii buni fac greșeli. Diferența dintre un programator bun și unul rău este că cel bun o va face o singură dată, iar data viitoare o va detecta cu ajutorul testelor automate.

  • „Cel care nu testează este condamnat să își repete propriile greșeli.“ (proverb înțelept)
  • „Când scăpăm de o eroare, apare alta.“ (Legea lui Murphy)
  • „Ori de câte ori ești tentat să tipărești o afirmație, scrie-o în schimb ca pe un test.“ (Martin Fowler)

Ați scris vreodată următorul cod în PHP?

$obj = new MyClass;
$result = $obj->process($input);

var_dump($result);

Deci, ați aruncat vreodată rezultatul apelului unei funcții doar pentru a verifica cu ochiul liber dacă returnează ceea ce ar trebui să returneze? Cu siguranță că o faceți de multe ori pe zi. Cu mâna pe inimă, dacă totul funcționează, ștergeți acest cod și vă așteptați ca clasa să nu fie stricată în viitor? Legea lui Murphy garantează contrariul :-)

De fapt, dumneavoastră ați scris testul. Acesta are nevoie de o ușoară modificare pentru a nu necesita inspecția noastră, ci pur și simplu pentru a se putea verifica singur. Iar dacă nu l-ați șters, am putea să-l rulăm oricând în viitor pentru a verifica dacă totul funcționează în continuare așa cum trebuie. Este posibil să creați o cantitate mare de astfel de teste de-a lungul timpului, așa că ar fi bine dacă am putea să le rulăm automat.

Iar Nette Tester vă ajută exact în acest sens.

Ce face ca Tester să fie unic?

Scrierea testelor pentru Nette Tester este unică prin faptul că fiecare test este un script PHP standard care poate fi rulat de sine stătător.

Astfel, atunci când scrieți un test, îl puteți rula pur și simplu pentru a vedea dacă există o eroare de programare. Dacă funcționează corect. Dacă nu, puteți trece cu ușurință prin program în IDE-ul dvs. și căutați o eroare. Puteți chiar să-l deschideți într-un browser.

Și cel mai important – prin rularea acestuia, veți efectua testul. Veți afla imediat dacă a trecut sau a eșuat. Cum? Să ne arătăm aici. Să scriem un test trivial pentru utilizarea matricei PHP și să-l salvăm în fișierul 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'

După cum puteți vedea, metodele de aserțiune, cum ar fi Assert::same(), sunt utilizate pentru a afirma că o valoare reală corespunde unei valori așteptate.

Testul este scris, îl putem rula din linia de comandă. Prima rulare va dezvălui orice erori de sintaxă, iar dacă nu ați făcut o greșeală de scriere, veți vedea:

$ php ArrayTest.php

OK

Încercați să schimbați declarația în Assert::contains('XXX', $stack); în test și urmăriți ce se întâmplă la execuție:

$ php ArrayTest.php

Failed: ['foo'] should contain 'XXX'

in ArrayTest.php(17) Assert::contains('XXX', $stack);

FAILURE

Continuăm despre scriere în capitolul Scrierea testelor.

Instalare și cerințe

Versiunea minimă de PHP necesară pentru Tester este 7.1 (pentru mai multe detalii, consultați tabelul cu versiunile PHP acceptate ). Modalitatea preferată de instalare este prin Composer:

composer require --dev nette/tester

Încercați să rulați Nette Tester din linia de comandă (fără argumente va afișa doar un rezumat de ajutor):

vendor/bin/tester

Rularea testelor

Pe măsură ce aplicația noastră crește, numărul de teste crește odată cu ea. Nu ar fi practic să executăm testele unul câte unul. Prin urmare, Tester dispune de un rulator de teste în masă, pe care îl invocăm din linia de comandă. Parametrul este directorul în care se află testele. Punctul indică directorul curent.

vendor/bin/tester .

Executantul Nette Tester caută în directorul specificat și în toate subdirectoarele și caută testele, care sunt fișierele *.phpt și *Test.php. Acesta va găsi, de asemenea, testul nostru ArrayTest.php, deoarece se potrivește cu masca.

Apoi începe testarea. Rulează fiecare test ca un nou proces PHP, astfel încât acesta se execută complet izolat de celelalte. Se execută în paralel în mai multe fire de execuție, ceea ce îl face extrem de rapid. Și rulează mai întâi testele care au eșuat în timpul rulării anterioare, astfel încât veți ști imediat dacă ați remediat eroarea.

Pentru fiecare test efectuat, executorul tipărește un caracter pentru a indica progresul:

  • . – test trecut
  • s – testul a fost sărit
  • F – testul a eșuat

Rezultatul poate arăta astfel:

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  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)

Au fost rulate 35 de teste, unul a eșuat, unul a fost omis.

Continuăm în capitolul Rularea testelor.

Modul de supraveghere

Refaceți codul? Sau chiar dezvoltați în conformitate cu metodologia TDD (Test Driven Development)? Atunci vă va plăcea modul de supraveghere. Tester monitorizează codurile sursă și se execută singur atunci când sunt modificate.

În timpul dezvoltării, aveți un terminal în colțul monitorului, unde bara de stare verde se aprinde la dumneavoastră, iar când devine brusc roșie, știți că tocmai ați făcut ceva nedorit. Este de fapt un joc grozav în care programezi și încerci să te ții de culoare.

Modul Watch se pornește cu ajutorul parametrului –watch.

Rapoarte CodeCoverage

Testerul poate genera rapoarte cu o imagine de ansamblu a cantității de cod sursă pe care o acoperă testele. Raportul poate fi fie în format HTML lizibil pentru oameni, fie în format Clover XML pentru procesarea ulterioară de către mașină.

Consultați exemplul de raport HTML cu acoperirea codului.

Versiuni PHP acceptate

versiune compatibil cu PHP
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

Se aplică la cele mai recente versiuni de patch-uri.

Până la versiunea 1.7 Tester a acceptat HHVM 3.3.0 sau mai nou (utilizând tester -p hhvm). Suportul a fost abandonat începând cu Tester 2.0. Utilizarea era simplă: