Trenutno stanje: PHP2Shell. Dvije kritične PHP ranjivosti (CVSS 9.2) omogućuju zlonamjerni kod bez prijave. Zakrpe od 21. 10. 2026.Što sada učiniti →

Testiranje PHP koda: PHPUnit i Pest

PHPUnit je standardni alat za testiranje u PHP-u, a Pest se nadovezuje na njega. Tko ima testove, sigurnosna ažuriranja i promjene verzije može instalirati brže i s manje rizika.

Stanje 4 min čitanjaPHP znanje

Ukratko: PHPUnit je standardni alat za automatsko testiranje PHP koda; Pest je framework koji se na njega nadovezuje, s kraćim zapisom. Aktualan je PHPUnit 13 (od veljače 2026., od PHP-a 8.4), a Pest je u verziji 5. Automatski testovi ne zatvaraju sigurnosne ranjivosti u samom PHP-u, ali ažuriranja čine predvidljivima: nakon PHP2Shella i prije kraja podrške za PHP 8.2 31. 12. 2026. to je odlučujuća prednost.

Zašto testirati PHP kod?

Za upravu se korist može sažeti u jednoj rečenici: testovi promjene čine jeftinijima i sigurnijima. Automatski test u nekoliko sekundi provjerava radi li funkcija još ono što treba, primjerice računa li košarica ispravno ili prijava odbija pogrešne lozinke. Bez testova to ručno provjerava čovjek, ili nitko.

Razlika je osobito vidljiva pri ažuriranjima. Kad se PHP zbog kritične ranjivosti mora žurno ažurirati, mnogi operateri oklijevaju jer se boje pogrešaka u shopu ili korisničkom portalu. S testnim paketom ažuriranje najprije prolazi u testnom okruženju, testovi pokazuju probleme, a zatim se ide uživo.

PHPUnit: standard za PHP testove

PHPUnit svake godine u veljači izlazi u novoj glavnoj verziji. Svaka verzija zahtijeva najmanju verziju PHP-a i dobiva otprilike dvije godine ispravaka pogrešaka. Prema phpunit.de vrijedi:

PHPUnit Izašao Zahtjev za PHP Ispravci pogrešaka do
13 6. 2. 2026. od PHP-a 8.4 4. 2. 2028.
12 7. 2. 2025. od PHP-a 8.3 5. 2. 2027.
11 2. 2. 2024. od PHP-a 8.2 6. 2. 2026.
10 3. 2. 2023. od PHP-a 8.1 7. 2. 2025.

Tablica pokazuje praktičnu vezu: projekt koji još koristi PHPUnit 10 uglavnom radi i na staroj verziji PHP-a. Alate za testiranje i verziju PHP-a treba podizati zajedno. PHPUnit se obično instalira putem Composera kao razvojna ovisnost.

Prvi test s PHPUnitom

Test je klasa koja nasljeđuje PHPUnit\Framework\TestCase. Metode testa su javne i počinju s test, a alternativno se označavaju atributom #[Test]. Primjer provjerava jednostavnu funkciju za izračun cijene:

<?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 isporučuje više slučajeva za isti test. Prema dokumentaciji PHPUnita mora biti javan i statičan. Računa se u centima kao cijeli broj kako ne bi nastale pogreške zaokruživanja zbog decimalnih brojeva. Paket se izvršava s ./vendor/bin/phpunit, ako je PHPUnit instaliran putem Composera.

Pest: ista osnova, kraći zapis

Pest je prema dokumentaciji izgrađen na PHPUnitu. Testovi se pišu kao funkcije s it() ili test(), a očekivanja s expect(). Pest 5 zahtijeva PHP 8.4. Instalacija prema dokumentaciji:

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

Isti test u Pestovu zapisu:

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

Postojeće PHPUnit testove dodatak pestphp/pest-plugin-drift većinom pretvara automatski. Koji će zapis tim odabrati stvar je ukusa; odlučujuće je da se testovi redovito izvode.

