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:
Haqiqiy test kutubxonalari ham shu ishni bajaradi — faqat ancha boyroq imkoniyatlar bilan.
Yiqilgan test qanday ko’rinadi
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
Ustuvorlik tartibi:
- Chegara qiymatlar —
0, bo’sh massiv,null, chegaraning ikki tomoni; - Xato holatlari — noto’g’ri kirish;
- Asosiy holat — odatiy ishlash;
- 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
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:
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
- Sodda funksiya yozib, yuqoridagi
test()bilan sinang; - ataylab xato qilib, yiqilgan testni ko’ring;
- chegara qiymatlar uchun testlar yozing;
expectExceptionbilan xato holatini sinang;- vaqtga bog’liq funksiyani parametrli qilib qayta yozing;
- 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.
assertSameafzal (assertEqualsturni 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.