Trenutno stanje: PHP2Shell. Dve kritični ranljivosti PHP (CVSS 9,2) omogočata izvedbo škodljive kode brez prijave. Popravki od 21. 10. 2026.Kaj je zdaj treba storiti →

Testiranje kode PHP: PHPUnit in Pest

PHPUnit je standardno orodje za testiranje PHP, Pest gradi na njem. Kdor ima teste, lahko varnostne posodobitve in menjave različic namesti hitreje in z manj tveganja.

Stanje 4 min branjaZnanje o PHP

Na kratko: PHPUnit je standardno orodje za samodejno testiranje kode PHP; Pest je ogrodje, ki gradi nanj, s krajšim zapisom. Aktualen je PHPUnit 13 (od februarja 2026, od PHP 8.4), Pest je v različici 5. Samodejni testi ne zapirajo varnostnih vrzeli v samem PHP, naredijo pa posodobitve predvidljive: po PHP2Shell in pred koncem podpore za PHP 8.2 dne 31. 12. 2026 je to odločilna prednost.

Zakaj testirati kodo PHP?

Za vodstvo je korist mogoče strniti v en stavek: testi spremembe naredijo cenejše in varnejše. Samodejni test v nekaj sekundah preveri, ali funkcija še dela, kar mora, na primer ali košarica pravilno računa ali prijava zavrne napačna gesla. Brez testov to ročno preveri človek ali pa nihče.

Razlika je še posebej očitna pri posodobitvah. Če je treba PHP zaradi kritične vrzeli hitro posodobiti, številni upravljavci okljevajo, ker se bojijo napak v trgovini ali portalu za stranke. S testnim naborom posodobitev najprej teče v testnem okolju, testi pokažejo težave, nato pa gre v živo.

PHPUnit: standard za teste PHP

PHPUnit vsako leto februarja izide v novi glavni različici. Vsaka različica zahteva najnižjo različico PHP in približno dve leti prejema popravke napak. Po phpunit.de velja:

PHPUnit Izšel Zahteva PHP Popravki napak 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

Tabela kaže praktično povezavo: projekt, ki še uporablja PHPUnit 10, običajno teče tudi še na stari različici PHP. Testna orodja in različico PHP je smiselno dvigniti skupaj. PHPUnit se običajno namesti prek Composerja kot razvojna odvisnost.

Prvi test s PHPUnit

Test je razred, ki podeduje od PHPUnit\Framework\TestCase. Testne metode so javne in se začnejo s test, druga možnost je, da jih označite z atributom #[Test]. Primer preverja preprosto funkcijo za izračun cene:

<?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 za isti test dobavi več primerov. Po dokumentaciji PHPUnit mora biti javen in statičen. Računa se v centih kot celo število, da zaradi števil s plavajočo vejico ne nastanejo napake zaokrožanja. Nabor se zažene z ./vendor/bin/phpunit, če je PHPUnit nameščen prek Composerja.

Pest: ista osnova, krajši zapis

Pest je po dokumentaciji zgrajen na PHPUnit. Testi se pišejo kot funkcije z it() ali test(), pričakovanja pa z expect(). Pest 5 zahteva PHP 8.4. Namestitev po dokumentaciji:

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

Isti test v zapisu Pest:

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

Obstoječe teste PHPUnit vtičnik pestphp/pest-plugin-drift večinoma samodejno pretvori. Kateri zapis ekipa izbere, je stvar okusa; odločilno je, da testi redno tečejo.

Katere vrste testov so smiselne

  1. Enotski testi: preverjajo posamezne funkcije in razrede brez podatkovne baze ali omrežja.
  2. Integracijski testi: preverjajo sodelovanje s podatkovno bazo, datotečnim sistemom ali vmesniki.
  3. Funkcijski testi prek HTTP: kličejo strani in obrazce, kot to počne brskalnik.
  4. Varnostni regresijski testi: zadržijo odpravljene napake, na primer da se izpisi maskirajo s htmlspecialchars() ali da prijava po napačnem geslu spodleti.
  5. Dimni testi (smoke) po namestitvi: nekaj hitrih preverjanj, ali živa stran po posodobitvi odgovarja.