Koje su vrste testova smislene

  1. Jedinični testovi: provjeravaju pojedinačne funkcije i klase bez baze podataka ili mreže.
  2. Integracijski testovi: provjeravaju suradnju s bazom podataka, datotečnim sustavom ili sučeljima.
  3. Funkcionalni testovi putem HTTP-a: pozivaju stranice i obrasce kao što to čini preglednik.
  4. Sigurnosni regresijski testovi: bilježe otklonjene pogreške, primjerice da se izlazi maskiraju s htmlspecialchars() ili da prijava ne uspije nakon pogrešne lozinke.
  5. Smoke testovi nakon deploymenta: nekoliko brzih provjera odgovara li živa stranica nakon ažuriranja.

Uz testove, statička analiza s PHPStanom i Psalmom pronalazi pogreške bez izvršavanja koda.

Testovi kao sigurnosna mreža za ažuriranja i PHP2Shell

PHP2Shell je pokazao koliko može biti kratko vrijeme između objave i pritiska na djelovanje: najava 20. 10. 2026., zakrpe 21. 10. 2026., BSI (njemački Savezni ured za informacijsku sigurnost) upozorenje razine narančasto. Tko je imao testni paket, mogao je PHP 8.4.27 ili 8.3.36 instalirati u testnom okruženju, pokrenuti testove i istog dana ići uživo. Bez testova često je ostajao izbor između neprovjerenog ažuriranja i otvorene ranjivosti.

Korist je još veća pri promjeni glavne verzije. Za PHP 8.1 i starije više nema službenih ažuriranja, a PHP 8.2 završava 31. 12. 2026., kao što objašnjava stranica PHP End-of-Life. Pokretanje testova prema ciljnoj verziji rano pokazuje koje zastarjele funkcije treba zamijeniti. Smislen je CI pipeline koji pokreće testove prema više verzija PHP-a, uz pogled na release candidate verzije poput PHP-a 8.6.0, ali nikad u produkciji.

Savjet

Za svaku otklonjenu sigurnosnu pogrešku u svojoj aplikaciji napišite test. Tako osiguravate da se ista pogreška ne vrati pri kasnijoj promjeni.

Kako PHP SOS konkretno pomaže?

Pri migraciji s PHP-a 8.1 i starijeg te pri tekućim ažuriranjima podupiremo Vas ovako:

  • Procijeniti postojeće stanje: Koji testovi postoje, koje verzije PHP-a i PHPUnita rade, gdje nedostaju testovi za kritične tijekove?
  • Ostvariti minimalnu pokrivenost: Zajedno s Vašim razvojnim timom ili agencijom osiguravamo prijavu, obrasce i putove narudžbe testovima.
  • Testirati ažuriranja: Nove verzije PHP-a najprije prolaze u testnom okruženju prema paketu testova.
  • Dokumentirati rezultat: Dobivate rezultate testova i stanja verzija kao dokaz za korak zakrpe ili migracije.

Česta pitanja

Koja mi je verzija PHPUnita potrebna?

To ovisi o Vašoj verziji PHP-a. PHPUnit 13 zahtijeva PHP 8.4, PHPUnit 12 PHP 8.3, a PHPUnit 11 PHP 8.2. Aktualna tablica nalazi se na phpunit.de pod podržanim verzijama.

Je li Pest zamjena za PHPUnit?

Pest je prema vlastitoj dokumentaciji izgrađen na PHPUnitu i nudi kraći zapis. Postojeći PHPUnit testovi mogu se pomoću dodatka Drift većinom automatski pretvoriti, a neke treba prilagoditi ručno.

Pomažu li testovi protiv sigurnosnih ranjivosti u samom PHP-u?

Ne izravno. Ranjivosti poput PHP2Shella nalaze se u interpreteru i zatvaraju se PHP ažuriranjem. Testovi ipak omogućuju da to ažuriranje brzo instalirate, bez straha od neprimijećenih pogrešaka u aplikaciji.

Koliko je testova dovoljno?

Čvrstog broja nema. Smisleno je najprije pokriti poslovno kritične putove: prijavu, narudžbu, obrasce, sučelja. Zatim pokrivenost testovima raste sa svakom promjenom i svakom otklonjenom pogreškom.

Izvori

Hitni kontakt

Svaki sat se računa. Pišite nam odmah.

Ukratko opišite sustav, verziju PHP-a i opažanje. Javit ćemo Vam se, razjasniti situaciju i raditi na daljinu dok incident nije zaključen i dokumentiran.

Hitna pomoć