Dabartinė padėtis: PHP2Shell. Du kritiniai PHP pažeidžiamumai (CVSS 9,2) leidžia vykdyti kenkėjišką kodą be prisijungimo. Pataisos nuo 2026-10-21.Ką dabar daryti →

PHP kodo testavimas: PHPUnit ir Pest

PHPUnit yra standartinis PHP testavimo įrankis, Pest remiasi juo. Kas turi testus, saugumo atnaujinimus ir versijų keitimus gali diegti greičiau ir mažesne rizika.

Būsena 4 min. skaitymoPHP žinios

Trumpai: PHPUnit yra standartinis įrankis PHP kodui testuoti automatiškai; Pest yra juo besiremiantis karkasas su trumpesniu užrašu. Šiuo metu aktuali PHPUnit 13 (nuo 2026 m. vasario, nuo PHP 8.4), Pest yra 5 versijos. Automatiniai testai neuždaro saugumo spragų paties PHP, bet daro atnaujinimus planuojamus: po PHP2Shell ir prieš PHP 8.2 palaikymo pabaigą 2026-12-31 tai yra lemiamas privalumas.

Kodėl testuoti PHP kodą?

Vadovybei naudą galima apibūdinti vienu sakiniu: testai daro pakeitimus pigesnius ir saugesnius. Automatinis testas per sekundes patikrina, ar funkcija vis dar daro tai, ką turi daryti, pavyzdžiui, ar krepšelis teisingai skaičiuoja arba ar prisijungimas atmeta neteisingus slaptažodžius. Be testų tai tikrina žmogus rankomis arba niekas.

Skirtumas ypač ryškus atnaujinimų atveju. Kai PHP dėl kritinės spragos reikia atnaujinti skubiai, daug operatorių dvejoja, nes bijo klaidų parduotuvėje ar klientų portale. Su testų rinkiniu atnaujinimas pirmiausia vyksta testavimo aplinkoje, testai parodo problemas, ir tik tada pereinama į gyvą aplinką.

PHPUnit: PHP testų standartas

PHPUnit kasmet vasarį išleidžia naują pagrindinę versiją. Kiekviena versija reikalauja minimalios PHP versijos ir maždaug dvejus metus gauna klaidų taisymus. Pasak phpunit.de, galioja:

PHPUnit Išleista PHP reikalavimas Klaidų taisymai iki
13 2026-02-06 nuo PHP 8.4 2028-02-04
12 2025-02-07 nuo PHP 8.3 2027-02-05
11 2024-02-02 nuo PHP 8.2 2026-02-06
10 2023-02-03 nuo PHP 8.1 2025-02-07

Lentelė rodo praktinę sąsają: projektas, kuris dar naudoja PHPUnit 10, dažniausiai veikia ir su sena PHP versija. Testų įrankius ir PHP versiją reikėtų atnaujinti kartu. PHPUnit paprastai diegiamas per Composer kaip kūrimo priklausomybė.

Pirmasis testas su PHPUnit

Testas yra klasė, paveldinti iš PHPUnit\Framework\TestCase. Testų metodai yra vieši ir prasideda test, arba alternatyviai pažymimi atributu #[Test]. Pavyzdys tikrina paprastą kainos skaičiavimo funkciją:

<?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 tam pačiam testui pateikia kelis atvejus. Pasak PHPUnit dokumentacijos, jis turi būti viešas ir statinis. Skaičiuojama centais kaip sveikaisiais skaičiais, kad neatsirastų apvalinimo klaidų dėl slankiojo kablelio skaičių. Rinkinys vykdomas su ./vendor/bin/phpunit, jei PHPUnit įdiegtas per Composer.

Pest: tas pats pagrindas, trumpesnis užrašas

Pasak dokumentacijos, Pest sukurtas ant PHPUnit. Testai rašomi kaip funkcijos su it() ar test(), o lūkesčiai su expect(). Pest 5 reikalauja PHP 8.4. Diegimas pagal dokumentaciją:

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

Tas pats testas Pest užrašu:

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

Esamus PHPUnit testus papildinys pestphp/pest-plugin-drift didžiąja dalimi konvertuoja automatiškai. Kokį užrašą komanda pasirenka, yra skonio reikalas; lemiama, kad testai būtų vykdomi reguliariai.