Testom v dopolnilo statična analiza s PHPStan in Psalm najde napake, ne da bi kodo izvedla.

Testi kot varnostna mreža za posodobitve in PHP2Shell

PHP2Shell je pokazal, kako kratek je lahko čas med objavo in pritiskom k ukrepanju: napoved 20. 10. 2026, popravki 21. 10. 2026, opozorilna stopnja BSI oranžna. Kdor je imel testni nabor, je lahko PHP 8.4.27 ali 8.3.36 namestil v testnem okolju, pognal teste in šel isti dan v živo. Brez testov je pogosto ostala samo izbira med nepreverjeno posodobitvijo in odprto vrzeljo.

Korist je še večja pri menjavi glavne različice. Za PHP 8.1 in starejše ni več uradnih posodobitev, PHP 8.2 pa se konča 31. 12. 2026, kot razlaga stran PHP End-of-Life. Testni zagon proti ciljni različici zgodaj pokaže, katere zastarele funkcije je treba zamenjati. Smiselen je cevovod CI, ki teste poganja proti več različicam PHP, poleg tega pogled na release candidate, kot je PHP 8.6.0, vendar nikoli v produkciji.

Nasvet

Za vsako odpravljeno varnostno napako v svoji aplikaciji napišite test. Tako zagotovite, da se ista napaka ob poznejši spremembi ne vrne.

Kako PHP SOS pomaga konkretno?

Pri selitvi s PHP 8.1 in starejšega ter pri tekočih posodobitvah podpiramo takole:

  • Oceniti stanje: kateri testi obstajajo, katera različica PHP in PHPUnit teče, kje manjkajo testi za kritične poteke?
  • Vzpostaviti najnižjo pokritost: skupaj z vašo razvojno ekipo ali agencijo prijavo, obrazce in poti naročil zavarujemo s testi.
  • Preizkusiti posodobitve: nove različice PHP najprej tečejo v testnem okolju proti naboru.
  • Dokumentirati rezultat: rezultate testov in stanja različic prejmete kot dokazilo za korak popravka ali selitve.

Pogosta vprašanja

Katero različico PHPUnit potrebujem?

To je odvisno od vaše različice PHP. PHPUnit 13 zahteva PHP 8.4, PHPUnit 12 PHP 8.3 in PHPUnit 11 PHP 8.2. Aktualna tabela je na phpunit.de med podprtimi različicami.

Ali je Pest nadomestilo za PHPUnit?

Pest je po lastni dokumentaciji zgrajen na PHPUnit in ponuja krajši zapis. Obstoječe teste PHPUnit je mogoče z vtičnikom Drift večinoma samodejno pretvoriti, nekatere je treba prilagoditi ročno.

Ali testi pomagajo proti varnostnim vrzelim v samem PHP?

Ne neposredno. Vrzeli, kot je PHP2Shell, tičijo v interpreterju in jih zapre posodobitev PHP. Testi pa poskrbijo, da lahko to posodobitev hitro namestite, brez strahu pred neopaženimi napakami v aplikaciji.

Koliko testov je dovolj?

Fiksnega števila ni. Smiselno je najprej pokriti poslovno kritične poti: prijavo, naročilo, obrazce, vmesnike. Nato se pokritost s testi povečuje z vsako spremembo in vsako odpravljeno napako.

Viri

Takojšnji stik

Vsaka ura šteje. Pišite nam zdaj.

Na kratko opišite sistem, različico PHP in opažanje. Odzovemo se, razjasnimo stanje in delamo na daljavo, dokler incident ni zaključen in dokumentiran.

Takojšnja pomoč