Aktuálna situácia: PHP2Shell. Dve kritické zraniteľnosti PHP (CVSS 9.2) umožňujú spustenie škodlivého kódu bez prihlásenia. Záplaty od 21. 10. 2026.Čo treba urobiť teraz →

Testovanie kódu PHP: PHPUnit a Pest

PHPUnit je štandardný testovací nástroj pre PHP, Pest na ňom stavia. Kto má testy, môže bezpečnostné aktualizácie a zmeny verzií nasadzovať rýchlejšie a s menším rizikom.

Stav 4 min čítaniaZnalosti o PHP

Stručne: PHPUnit je štandardný nástroj na automatické testovanie kódu PHP; Pest je framework, ktorý na ňom stavia, s kratším zápisom. Aktuálny je PHPUnit 13 (od februára 2026, od PHP 8.4), Pest je vo verzii 5. Automatické testy neuzatvárajú bezpečnostné zraniteľnosti v samotnom PHP, ale robia aktualizácie plánovateľnými: po PHP2Shell a pred koncom podpory PHP 8.2 dňa 31. 12. 2026 je to rozhodujúca výhoda.

Prečo testovať kód PHP?

Pre vedenie firmy sa prínos dá zhrnúť jednou vetou: testy robia zmeny lacnejšími a bezpečnejšími. Automatický test za pár sekúnd overí, či funkcia stále robí to, čo má, napríklad či košík správne počíta alebo či prihlásenie odmieta nesprávne heslá. Bez testov to kontroluje človek ručne, alebo nikto.

Rozdiel je obzvlášť zjavný pri aktualizáciách. Ak sa musí PHP kvôli kritickej zraniteľnosti aktualizovať v krátkom čase, mnohí prevádzkovatelia váhajú, pretože sa boja chýb v obchode alebo zákazníckom portáli. S testovacou sadou prebehne aktualizácia najprv v testovacom prostredí, testy ukážu problémy a potom sa ide naostro.

PHPUnit: štandard pre testy PHP

PHPUnit vychádza každý rok vo februári v novej hlavnej verzii. Každá verzia vyžaduje minimálnu verziu PHP a dostáva približne dva roky opráv chýb. Podľa phpunit.de platí:

PHPUnit Vydaný Požiadavka na PHP Opravy chýb do
13 6. 2. 2026 od PHP 8.4 4. 2. 2028
12 7. 2. 2025 od PHP 8.3 5. 2. 2027
11 2. 2. 2024 od PHP 8.2 6. 2. 2026
10 3. 2. 2023 od PHP 8.1 7. 2. 2025

Tabuľka ukazuje praktickú súvislosť: projekt, ktorý ešte používa PHPUnit 10, zvyčajne beží aj na starej verzii PHP. Testovacie nástroje a verzia PHP by sa mali zvyšovať spoločne. PHPUnit sa zvyčajne inštaluje cez Composer ako vývojová závislosť.

Prvý test s PHPUnit

Test je trieda, ktorá dedí od PHPUnit\Framework\TestCase. Testovacie metódy sú verejné a začínajú na test, alternatívne sa označujú atribútom #[Test]. Príklad overuje jednoduchú funkciu na výpočet ceny:

<?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 dodáva pre ten istý test viac prípadov. Podľa dokumentácie PHPUnit musí byť verejný a statický. Počíta sa v centoch ako celé číslo, aby nevznikali zaokrúhľovacie chyby pri desatinných číslach. Sada sa spúšťa pomocou ./vendor/bin/phpunit, ak je PHPUnit nainštalovaný cez Composer.

Pest: rovnaký základ, kratší zápis

Pest je podľa dokumentácie postavený na PHPUnit. Testy sa píšu ako funkcie s it() alebo test() a očakávania pomocou expect(). Pest 5 vyžaduje PHP 8.4. Inštalácia podľa dokumentácie:

composer remove phpunit/phpunit
composer require pestphp/pest --dev --with-all-dependencies
./vendor/bin/pest --init

Ten istý test v zápise Pest:

<?php
it('berechnet den Bruttopreis zum Normalsatz', function () {
    expect(bruttopreis(10000, 19))->toBe(11900);
});

Existujúce testy PHPUnit plugin pestphp/pest-plugin-drift z veľkej časti automaticky prevedie. Ktorý zápis tím zvolí, je vec vkusu; rozhodujúce je, aby testy pravidelne bežali.

