Un test, multe cazuri
Majoritatea funcțiilor au nevoie de aceeași verificare pentru multe intrări: valori normale, valori negative, zero, cazuri limită. Copierea testului de cinci ori înseamnă cinci locuri de întreținut.
Modul PHPUnit este un furnizor de date (data provider): pui cazurile într-un singur tabel — fiecare rând conține un nume, intrările și rezultatul așteptat — și lași executorul să apeleze o singură metodă de test câte o dată pentru fiecare rând.
Adăugarea unui caz nou devine un rând nou în tabel. Acesta este cel mai frecvent model de test pe care îl vei vedea în codul PHPUnit real.
Furnizorul de date
Furnizorul este o metodă public static care returnează tabelul: un tablou de rânduri, indexate după numele cazului. Metoda de test primește valorile unui rând ca parametri și este legată de furnizor prin atributul #[DataProvider('addCases')] (importat din PHPUnit\Framework\Attributes).
PHPUnit apelează metoda o dată pentru fiecare rând, iar fiecare rând contează ca test propriu — un rând defect eșuează singur, așa că apar toate cazurile defecte, nu doar primul.
Patru cazuri într-un singur tabel
Patru rânduri, o singură metodă de test, o singură aserțiune. Toate trec — sumarul spune OK (4 tests, 4 assertions). Pentru a testa o a cincea situație ai adăuga un rând în tabel — metoda rămâne neatinsă.
Ieșire: script PHP
<?php
use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\Attributes\DataProvider;
function add(int $a, int $b): int {
return $a + $b;
}
final class AddTest extends TestCase {
public static function addCases(): array {
return [
"one plus one" => [1, 1, 2],
"positive and negative" => [5, -3, 2],
"both negative" => [-2, -4, -6],
"zeros" => [0, 0, 0],
];
}
#[DataProvider('addCases')]
public function testAdd(int $a, int $b, int $want): void {
$this->assertSame($want, add($a, $b));
}
}
Cazuri cu nume folosind --testdox
--testdox arată ce au făcut rândurile: fiecare caz apare cu numele setului său de date, ca Add with data set "both negative".
Fiecare rând trece sau eșuează pe cont propriu, ceea ce face ca un caz defect să fie ușor de observat într-un tabel lung.
Fiecare caz primește un nume
Același tabel, rulat cu --testdox. Ieșirea listează acum toate cele patru cazuri separat — vezi exact care cazuri au rulat și au trecut.
Ieșire: script PHP
<?php
use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\Attributes\DataProvider;
function add(int $a, int $b): int {
return $a + $b;
}
final class AddTest extends TestCase {
public static function addCases(): array {
return [
"one plus one" => [1, 1, 2],
"positive and negative" => [5, -3, 2],
"both negative" => [-2, -4, -6],
"zeros" => [0, 0, 0],
];
}
#[DataProvider('addCases')]
public function testAdd(int $a, int $b, int $want): void {
$this->assertSame($want, add($a, $b));
}
}
Rularea unui singur caz
Cazurile pot fi selectate din linia de comandă cu --filter, folosind numele setului de date între ghilimele:
./vendor/bin/phpunit --testdox --filter '"both negative"' AddTest.php
Rulează doar cazul care se potrivește. Acest lucru este perfect când repari un caz defect: rulezi din nou doar acel caz până devine verde, apoi rulezi din nou totul.
Filtrarea unui singur set de date
Același fișier ca mai sus, rulat cu --filter '"both negative"'. Se execută doar unul dintre cele patru cazuri — celelalte nici nu sunt pornite: sumarul spune OK (1 test, 1 assertion).
Ieșire: script PHP
<?php
use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\Attributes\DataProvider;
function add(int $a, int $b): int {
return $a + $b;
}
final class AddTest extends TestCase {
public static function addCases(): array {
return [
"one plus one" => [1, 1, 2],
"positive and negative" => [5, -3, 2],
"both negative" => [-2, -4, -6],
"zeros" => [0, 0, 0],
];
}
#[DataProvider('addCases')]
public function testAdd(int $a, int $b, int $want): void {
$this->assertSame($want, add($a, $b));
}
}