Röviden: A PHPUnit a szokásos eszköz a PHP-kód automatikus teszteléséhez; a Pest egy erre épülő keretrendszer rövidebb írásmóddal. Jelenleg a PHPUnit 13 az aktuális (2026 februárja óta, a PHP 8.4-től), a Pest az 5-ös verziónál tart. Az automatikus tesztek nem zárják be a PHP-ban magában lévő biztonsági réseket, de tervezhetővé teszik a frissítéseket: a PHP2Shell után és a PHP 8.2 támogatásának 2026. december 31-i vége előtt ez a döntő előny.
Miért kell tesztelni a PHP-kódot?
Az ügyvezetés számára a haszon egy mondatban összefogható: a tesztek olcsóbbá és biztonságosabbá teszik a módosításokat. Egy automatikus teszt másodpercek alatt ellenőrzi, hogy egy függvény még azt teszi-e, amit kell, például helyesen számol-e a kosár, vagy elutasítja-e a bejelentkezés a hibás jelszavakat. Tesztek nélkül ezt ember ellenőrzi kézzel, vagy senki.
A különbség a frissítéseknél válik különösen világossá. Ha a PHP-t egy kritikus rés miatt rövid határidővel frissíteni kell, sok üzemeltető habozik, mert hibáktól tart a webshopban vagy az ügyfélportálban. Tesztkészlettel a frissítés először egy tesztkörnyezetben fut le, a tesztek megmutatják a problémákat, és utána jöhet az éles üzem.
PHPUnit: a PHP-tesztek szabványa
A PHPUnit minden évben februárban jelenik meg új főverzióval. Minden verzió a PHP egy minimális verzióját feltételezi, és nagyjából két évig kap hibajavításokat. A phpunit.de szerint:
| PHPUnit | Megjelent | PHP-előfeltétel | Hibajavítások eddig |
|---|---|---|---|
| 13 | 2026. 02. 06. | PHP 8.4-től | 2028. 02. 04. |
| 12 | 2025. 02. 07. | PHP 8.3-tól | 2027. 02. 05. |
| 11 | 2024. 02. 02. | PHP 8.2-től | 2026. 02. 06. |
| 10 | 2023. 02. 03. | PHP 8.1-től | 2025. 02. 07. |
A táblázat gyakorlati összefüggést mutat: az a projekt, amely még a PHPUnit 10-et használja, többnyire még régi PHP-verzión is fut. A tesztelőeszközöket és a PHP-verziót együtt kell emelni. A PHPUnit telepítése általában a Composeren keresztül történik fejlesztési függőségként.
Egy első teszt a PHPUnittal
A teszt egy osztály, amely a PHPUnit\Framework\TestCase-ből származik. A tesztmetódusok nyilvánosak és test-tel kezdődnek, vagy a #[Test] attribútummal jelölik őket. A példa egy egyszerű árszámító függvényt ellenőriz:
<?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));
}
}
Az adatszolgáltató (data provider) több esetet ad ugyanahhoz a teszthez. A PHPUnit dokumentációja szerint nyilvánosnak és statikusnak kell lennie. Számolás centben, egész számként történik, hogy a lebegőpontos számok ne okozzanak kerekítési hibákat. A készletet a ./vendor/bin/phpunit paranccsal futtatják, ha a PHPUnitot Composeren át telepítették.
Pest: ugyanaz az alap, rövidebb írásmód
A Pest a dokumentáció szerint a PHPUnitra épül. A teszteket it() vagy test() függvényként, az elvárásokat expect()-tel írják. A Pest 5 a PHP 8.4-et feltételezi. A telepítés a dokumentáció szerint:
composer remove phpunit/phpunit
composer require pestphp/pest --dev --with-all-dependencies
./vendor/bin/pest --init
Ugyanaz a teszt Pest-írásmódban:
<?php
it('berechnet den Bruttopreis zum Normalsatz', function () {
expect(bruttopreis(10000, 19))->toBe(11900);
});
A meglévő PHPUnit-teszteket a pestphp/pest-plugin-drift beépülő modul nagyrészt automatikusan alakítja át. Hogy egy csapat melyik írásmódot választja, ízlés kérdése; a döntő az, hogy a tesztek rendszeresen lefussanak.
Mely tesztfajták ésszerűek
- Egységtesztek: egyes függvényeket és osztályokat ellenőriznek adatbázis vagy hálózat nélkül.
- Integrációs tesztek: az adatbázissal, a fájlrendszerrel vagy az interfészekkel való együttműködést ellenőrzik.
- HTTP-n keresztüli funkciótesztek: oldalakat és űrlapokat hívnak meg, ahogyan egy böngésző teszi.
- Biztonsági regressziós tesztek: rögzítik a kijavított hibákat, például hogy a kimenetek maszkolva vannak a
htmlspecialchars()-szal, vagy hogy egy bejelentkezés hibás jelszó után meghiúsul. - Smoke-tesztek a telepítés után: néhány gyors ellenőrzés arról, hogy az éles oldal válaszol-e egy frissítés után.
A teszteket kiegészítve a statikus elemzés a PHPStannal és a Psalmmal a kód futtatása nélkül talál hibákat.
A tesztek mint biztonsági háló a frissítésekhez és a PHP2Shellhez
A PHP2Shell megmutatta, milyen rövid lehet az idő a közzététel és a cselekvési kényszer között: bejelentés 2026. október 20-án, javítások 2026. október 21-én, BSI (a német szövetségi információbiztonsági hivatal) narancs riasztási szintje. Aki rendelkezett tesztkészlettel, a PHP 8.4.27-et vagy 8.3.36-ot telepíthette egy tesztkörnyezetben, lefuttathatta a teszteket, és még aznap élesbe léphetett. Tesztek nélkül gyakran csak az maradt, hogy válasszon az ellenőrizetlen frissítés és a nyitott rés között.
Még nagyobb a haszon a főverzió váltásakor. A PHP 8.1-hez és a régebbiekhez már nincs hivatalos frissítés, a PHP 8.2 pedig 2026. december 31-én ér véget, ahogyan a PHP életciklus vége oldal magyarázza. A célverzió elleni tesztfutás korán megmutatja, mely elavult függvényeket kell kicserélni. Ésszerű egy CI-folyamat, amely a teszteket több PHP-verzió ellen futtatja, ehhez a Release Candidate-ek, például a PHP 8.6.0 figyelése, éles üzemben azonban soha.
Az alkalmazása minden kijavított biztonsági hibájához írjon tesztet. Így biztosítja, hogy ugyanaz a hiba egy későbbi módosításnál ne térjen vissza.
Hogyan segít konkrétan a PHP SOS?
A PHP 8.1 és régebbi verziók migrációjánál és a folyamatos frissítéseknél így támogatjuk:
- Az állomány értékelése: Milyen tesztek vannak, milyen PHP- és PHPUnit-verzió fut, hol hiányoznak tesztek a kritikus folyamatokhoz?
- Minimális lefedettség megteremtése: A fejlesztőcsapatával vagy az ügynökségével közösen teszttel biztosítjuk a bejelentkezést, az űrlapokat és a rendelési útvonalakat.
- A frissítések tesztelése: Az új PHP-verziók először egy tesztkörnyezetben futnak a készlet ellen.
- Az eredmény dokumentálása: A teszteredményeket és a verzióállapotokat bizonyítékként megkapja a javítási vagy migrációs lépéshez.
Gyakori kérdések
Melyik PHPUnit-verzióra van szükségem?
Ez a PHP-verziójától függ. A PHPUnit 13 a PHP 8.4-et, a PHPUnit 12 a PHP 8.3-at, a PHPUnit 11 a PHP 8.2-t feltételezi. Az aktuális táblázat a phpunit.de oldalon található a támogatott verziók alatt.
A Pest a PHPUnit helyettesítője?
A Pest saját dokumentációja szerint a PHPUnitra épül, és rövidebb írásmódot kínál. A meglévő PHPUnit-teszteket a Drift beépülő modullal nagyrészt automatikusan át lehet alakítani, néhányat kézzel kell kiigazítani.
Segítenek a tesztek a PHP-ban magában lévő biztonsági rések ellen?
Közvetlenül nem. Az olyan rések, mint a PHP2Shell, az értelmezőben vannak, és PHP-frissítéssel zárhatók be. A tesztek viszont gondoskodnak arról, hogy ezt a frissítést gyorsan telepíthesse, az alkalmazás észrevétlen hibáitól való félelem nélkül.
Hány teszt elég?
Nincs rögzített szám. Ésszerű először az üzletileg kritikus útvonalakat lefedni: bejelentkezés, rendelés, űrlapok, interfészek. Utána a tesztlefedettség minden módosítással és minden kijavított hibával nő.