Testing dengan Pest — Testing

Apa itu Pest? Pest adalah framework testing PHP yang dibangun di atas PHPUnit dengan sintaks yang lebih bersih dan ekspresif. Pest tidak menggantikan PHPUnit…

Apa itu Pest?

Pest adalah framework testing PHP yang dibangun di atas PHPUnit dengan sintaks yang lebih bersih dan ekspresif. Pest tidak menggantikan PHPUnit — melainkan membungkusnya dengan API yang lebih nyaman.

Kenapa Pest?

Sintaks Dasar

<?php

// it() — deskripsi test dimulai dari "it"
it("can add two numbers", function () {
    $result = 2 + 3;
    expect($result)->toBe(5);
});

// test() — deskripsi test lebih bebas
test("penjumlahan menghasilkan angka positif", function () {
    expect(2 + 3)->toBeGreaterThan(0);
});

Expect API (Chainable)

Kekuatan utama Pest ada di expect() yang bisa di-chain:

expect($user)
    ->name->toBe("Budi")
    ->email->toEndWith("@gmail.com")
    ->isActive->toBeTrue();

expect($items)
    ->toBeArray()
    ->toHaveCount(3)
    ->each->toBeString();

expect($text)
    ->toBeString()
    ->not->toBeEmpty()
    ->toContain("halo");

Datasets (Data Providers)

// Inline dataset
it("mengalikan dengan benar", function (int $a, int $b, int $expected) {
    expect($a * $b)->toBe($expected);
})->with([
    [2, 3, 6],
    [0, 5, 0],
    [-1, 4, -4],
]);

// Named dataset
dataset("operasi-math", [
    "positif" => [2, 3, 5],
    "negatif" => [-1, -2, -3],
    "nol"     => [0, 0, 0],
]);

test("penjumlahan", function (int $a, int $b, int $expected) {
    expect($a + $b)->toBe($expected);
})->with("operasi-math");

Grouping dengan describe()

describe("Kalkulator", function () {
    it("menambahkan dua angka", function () {
        expect(2 + 3)->toBe(5);
    });

    it("mengurangi dua angka", function () {
        expect(5 - 3)->toBe(2);
    });
});

describe("String helper", function () {
    it("mengubah ke uppercase", function () {
        expect(strtoupper("halo"))->toBe("HALO");
    });
});

Migrasi dari PHPUnit ke Pest

Pest bisa dipakai bersama PHPUnit dalam satu project. Migrasi bisa dilakukan bertahap:

// PHPUnit (sebelum)
class UserTest extends TestCase
{
    public function test_user_has_name(): void
    {
        $user = User::factory()->create();
        $this->assertNotNull($user->name);
    }
}

// Pest (sesudah)
it("has a name", function () {
    $user = User::factory()->create();
    expect($user->name)->not->toBeNull();
});

Tips

Yang akan kamu pelajari