Aktuālā situācija: PHP2Shell. Divas kritiskas PHP ievainojamības (CVSS 9.2) ļauj izpildīt ļaunprātīgu kodu bez pieteikšanās. Ielāpi kopš 21.10.2026.Kas jādara tagad →

PHP koda testēšana: PHPUnit un Pest

PHPUnit ir standarta testēšanas rīks PHP, Pest ir uz tā balstīts. Kam ir testi, tas drošības atjauninājumus un versiju maiņas var ieviest ātrāk un ar mazāku risku.

Aktuāls uz 4 min lasīšanas laiksPHP zināšanas

Īsi: PHPUnit ir standarta rīks PHP koda automātiskai testēšanai; Pest ir uz tā balstīts ietvars ar īsāku pierakstu. Pašlaik aktuāla ir PHPUnit 13 (kopš 2026. gada februāra, no PHP 8.4), Pest ir 5. versijā. Automātiskie testi neaizver ievainojamības pašā PHP, bet tie padara atjauninājumus plānojamus: pēc PHP2Shell un pirms PHP 8.2 atbalsta beigām 31.12.2026 tā ir izšķirošā priekšrocība.

Kāpēc testēt PHP kodu?

Uzņēmuma vadībai ieguvumu var izteikt vienā teikumā: testi padara izmaiņas lētākas un drošākas. Automātisks tests sekundēs pārbauda, vai funkcija joprojām dara to, kas tai jādara, piemēram, vai grozs rēķina pareizi vai pieteikšanās noraida nepareizas paroles. Bez testiem to pārbauda cilvēks ar rokām, vai neviens.

Atšķirība īpaši skaidra ir atjauninājumos. Ja PHP kritiskas ievainojamības dēļ steidzami jāatjaunina, daudzi operatori vilcinās, jo baidās no kļūdām veikalā vai klientu portālā. Ar testu komplektu atjauninājums vispirms notiek testa vidē, testi parāda problēmas, un tikai tad seko darbība produkcijā.

PHPUnit: PHP testu standarts

PHPUnit katru gadu februārī iznāk jaunā pamatversijā. Katra versija paredz minimālo PHP versiju un apmēram divus gadus saņem kļūdu labojumus. Saskaņā ar phpunit.de:

PHPUnit Izdots PHP prasība Kļūdu labojumi līdz
13 06.02.2026 no PHP 8.4 04.02.2028
12 07.02.2025 no PHP 8.3 05.02.2027
11 02.02.2024 no PHP 8.2 06.02.2026
10 03.02.2023 no PHP 8.1 07.02.2025

Tabula rāda praktisku sakarību: projekts, kas vēl lieto PHPUnit 10, parasti darbojas arī vēl uz vecas PHP versijas. Testēšanas rīki un PHP versija jāceļ kopā. PHPUnit parasti instalē ar Composer kā izstrādes atkarību.

Pirmais tests ar PHPUnit

Tests ir klase, kas mantojas no PHPUnit\Framework\TestCase. Testa metodes ir publiskas un sākas ar test, vai arī tās atzīmē ar atribūtu #[Test]. Piemērs pārbauda vienkāršu cenas aprēķina funkciju:

<?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 piegādā vairākus gadījumus vienam un tam pašam testam. Saskaņā ar PHPUnit dokumentāciju tam jābūt publiskam un statiskam. Aprēķins notiek centos kā vesels skaitlis, lai decimālskaitļu dēļ neradītos noapaļošanas kļūdas. Komplektu palaiž ar ./vendor/bin/phpunit, ja PHPUnit instalēts ar Composer.

Pest: tā pati bāze, īsāks pieraksts

Saskaņā ar dokumentāciju Pest ir balstīts uz PHPUnit. Testus raksta kā funkcijas ar it() vai test() un gaidāmos rezultātus ar expect(). Pest 5 prasa PHP 8.4. Instalēšana saskaņā ar dokumentāciju:

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

Tas pats tests Pest pierakstā:

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

Esošos PHPUnit testus spraudnis pestphp/pest-plugin-drift lielākoties pārveido automātiski. Kuru pierakstu komanda izvēlas, ir gaumes jautājums; izšķiroši, lai testi darbotos regulāri.

