Ukratko: PHPUnit je standardni alat za automatsko testiranje PHP koda; Pest je framework koji se na njega nadovezuje, s kraćim zapisom. Aktualan je PHPUnit 13 (od veljače 2026., od PHP-a 8.4), a Pest je u verziji 5. Automatski testovi ne zatvaraju sigurnosne ranjivosti u samom PHP-u, ali ažuriranja čine predvidljivima: nakon PHP2Shella i prije kraja podrške za PHP 8.2 31. 12. 2026. to je odlučujuća prednost.
Zašto testirati PHP kod?
Za upravu se korist može sažeti u jednoj rečenici: testovi promjene čine jeftinijima i sigurnijima. Automatski test u nekoliko sekundi provjerava radi li funkcija još ono što treba, primjerice računa li košarica ispravno ili prijava odbija pogrešne lozinke. Bez testova to ručno provjerava čovjek, ili nitko.
Razlika je osobito vidljiva pri ažuriranjima. Kad se PHP zbog kritične ranjivosti mora žurno ažurirati, mnogi operateri oklijevaju jer se boje pogrešaka u shopu ili korisničkom portalu. S testnim paketom ažuriranje najprije prolazi u testnom okruženju, testovi pokazuju probleme, a zatim se ide uživo.
PHPUnit: standard za PHP testove
PHPUnit svake godine u veljači izlazi u novoj glavnoj verziji. Svaka verzija zahtijeva najmanju verziju PHP-a i dobiva otprilike dvije godine ispravaka pogrešaka. Prema phpunit.de vrijedi:
| PHPUnit | Izašao | Zahtjev za PHP | Ispravci pogrešaka do |
|---|---|---|---|
| 13 | 6. 2. 2026. | od PHP-a 8.4 | 4. 2. 2028. |
| 12 | 7. 2. 2025. | od PHP-a 8.3 | 5. 2. 2027. |
| 11 | 2. 2. 2024. | od PHP-a 8.2 | 6. 2. 2026. |
| 10 | 3. 2. 2023. | od PHP-a 8.1 | 7. 2. 2025. |
Tablica pokazuje praktičnu vezu: projekt koji još koristi PHPUnit 10 uglavnom radi i na staroj verziji PHP-a. Alate za testiranje i verziju PHP-a treba podizati zajedno. PHPUnit se obično instalira putem Composera kao razvojna ovisnost.
Prvi test s PHPUnitom
Test je klasa koja nasljeđuje PHPUnit\Framework\TestCase. Metode testa su javne i počinju s test, a alternativno se označavaju atributom #[Test]. Primjer provjerava jednostavnu funkciju za izračun cijene:
<?php declare(strict_types=1);
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
final class BruttopreisTest extends TestCase
{
public static function preise(): array
{
return [
'Normalsatz' => [10000, 19, 11900],
'Ermäßigt' => [10000, 7, 10700],
'Null bleibt Null' => [0, 19, 0],
];
}
#[DataProvider('preise')]
public function testBruttopreisInCent(int $netto, int $satz, int $erwartet): void
{
$this->assertSame($erwartet, bruttopreis($netto, $satz));
}
}
Data provider isporučuje više slučajeva za isti test. Prema dokumentaciji PHPUnita mora biti javan i statičan. Računa se u centima kao cijeli broj kako ne bi nastale pogreške zaokruživanja zbog decimalnih brojeva. Paket se izvršava s ./vendor/bin/phpunit, ako je PHPUnit instaliran putem Composera.
Pest: ista osnova, kraći zapis
Pest je prema dokumentaciji izgrađen na PHPUnitu. Testovi se pišu kao funkcije s it() ili test(), a očekivanja s expect(). Pest 5 zahtijeva PHP 8.4. Instalacija prema dokumentaciji:
composer remove phpunit/phpunit
composer require pestphp/pest --dev --with-all-dependencies
./vendor/bin/pest --init
Isti test u Pestovu zapisu:
<?php
it('berechnet den Bruttopreis zum Normalsatz', function () {
expect(bruttopreis(10000, 19))->toBe(11900);
});
Postojeće PHPUnit testove dodatak pestphp/pest-plugin-drift većinom pretvara automatski. Koji će zapis tim odabrati stvar je ukusa; odlučujuće je da se testovi redovito izvode.
Koje su vrste testova smislene
- Jedinični testovi: provjeravaju pojedinačne funkcije i klase bez baze podataka ili mreže.
- Integracijski testovi: provjeravaju suradnju s bazom podataka, datotečnim sustavom ili sučeljima.
- Funkcionalni testovi putem HTTP-a: pozivaju stranice i obrasce kao što to čini preglednik.
- Sigurnosni regresijski testovi: bilježe otklonjene pogreške, primjerice da se izlazi maskiraju s
htmlspecialchars()ili da prijava ne uspije nakon pogrešne lozinke. - Smoke testovi nakon deploymenta: nekoliko brzih provjera odgovara li živa stranica nakon ažuriranja.
Uz testove, statička analiza s PHPStanom i Psalmom pronalazi pogreške bez izvršavanja koda.
Testovi kao sigurnosna mreža za ažuriranja i PHP2Shell
PHP2Shell je pokazao koliko može biti kratko vrijeme između objave i pritiska na djelovanje: najava 20. 10. 2026., zakrpe 21. 10. 2026., BSI (njemački Savezni ured za informacijsku sigurnost) upozorenje razine narančasto. Tko je imao testni paket, mogao je PHP 8.4.27 ili 8.3.36 instalirati u testnom okruženju, pokrenuti testove i istog dana ići uživo. Bez testova često je ostajao izbor između neprovjerenog ažuriranja i otvorene ranjivosti.
Korist je još veća pri promjeni glavne verzije. Za PHP 8.1 i starije više nema službenih ažuriranja, a PHP 8.2 završava 31. 12. 2026., kao što objašnjava stranica PHP End-of-Life. Pokretanje testova prema ciljnoj verziji rano pokazuje koje zastarjele funkcije treba zamijeniti. Smislen je CI pipeline koji pokreće testove prema više verzija PHP-a, uz pogled na release candidate verzije poput PHP-a 8.6.0, ali nikad u produkciji.
Za svaku otklonjenu sigurnosnu pogrešku u svojoj aplikaciji napišite test. Tako osiguravate da se ista pogreška ne vrati pri kasnijoj promjeni.
Kako PHP SOS konkretno pomaže?
Pri migraciji s PHP-a 8.1 i starijeg te pri tekućim ažuriranjima podupiremo Vas ovako:
- Procijeniti postojeće stanje: Koji testovi postoje, koje verzije PHP-a i PHPUnita rade, gdje nedostaju testovi za kritične tijekove?
- Ostvariti minimalnu pokrivenost: Zajedno s Vašim razvojnim timom ili agencijom osiguravamo prijavu, obrasce i putove narudžbe testovima.
- Testirati ažuriranja: Nove verzije PHP-a najprije prolaze u testnom okruženju prema paketu testova.
- Dokumentirati rezultat: Dobivate rezultate testova i stanja verzija kao dokaz za korak zakrpe ili migracije.
Česta pitanja
Koja mi je verzija PHPUnita potrebna?
To ovisi o Vašoj verziji PHP-a. PHPUnit 13 zahtijeva PHP 8.4, PHPUnit 12 PHP 8.3, a PHPUnit 11 PHP 8.2. Aktualna tablica nalazi se na phpunit.de pod podržanim verzijama.
Je li Pest zamjena za PHPUnit?
Pest je prema vlastitoj dokumentaciji izgrađen na PHPUnitu i nudi kraći zapis. Postojeći PHPUnit testovi mogu se pomoću dodatka Drift većinom automatski pretvoriti, a neke treba prilagoditi ručno.
Pomažu li testovi protiv sigurnosnih ranjivosti u samom PHP-u?
Ne izravno. Ranjivosti poput PHP2Shella nalaze se u interpreteru i zatvaraju se PHP ažuriranjem. Testovi ipak omogućuju da to ažuriranje brzo instalirate, bez straha od neprimijećenih pogrešaka u aplikaciji.
Koliko je testova dovoljno?
Čvrstog broja nema. Smisleno je najprije pokriti poslovno kritične putove: prijavu, narudžbu, obrasce, sučelja. Zatim pokrivenost testovima raste sa svakom promjenom i svakom otklonjenom pogreškom.