PHP kodni testlash (PHPUnit)

Kodni har o’zgartirishda qo’lda tekshirish uzoq va ishonchsiz. Test — kodni tekshiradigan kod: bir marta yoziladi, har safar avtomatik ishlaydi.

Nima uchun kerak

Asosiy foyda — regressiyadan himoya: eski kodni o’zgartirganda nimadir buzilsa, test darhol aytadi.

Oddiy test yozuvchi

Kutubxonasiz ham tamoyilni ko’rsatish mumkin:

PHP

Haqiqiy test kutubxonalari ham shu ishni bajaradi — faqat ancha boyroq imkoniyatlar bilan.

Yiqilgan test qanday ko’rinadi

PHP

Xato xabari aniq bo’lishi muhim: nima kutilgan, nima olingan.

PHPUnit bilan

composer require --dev phpunit/phpunit

composer.json:

"scripts": {
    "test": "phpunit tests"
}

src/Chegirma.php:

<?php
namespace App;

class Chegirma
{
    public function hisobla(int $narx, int $foiz): int
    {
        if ($foiz < 0 || $foiz > 100) {
            throw new \InvalidArgumentException("Foiz 0-100 oralig'ida");
        }
        return (int) round($narx * (1 - $foiz / 100));
    }
}

tests/ChegirmaTest.php:

<?php
namespace Tests;

use App\Chegirma;
use PHPUnit\Framework\TestCase;

class ChegirmaTest extends TestCase
{
    private Chegirma $chegirma;

    protected function setUp(): void
    {
        $this->chegirma = new Chegirma();
    }

    public function test10FoizTogriHisoblanadi(): void
    {
        $this->assertSame(90000, $this->chegirma->hisobla(100000, 10));
    }

    public function testNolFoizdaNarxOzgarmaydi(): void
    {
        $this->assertSame(100000, $this->chegirma->hisobla(100000, 0));
    }

    public function testNotogriFoizXatoBeradi(): void
    {
        $this->expectException(\InvalidArgumentException::class);
        $this->chegirma->hisobla(100000, 150);
    }
}
composer test

Asosiy assert metodlari

Metod Tekshiradi
assertSame($a, $b) Aynan tenglik (===) — afzal
assertEquals($a, $b) Qiymat tengligi (==)
assertTrue / assertFalse Mantiqiy qiymat
assertNull null ekanini
assertCount(3, $massiv) Elementlar soni
assertContains($x, $massiv) Massivda bormi
assertEmpty Bo’shmi
expectException(...) Istisno tashlanadimi

AAA naqshi

Har test uch qismdan iborat bo’lsin:

public function testSavatgaMahsulotQoshadi(): void
{
    // Arrange — tayyorlash
    $savat = new Savat();
    $mahsulot = new Mahsulot("Olma", 12000);

    // Act — bajarish
    $savat->qosh($mahsulot, 3);

    // Assert — tekshirish
    $this->assertSame(3, $savat->soni());
    $this->assertSame(36000, $savat->jami());
}

Bu tuzilma testni o’qishni osonlashtiradi va bitta testda bir necha ishni tekshirishdan saqlaydi.

Nimani sinash kerak

PHP

Ustuvorlik tartibi:

  1. Chegara qiymatlar0, bo’sh massiv, null, chegaraning ikki tomoni;
  2. Xato holatlari — noto’g’ri kirish;
  3. Asosiy holat — odatiy ishlash;
  4. Tuzatilgan xatolar — har buzilgan joyga test, qaytmasligi uchun.

Ma’lumot bilan test

Bir xil testni ko’p qiymatda takrorlash:

/**
 * @dataProvider yoshlarProvider
 */
public function testYoshGuruhi(int $yosh, string $kutilgan): void
{
    $this->assertSame($kutilgan, yoshGuruhi($yosh));
}

public static function yoshlarProvider(): array
{
    return [
        "chegara: 0"   => [0, "bola"],
        "chegara: 12"  => [12, "bola"],
        "chegara: 13"  => [13, "o'smir"],
        "chegara: 18"  => [18, "katta"],
        "chegara: 60"  => [60, "keksa"],
    ];
}

Nom berilgan holatlar yiqilganda qaysi biri ekanini darhol ko’rsatadi.

Testga qulay kod

PHP

Ikki qoida testni ancha osonlashtiradi:

  • Sof funksiya — kirish va chiqishdan boshqa hech narsa yo’q;
  • Bog’liqlikni tashqaridan berish — vaqt, baza, tarmoq parametr sifatida.

Soxta obyekt

Interfeys tufayli haqiqiy bazani soxtasiga almashtirish mumkin:

PHP

PHPUnit’da buni createMock() avtomatik qiladi:

$ombor = $this->createMock(TalabaOmbori::class);
$ombor->method("topId")->willReturn(["ism" => "Aziz", "ball" => 85]);

$xizmat = new TalabaXizmati($ombor);
$this->assertSame("Aziz — 85 ball", $xizmat->tavsif(1));

Qamrov haqida

Statik tahlil

Test bilan birga ishlatiladigan vosita:

composer require --dev phpstan/phpstan
vendor/bin/phpstan analyse src --level=6

PHPStan kodni ishga tushirmasdan tekshiradi: mavjud bo’lmagan metod, noto’g’ri tur, null bo’lishi mumkin bo’lgan qiymat. Testlar topa olmaydigan xatolarni topadi.

Amaliy mashq

  1. Sodda funksiya yozib, yuqoridagi test() bilan sinang;
  2. ataylab xato qilib, yiqilgan testni ko’ring;
  3. chegara qiymatlar uchun testlar yozing;
  4. expectException bilan xato holatini sinang;
  5. vaqtga bog’liq funksiyani parametrli qilib qayta yozing;
  6. interfeys va soxta obyekt bilan xizmatni sinang.

5- va 6-qadamlar testga qulay kodning mohiyatini ko’rsatadi.

Qisqacha xulosa

  • Test — kodni tekshiradigan kod; regressiyadan himoya qiladi.
  • AAA: Arrange → Act → Assert.
  • assertSame afzal (assertEquals turni tekshirmaydi).
  • setUp() har test oldidan toza holat yaratadi.
  • Avval chegara va xato holatlarini sinang.
  • Sof funksiya va tashqaridan berilgan bog’liqlik testni osonlashtiradi.
  • Interfeys tufayli baza o’rniga soxta obyekt qo’yiladi.
  • Qamrov — ko’rsatkich, maqsad emas.

Keyingi darsda deploy va sozlash — loyihani serverga joylashtirish.

Bu dars foydali bo'ldimi?

marta ko'rildi