Î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 trecut
  • s – 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.