Kokie testų tipai prasmingi

  1. Vienetų testai (unit): tikrina pavienes funkcijas ir klases be duomenų bazės ar tinklo.
  2. Integraciniai testai: tikrina sąveiką su duomenų baze, failų sistema ar sąsajomis.
  3. Funkciniai testai per HTTP: iškviečia puslapius ir formas, kaip tai daro naršyklė.
  4. Saugumo regresijos testai: užfiksuoja ištaisytas klaidas, pavyzdžiui, kad išvestys maskuojamos su htmlspecialchars() arba kad prisijungimas nepavyksta įvedus neteisingą slaptažodį.
  5. Smoke testai po diegimo: keli greiti patikrinimai, ar gyvas puslapis po atnaujinimo atsako.

Testus papildo statinė analizė su PHPStan ir Psalm, kuri randa klaidas nevykdydama kodo.

Testai kaip saugumo tinklas atnaujinimams ir PHP2Shell

PHP2Shell parodė, kaip trumpas gali būti laikas tarp paskelbimo ir spaudimo veikti: pranešimas 2026-10-20, pataisos 2026-10-21, BSI įspėjimo lygis oranžinis. Kas turėjo testų rinkinį, galėjo PHP 8.4.27 ar 8.3.36 įdiegti testavimo aplinkoje, paleisti testus ir tą pačią dieną pereiti į gyvą aplinką. Be testų dažnai likdavo tik pasirinkimas tarp nepatikrinto atnaujinimo ir atviros spragos.

Dar didesnė nauda keičiant pagrindinę versiją. PHP 8.1 ir senesnėms oficialių atnaujinimų nebėra, o PHP 8.2 baigiasi 2026-12-31, kaip paaiškina puslapis PHP End-of-Life. Testų paleidimas su tiksline versija anksti parodo, kurias pasenusias funkcijas reikia pakeisti. Prasminga CI grandinė, kuri vykdo testus su keliomis PHP versijomis, taip pat žvilgsnis į Release Candidates, tokius kaip PHP 8.6.0, bet niekada produkcijoje.

Patarimas

Kiekvienai ištaisytai saugumo klaidai savo programoje parašykite testą. Taip užtikrinsite, kad ta pati klaida vėliau po pakeitimo negrįš.

Kaip PHP SOS padeda konkrečiai?

Perkeliant iš PHP 8.1 ir senesnių versijų ir einamųjų atnaujinimų metu padedame taip:

  • Įvertinti esamą būklę: kokie testai yra, kokia PHP ir PHPUnit versija veikia, kur trūksta testų kritinėms eigoms?
  • Sukurti minimalią aprėptį: kartu su jūsų kūrimo komanda ar agentūra testais apsaugome prisijungimą, formas ir užsakymų kelius.
  • Išbandyti atnaujinimus: naujos PHP versijos pirmiausia veikia testavimo aplinkoje su rinkiniu.
  • Dokumentuoti rezultatą: gaunate testų rezultatus ir versijų būseną kaip įrodymą pataisų ar perkėlimo žingsniui.

Dažni klausimai

Kokios PHPUnit versijos man reikia?

Tai priklauso nuo jūsų PHP versijos. PHPUnit 13 reikalauja PHP 8.4, PHPUnit 12 PHP 8.3, o PHPUnit 11 PHP 8.2. Aktuali lentelė pateikta phpunit.de palaikomų versijų skyriuje.

Ar Pest yra PHPUnit pakaitalas?

Pasak savo dokumentacijos, Pest sukurtas ant PHPUnit ir siūlo trumpesnį užrašą. Esamus PHPUnit testus su Drift papildiniu didžiąja dalimi galima konvertuoti automatiškai, kai kuriuos reikia pritaikyti rankiniu būdu.

Ar testai padeda nuo saugumo spragų pačiame PHP?

Tiesiogiai ne. Tokios spragos kaip PHP2Shell slypi interpretatoriuje ir uždaromos PHP atnaujinimu. Tačiau testai leidžia šį atnaujinimą diegti greitai, nebijant nepastebėtų programos klaidų.

Kiek testų pakanka?

Fiksuoto skaičiaus nėra. Prasminga pirmiausia padengti verslui kritinius kelius: prisijungimą, užsakymą, formas, sąsajas. Po to testų aprėptis auga su kiekvienu pakeitimu ir kiekviena ištaisyta klaida.

Šaltiniai

Skubus kontaktas

Kiekviena valanda svarbi. Parašykite mums dabar.

Trumpai aprašykite sistemą, PHP versiją ir pastebėjimus. Mes atsakysime, išsiaiškinsime padėtį ir dirbsime nuotoliu, kol incidentas bus užbaigtas ir dokumentuotas.

Skubi pagalba