Kādi testu veidi ir lietderīgi

  1. Vienības testi (unit): pārbauda atsevišķas funkcijas un klases bez datubāzes vai tīkla.
  2. Integrācijas testi: pārbauda sadarbību ar datubāzi, failu sistēmu vai saskarnēm.
  3. Funkcionālie testi pa HTTP: izsauc lapas un veidlapas tā, kā to dara pārlūkprogramma.
  4. Drošības regresijas testi: fiksē novērstas kļūdas, piemēram, ka izvade tiek maskēta ar htmlspecialchars() vai ka pieteikšanās pēc nepareizas paroles neizdodas.
  5. Smoke testi pēc izvietošanas: daži ātri pārbaudījumi, vai produkcijas vietne pēc atjauninājuma atbild.

Papildus testiem statiskā analīze ar PHPStan un Psalm atrod kļūdas, nepalaižot kodu.

Testi kā drošības tīkls atjauninājumiem un PHP2Shell

PHP2Shell parādīja, cik īss var būt laiks starp publicēšanu un rīcības spiedienu: paziņojums 20.10.2026, ielāpi 21.10.2026, BSI brīdinājuma līmenis oranžs. Kam bija testu komplekts, tas varēja PHP 8.4.27 vai 8.3.36 ieviest testa vidē, palaist testus un tajā pašā dienā pāriet uz produkciju. Bez testiem bieži atlika izvēle starp nepārbaudītu atjauninājumu un atvērtu ievainojamību.

Vēl lielāks ieguvums ir pamatversijas maiņā. PHP 8.1 un vecākai vairs nav oficiālu atjauninājumu, un PHP 8.2 beidzas 31.12.2026, kā izskaidro lapa PHP End of Life. Testu palaišana pret mērķa versiju agri parāda, kuras novecojušās funkcijas jānomaina. Lietderīgs ir CI konveijers, kas testus palaiž pret vairākām PHP versijām, kā arī skatiens uz Release Candidate, piemēram, PHP 8.6.0, tomēr nekad ne produkcijā.

Padoms

Katrai novērstai drošības kļūdai savā lietojumprogrammā uzrakstiet testu. Tā nodrošināsiet, ka tā pati kļūda pie vēlākas izmaiņas neatgriežas.

Kā PHP SOS palīdz konkrēti?

PHP 8.1 un vecāku versiju migrācijā un kārtējos atjauninājumos mēs atbalstām šādi:

  • Izvērtēt esošo stāvokli: kādi testi ir, kādas PHP un PHPUnit versijas darbojas, kur trūkst testu kritiskajām norisēm?
  • Izveidot minimālo aptvērumu: kopā ar jūsu izstrādes komandu vai aģentūru mēs ar testiem nodrošinām pieteikšanos, veidlapas un pasūtījumu ceļus.
  • Testēt atjauninājumus: jaunās PHP versijas vispirms darbojas testa vidē pret komplektu.
  • Dokumentēt rezultātu: jūs saņemat testu rezultātus un versiju stāvokli kā pierādījumu ielāpa vai migrācijas solim.

Biežāk uzdotie jautājumi

Kāda PHPUnit versija man vajadzīga?

Tas atkarīgs no jūsu PHP versijas. PHPUnit 13 prasa PHP 8.4, PHPUnit 12 PHP 8.3 un PHPUnit 11 PHP 8.2. Aktuālā tabula atrodas phpunit.de sadaļā par atbalstītajām versijām.

Vai Pest ir PHPUnit aizstājējs?

Saskaņā ar savu dokumentāciju Pest ir balstīts uz PHPUnit un piedāvā īsāku pierakstu. Esošos PHPUnit testus ar spraudni Drift lielākoties var pārveidot automātiski, daži jāpielāgo ar rokām.

Vai testi palīdz pret ievainojamībām pašā PHP?

Ne tieši. Ievainojamības, piemēram, PHP2Shell, atrodas interpretatorā, un tās aizver PHP atjauninājums. Taču testi nodrošina, ka šo atjauninājumu varat ieviest ātri, bez bailēm no nepamanītām kļūdām lietojumprogrammā.

Cik testu ir pietiekami?

Noteikta skaitļa nav. Prātīgi ir vispirms aptvert uzņēmējdarbībai kritiskos ceļus: pieteikšanos, pasūtījumu, veidlapas, saskarnes. Pēc tam testu aptvērums aug ar katru izmaiņu un katru novērsto kļūdu.

Avoti

Tūlītējs kontakts

Katra stunda ir svarīga. Rakstiet mums tūlīt.

Īsi aprakstiet sistēmu, PHP versiju un novēroto. Mēs sazināsimies, noskaidrosim situāciju un strādāsim attālināti, līdz incidents ir slēgts un dokumentēts.

Tūlītēja palīdzība