# A PHP-kód tesztelése: PHPUnit és Pest

> PHPUnit és Pest érthetően: verziók, első tesztek, ésszerű tesztfajták, és hogy a tesztek miért teszik biztonságosabbá a PHP2Shell utáni frissítéseket.

Forrás: https://phpsos.de/hu/php/php-testen/  
Állapot: 2026. 10. 25.  
Szolgáltató: PHP SOS, PHP-vészhelyzeti segítség és szerverbiztonság. Azonnali segítség WhatsAppon: https://wa.me/491736494914?text=%C3%9Cdv%C3%B6zl%C3%B6m%2C%20PHP%20SOS%21%20Seg%C3%ADts%C3%A9gre%20van%20sz%C3%BCks%C3%A9g%C3%BCnk%20a%20PHP-szerver%C3%BCnkkel.%20C%C3%A9g%3A%20%E2%80%A6%20Weboldal%3A%20%E2%80%A6

**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](https://phpsos.de/hu/php/composer/) 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
<?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:

```bash
composer remove phpunit/phpunit
composer require pestphp/pest --dev --with-all-dependencies
./vendor/bin/pest --init
```

Ugyanaz a teszt Pest-írásmódban:

```php
<?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](https://phpsos.de/hu/php/statische-analyse/) 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](https://phpsos.de/hu/ratgeber/php-end-of-life-risiken/) 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](https://phpsos.de/hu/leistungen/php-migration-legacy/) é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

- [PHPUnit](https://phpunit.de/)
- [Pest](https://pestphp.com/)
- [php.net: Támogatott PHP-verziók](https://www.php.net/supported-versions.php)
