Ce este un test unitar
Un test unitar este un program mic care verifică o singură bucată din codul tău — de obicei o funcție. Rulezi testele după fiecare modificare; dacă o modificare strică ceva, un test te anunță imediat, înainte de utilizatorii tăi.
Instrumentul standard în lumea PHP este PHPUnit. Se instalează o singură dată per proiect cu Composer — composer require --dev phpunit/phpunit — iar programul de rulare ajunge în proiect la ./vendor/bin/phpunit.
Testele fac și modificările sigure: cu teste bune poți rescrie o funcție și afli în câteva secunde dacă se comportă în continuare la fel.
Fișiere, clase și metode de test
Trei reguli de denumire fac dintr-un test un test:
1. Numele fișierului se termină în Test.php — pentru calc.php scrii CalcTest.php. PHPUnit caută fișiere denumite astfel.
2. Clasa din fișier extinde TestCase, clasa de bază a PHPUnit, importată cu use PHPUnit\Framework\TestCase;.
3. Numele metodei începe cu test — de exemplu testAdd. Metodele fără acest prefix nu sunt rulate ca teste, așa că metodele ajutătoare pot sta în aceeași clasă.
În interiorul testului apelezi funcția și dai valoarea așteptată și valoarea obținută efectiv unei aserțiuni precum $this->assertSame(5, add(2, 3)). O aserțiune picată marchează testul ca picat; dacă nu apare nicio picare, testul trece.
Un prim test care trece
testAdd apelează add(2, 3) și compară rezultatul cu 5 într-un singur assertSame. Valorile coincid, așa că nimic nu pică și rularea se încheie cu OK (1 test, 1 assertion).
Ieșire: script PHP
<?php
use PHPUnit\Framework\TestCase;
function add(int $a, int $b): int {
return $a + $b;
}
final class AddTest extends TestCase {
public function testAdd(): void {
$this->assertSame(5, add(2, 3));
}
}
Un test care pică
Acest add are o eroare — înmulțește. Testul o prinde: PHPUnit numește testul AddTest::testAdd, spune motivul — Failed asserting that 6 is identical to 5. — împreună cu fișierul și linia aserțiunii picate, iar rularea se încheie cu FAILURES!
Ieșire: script PHP
<?php
use PHPUnit\Framework\TestCase;
// add are o eroare: înmulțește în loc să adune.
function add(int $a, int $b): int {
return $a * $b;
}
final class AddTest extends TestCase {
public function testAdd(): void {
$this->assertSame(5, add(2, 3));
}
}
Rularea testelor
./vendor/bin/phpunit AddTest.php rulează fiecare test din fișier; apelat fără un nume de fișier, PHPUnit rulează întreaga suită de teste a proiectului. Ieșirea implicită este scurtă: un punct pentru fiecare test trecut, un F pentru fiecare picare și o linie de sumar.
Adaugă --testdox pentru a lista fiecare test cu numele său, fiecare pe propria linie, cu o bifă, sub numele clasei. Folosește-l pentru a vedea ce s-a rulat efectiv.
Două teste, listate cu numele lor
Fișierul are două metode de test, una pentru fiecare funcție testată. Cu --testdox, fiecare apare pe propria linie sub numele clasei Calc — se vede că ambele s-au rulat și ambele au trecut, iar sumarul spune OK (2 tests, 2 assertions).
Ieșire: script PHP
<?php
use PHPUnit\Framework\TestCase;
function double(int $n): int {
return $n * 2;
}
function half(int $n): int {
return intdiv($n, 2);
}
final class CalcTest extends TestCase {
public function testDouble(): void {
$this->assertSame(8, double(4));
}
public function testHalf(): void {
$this->assertSame(4, half(8));
}
}