Începeți cu Nette Tester
Chiar și programatorii buni fac greșeli. Diferența dintre un programator bun și unul rău este că cel bun o face doar o dată și data viitoare o detectează folosind teste automatizate.
- “Cine nu testează, este condamnat să-și repete greșelile.” (proverb)
- “De îndată ce ne debarasăm de o greșeală, apare alta.” (Legea lui Murphy)
- “Oricând aveți impulsul de a afișa o variabilă pe ecran, scrieți mai degrabă un test.” (Martin Fowler)
Ați scris vreodată în PHP un cod similar?
$obj = new MyClass;
$result = $obj->process($input);
var_dump($result);
Adică ați afișat rezultatul apelului funcției doar pentru a verifica cu ochiul liber dacă returnează ceea ce trebuie? Sigur faceți asta de multe ori pe zi. Mâna pe inimă: în cazul în care totul funcționează corect, ștergeți acest cod? Vă așteptați ca clasa să nu se strice în viitor? Legile lui Murphy garantează contrariul :-)
În esență, ați scris un test. Trebuie doar să îl modificați ușor, astfel încât să nu necesite verificare vizuală, ci să se verifice singur. Și dacă nu ștergeți testul, îl puteți rula oricând în viitor și verifica dacă totul funcționează în continuare așa cum trebuie. Cu timpul veți crea un număr mare de astfel de teste, deci ar fi util să le rulați automatizat.
Și cu toate acestea vă ajută tocmai Nette Tester.
Prin ce este unic Tester?
Scrierea testelor pentru Nette Tester este unică prin faptul că fiecare test este un script PHP obișnuit, care poate fi rulat independent.
Deci, când scrieți un test, îl puteți rula simplu și afla dacă, de exemplu, nu conține o eroare de programare. Dacă funcționează corect. Dacă nu, îl puteți depana ușor pas cu pas în IDE-ul dumneavoastră și căuta eroarea. Îl puteți chiar deschide în browser.
Și, mai presus de toate – prin rularea sa, efectuați testul. Aflați imediat dacă a trecut sau a eșuat. Cum? Să
arătăm. Scriem un test trivial pentru lucrul cu array-uri PHP și îl salvăm în fișierul ArrayTest.php
:
<?php
use Tester\Assert;
require __DIR__ . '/vendor/autoload.php'; # încărcarea autoloader-ului Composer
Tester\Environment::setup(); # inițializarea Nette Tester
$stack = [];
Assert::same(0, count($stack)); # așteptăm ca count() să returneze zero
$stack[] = 'foo';
Assert::same(1, count($stack)); # așteptăm ca count() să returneze unu
Assert::contains('foo', $stack); # verificăm dacă $stack conține elementul 'foo'
După cum vedeți, așa-numitele metode de aserțiune precum
Assert::same()
sunt folosite pentru a confirma că valoarea reală corespunde valorii așteptate.
Avem testul scris și îl putem rula din linia de comandă. Prima rulare ne va dezvălui eventualele erori de sintaxă și dacă nu ați făcut nicio greșeală de tipar, se va afișa:
$ php ArrayTest.php
OK
Încercați să schimbați în test afirmația într-una falsă Assert::contains('XXX', $stack);
și urmăriți ce
se întâmplă la rulare:
$ 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 (mai detaliat în tabelul #versiuni-php-suportate). Metoda preferată de instalare este prin Composer:
composer require --dev nette/tester
Încercați să rulați Nette Tester din linia de comandă (fără parametri va afișa doar ajutorul):
vendor/bin/tester
Rularea testelor
Pe măsură ce aplicația crește, numărul de teste crește odată cu ea. Nu ar fi practic să rulăm testele unul câte unul. De aceea, Tester dispune de un rulator de teste în masă, pe care îl apelăm din linia de comandă. Ca parametru specificăm directorul în care se află testele. Punctul înseamnă directorul curent.
vendor/bin/tester .
Rulatorul de teste va căuta în directorul specificat și în toate subdirectoarele și va găsi testele, care sunt fișiere
*.phpt
și *Test.php
. Va găsi astfel și testul nostru ArrayTest.php
, deoarece corespunde
măștii.
Apoi va începe testarea. Fiecare test îl rulează ca un nou proces PHP, astfel încât se desfășoară complet izolat de celelalte. Le rulează în paralel în mai multe fire de execuție și datorită acestui fapt este extrem de rapid. Și rulează mai întâi testele care au eșuat la rularea anterioară, astfel încât aflați imediat dacă ați reușit să reparați eroarea.
În timpul executării testelor, Tester afișează continuu rezultatele pe terminal sub formă de caractere:
.
– testul a trecuts
– testul a fost omis (skipped)F
– testul a eșuat (failed)
Ieșirea 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 Watch
Refactorizați codul? Sau chiar dezvoltați conform metodologiei TDD (Test Driven Development)? Atunci vă va plăcea modul watch. Tester în acest mod urmărește codurile sursă și la modificare se rulează singur.
La dezvoltare aveți deci în colțul monitorului un terminal, unde vă luminează o bară de stare verde, și când se schimbă brusc în roșu, știți că tocmai ați făcut ceva nu tocmai bine. Este de fapt un joc grozav, în care programați și încercați să mențineți culoarea.
Modul watch se pornește cu parametrul –watch.
Rapoarte CodeCoverage
Tester poate genera rapoarte cu o prezentare generală a cât de mult cod sursă acoperă testele. Raportul poate fi fie în format HTML lizibil pentru oameni, fie Clover XML pentru prelucrare automată ulterioară.
Consultați exemplul de raport HTML cu acoperirea codului.
Versiuni PHP suportate
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 |
Valabil pentru ultima versiune patch.
Tester până la versiunea 1.7 a suportat și HHVM 3.3.0 sau mai recent (prin
tester -p hhvm
). Suportul a fost întrerupt începând cu versiunea Tester 2.0.