Ktoré druhy testov dávajú zmysel

  1. Unit testy: overujú jednotlivé funkcie a triedy bez databázy alebo siete.
  2. Integračné testy: overujú súčinnosť s databázou, súborovým systémom alebo rozhraniami.
  3. Funkčné testy cez HTTP: volajú stránky a formuláre tak, ako to robí prehliadač.
  4. Bezpečnostné regresné testy: zachytávajú opravené chyby, napríklad že výstupy sú maskované pomocou htmlspecialchars() alebo že prihlásenie po nesprávnom hesle zlyhá.
  5. Smoke testy po nasadení: niekoľko rýchlych kontrol, či živý web po aktualizácii odpovedá.

Ako doplnok k testom nachádza statická analýza s PHPStan a Psalm chyby bez spustenia kódu.

Testy ako záchranná sieť pre aktualizácie a PHP2Shell

PHP2Shell ukázal, aký krátky môže byť čas medzi zverejnením a tlakom konať: oznámenie 20. 10. 2026, záplaty 21. 10. 2026, výstražný stupeň Oranžová od BSI (nemecký Spolkový úrad pre informačnú bezpečnosť). Kto mal testovaciu sadu, mohol PHP 8.4.27 alebo 8.3.36 nasadiť v testovacom prostredí, spustiť testy a v ten istý deň ísť naostro. Bez testov často zostala len voľba medzi neoverenou aktualizáciou a otvorenou zraniteľnosťou.

Ešte väčší je prínos pri zmene hlavnej verzie. Pre PHP 8.1 a staršie už neexistujú oficiálne aktualizácie a PHP 8.2 končí 31. 12. 2026, ako vysvetľuje stránka PHP End-of-Life. Testovací beh proti cieľovej verzii včas ukáže, ktoré zastarané funkcie treba nahradiť. Zmysluplná je pipeline CI, ktorá spúšťa testy proti viacerým verziám PHP, k tomu pohľad na release candidates ako PHP 8.6.0, no nikdy v produkcii.

Tip

Ku každej opravenej bezpečnostnej chybe vo svojej aplikácii napíšte test. Tak zabezpečíte, že sa tá istá chyba pri neskoršej zmene nevráti.

Ako PHP SOS konkrétne pomáha?

Pri migrácii z PHP 8.1 a staršieho a pri priebežných aktualizáciách podporujeme takto:

  • Zhodnotenie stavu: Aké testy existujú, aká verzia PHP a PHPUnit beží, kde chýbajú testy pre kritické procesy?
  • Vytvorenie minimálneho pokrytia: Spolu s vaším vývojovým tímom alebo agentúrou zabezpečujeme prihlásenie, formuláre a objednávkové cesty testami.
  • Testovanie aktualizácií: Nové verzie PHP bežia najprv v testovacom prostredí proti sade testov.
  • Zdokumentovanie výsledku: Výsledky testov a stavy verzií dostanete ako doklad pre krok záplatovania alebo migrácie.

Časté otázky

Akú verziu PHPUnit potrebujem?

Závisí to od vašej verzie PHP. PHPUnit 13 vyžaduje PHP 8.4, PHPUnit 12 PHP 8.3 a PHPUnit 11 PHP 8.2. Aktuálna tabuľka je na phpunit.de v časti podporovaných verzií.

Je Pest náhradou za PHPUnit?

Pest je podľa vlastnej dokumentácie postavený na PHPUnit a ponúka kratší zápis. Existujúce testy PHPUnit sa dajú pomocou pluginu Drift z veľkej časti automaticky previesť, niektoré treba upraviť ručne.

Pomáhajú testy proti bezpečnostným zraniteľnostiam v samotnom PHP?

Nie priamo. Zraniteľnosti ako PHP2Shell sídlia v interpreteri a uzavrú sa aktualizáciou PHP. Testy však zabezpečia, že túto aktualizáciu môžete nasadiť rýchlo, bez obáv z nepovšimnutých chýb v aplikácii.

Koľko testov je dosť?

Pevný počet neexistuje. Zmysluplné je pokryť najprv obchodne kritické cesty: prihlásenie, objednávku, formuláre, rozhrania. Potom pokrytie testmi rastie s každou zmenou a každou opravenou chybou.

Zdroje

Okamžitý kontakt

Každá hodina sa počíta. Napíšte nám hneď.

Stručne opíšte systém, verziu PHP a svoje pozorovanie. Ozveme sa, vyjasníme situáciu a budeme pracovať na diaľku, kým nebude incident uzavretý a zdokumentovaný.

Okamžitá pomoc