Lühidalt: PHPUnit on standardvahend PHP koodi automaatseks testimiseks; Pest on sellele ehituv raamistik lühema kirjaviisiga. Praegu on aktuaalne PHPUnit 13 (veebruarist 2026, alates PHP 8.4), Pest on versioonis 5. Automaatsed testid ei sulge PHP enda turvauke, kuid teevad uuendused planeeritavaks: pärast PHP2Shelli ja enne PHP 8.2 toe lõppu 31.12.2026 on see otsustav eelis.
Miks PHP koodi testida?
Juhatuse jaoks saab kasu ühte lausesse mahutada: testid teevad muudatused odavamaks ja turvalisemaks. Automaatne test kontrollib sekunditega, kas funktsioon teeb ikka seda, mida ta peab, näiteks kas ostukorv arvutab õigesti või sisselogimine lükkab valed paroolid tagasi. Ilma testideta kontrollib seda inimene käsitsi või mitte keegi.
Eriti selgelt ilmneb vahe uuenduste puhul. Kui PHP-d tuleb kriitilise turvaaugu tõttu lühikese ajaga uuendada, kõhklevad paljud haldajad, sest kardavad vigu poes või klienditeeninduse portaalis. Testikomplekti korral töötab uuendus kõigepealt testkeskkonnas, testid näitavad probleemid ja alles seejärel minnakse live'i.
PHPUnit: PHP testide standard
PHPUnit ilmub igal aastal veebruaris uue põhiversioonina. Iga versioon eeldab PHP miinimumversiooni ja saab ligikaudu kaks aastat veaparandusi. phpunit.de järgi kehtib:
| PHPUnit | Ilmunud | PHP eeldus | Veaparandused kuni |
|---|---|---|---|
| 13 | 06.02.2026 | alates PHP 8.4 | 04.02.2028 |
| 12 | 07.02.2025 | alates PHP 8.3 | 05.02.2027 |
| 11 | 02.02.2024 | alates PHP 8.2 | 06.02.2026 |
| 10 | 03.02.2023 | alates PHP 8.1 | 07.02.2025 |
Tabel näitab praktilist seost: projekt, mis kasutab veel PHPUnit 10, töötab enamasti ka veel vanal PHP versioonil. Testivahendid ja PHP versioon tuleks tõsta koos. PHPUnit paigaldatakse tavaliselt Composeri kaudu arendussõltuvusena.
Esimene test PHPUnit'iga
Test on klass, mis pärib klassist PHPUnit\Framework\TestCase. Testimeetodid on avalikud ja algavad sõnaga test, alternatiivina märgitakse need atribuudiga #[Test]. Näide kontrollib lihtsat hinnaarvutuse funktsiooni:
<?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 annab sama testi jaoks mitu juhtumit. PHPUnit dokumentatsiooni järgi peab see olema avalik ja staatiline. Arvutatakse sentides täisarvuna, et ujukomaarvud ei tekitaks ümardamisvigu. Komplekt käivitatakse käsuga ./vendor/bin/phpunit, kui PHPUnit on paigaldatud Composeri kaudu.
Pest: sama alus, lühem kirjaviis
Pest on dokumentatsiooni järgi ehitatud PHPUnit'i peale. Teste kirjutatakse funktsioonidena it() või test() ja ootusi expect()-iga. Pest 5 eeldab PHP 8.4. Paigaldus dokumentatsiooni järgi:
composer remove phpunit/phpunit
composer require pestphp/pest --dev --with-all-dependencies
./vendor/bin/pest --init
Sama test Pesti kirjaviisis:
<?php
it('berechnet den Bruttopreis zum Normalsatz', function () {
expect(bruttopreis(10000, 19))->toBe(11900);
});
Olemasolevad PHPUnit testid muudab plugin pestphp/pest-plugin-drift enamasti automaatselt ümber. Millist kirjaviisi tiim valib, on maitse küsimus; otsustav on, et testid korrapäraselt jookseksid.
Millised testiliigid on mõistlikud
- Ühiktestid: kontrollivad üksikuid funktsioone ja klasse ilma andmebaasi või võrguta.
- Integratsioonitestid: kontrollivad koostööd andmebaasi, failisüsteemi või liidestega.
- Funktsioonitestid HTTP kaudu: kutsuvad välja lehti ja vorme nii, nagu seda teeb brauser.
- Turvalisuse regressioonitestid: fikseerivad parandatud vead, näiteks et väljundid maskeeritakse funktsiooniga
htmlspecialchars()või sisselogimine ebaõnnestub vale parooli korral. - Smoke-testid pärast väljaveeretamist: vähesed kiired kontrollid, kas live-leht vastab pärast uuendust.
Testide täienduseks leiab staatiline analüüs PHPStani ja Psalmiga vigu koodi käivitamata.
Testid turvavõrguna uuenduste ja PHP2Shelli puhul
PHP2Shell näitas, kui lühike võib olla aeg avaldamise ja tegutsemissurve vahel: teadaanne 20.10.2026, paigad 21.10.2026, BSI hoiatustase oranž. Kellel oli testikomplekt, sai PHP 8.4.27 või 8.3.36 testkeskkonnas paigaldada, lasta teste jooksma ja samal päeval live'i minna. Ilma testideta jäi sageli valik kontrollimata uuenduse ja lahtise turvaaugu vahel.
Veelgi suurem on kasu põhiversiooni vahetamisel. PHP 8.1 ja vanema jaoks ametlikke uuendusi enam ei ole ning PHP 8.2 lõpeb 31.12.2026, nagu selgitab leht PHP End of Life. Testijooks sihtversiooni vastu näitab varakult, millised iganenud funktsioonid tuleb asendada. Mõistlik on CI-torujuhe, mis käivitab teste mitme PHP versiooni vastu, lisaks pilk release candidate'idele nagu PHP 8.6.0, kuid mitte kunagi tootmises.
Kirjutage iga teie rakenduses parandatud turvavea kohta test. Nii tagate, et sama viga hilisema muudatuse korral tagasi ei tule.
Kuidas PHP SOS konkreetselt aitab?
PHP 8.1 ja vanemate migratsiooni ning käimasolevate uuenduste puhul toetame nii:
- Olemasoleva hindamine: Millised testid on olemas, millised PHP ja PHPUnit versioonid töötavad, kus puuduvad kriitiliste protsesside testid?
- Miinimumkatte loomine: Koos teie arendustiimi või agentuuriga kindlustame sisselogimise, vormid ja tellimisteed testidega.
- Uuenduste testimine: Uued PHP versioonid jooksevad esmalt testkeskkonnas komplekti vastu.
- Tulemuse dokumenteerimine: Saate testitulemused ja versiooniseisud tõendina paika- või migratsioonisammu kohta.
Korduma kippuvad küsimused
Millist PHPUnit versiooni ma vajan?
See sõltub teie PHP versioonist. PHPUnit 13 eeldab PHP 8.4, PHPUnit 12 PHP 8.3 ja PHPUnit 11 PHP 8.2. Ajakohane tabel on phpunit.de lehel toetatud versioonide all.
Kas Pest on PHPUnit'i asendaja?
Pest on oma dokumentatsiooni järgi ehitatud PHPUnit'i peale ja pakub lühemat kirjaviisi. Olemasolevad PHPUnit testid saab Drift-pluginaga enamasti automaatselt ümber muuta, mõned tuleb käsitsi kohandada.
Kas testid aitavad PHP enda turvaaukude vastu?
Mitte otse. Turvaaugud nagu PHP2Shell asuvad interpretaatoris ja suletakse PHP uuendusega. Testid tagavad siiski, et saate selle uuenduse kiiresti paigaldada, kartmata rakenduses märkamatuid vigu.
Kui palju teste on piisavalt?
Kindlat arvu ei ole. Mõistlik on katta kõigepealt ärikriitilised teed: sisselogimine, tellimine, vormid, liidesed. Seejärel kasvab testikate iga muudatuse ja iga parandatud veaga.