Aktuális helyzet: PHP2Shell. Két kritikus PHP-rés (CVSS 9,2) lehetővé teszi kártékony kód futtatását bejelentkezés nélkül. Javítások 2026. 10. 21. óta.Mi a teendő most →

A PHP-kód tesztelése: PHPUnit és Pest

A PHPUnit a PHP szokásos tesztelőeszköze, a Pest erre épül. Akinek vannak tesztjei, a biztonsági frissítéseket és a verzióváltásokat gyorsabban és kisebb kockázattal telepítheti.

Állapot 5 perc olvasási időPHP-tudástár

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

  1. Egységtesztek: egyes függvényeket és osztályokat ellenőriznek adatbázis vagy hálózat nélkül.
  2. Integrációs tesztek: az adatbázissal, a fájlrendszerrel vagy az interfészekkel való együttműködést ellenőrzik.
  3. HTTP-n keresztüli funkciótesztek: oldalakat és űrlapokat hívnak meg, ahogyan egy böngésző teszi.
  4. 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.
  5. 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.

Tipp

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ő.

Források

Azonnali kapcsolat

Minden óra számít. Írjon nekünk most.

Ismertesse röviden a rendszert, a PHP-verziót és a megfigyelését. Jelentkezünk, tisztázzuk a helyzetet, és távolról dolgozunk, amíg az incidens le nem zárul és dokumentálva nem lesz.

Azonnali segítség