laraveltestingpestMahir3 mnt baca

Testing Dasar dengan Pest/PHPUnit

Tulis feature test: simulasi request HTTP, actingAs, dan assert database dengan RefreshDatabase.

Setup testing

Laravel 11 memakai Pest secara default (atau PHPUnit kalau kamu pilih). Konfigurasi test ada di phpunit.xml, dan Laravel menyediakan database SQLite in-memory khusus testing supaya test cepat dan tidak mengotori database asli:

xml
<!-- phpunit.xml -->
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>

Buat test baru:

bash
php artisan make:test PostTest

Feature test: simulasi HTTP

php
// tests/Feature/PostTest.php
use App\Models\Post;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

it('tamu tidak bisa membuat post', function () {
    $response = $this->post('/posts', [
        'judul' => 'Halo',
        'isi' => 'Isi postingan yang cukup panjang...',
    ]);

    $response->assertRedirect('/login');
});

it('user login bisa membuat post', function () {
    $user = User::factory()->create();

    $response = $this->actingAs($user)->post('/posts', [
        'judul' => 'Judul Baru',
        'slug' => 'judul-baru',
        'isi' => 'Isi postingan yang cukup panjang untuk lolos validasi minimal.',
        'status' => 'published',
    ]);

    $response->assertRedirect(route('posts.index'));
    $this->assertDatabaseHas('posts', ['slug' => 'judul-baru']);
});

it('validasi menolak judul kosong', function () {
    $user = User::factory()->create();

    $response = $this->actingAs($user)->post('/posts', [
        'judul' => '',
        'isi' => 'Isi...',
    ]);

    $response->assertSessionHasErrors('judul');
});

Jalankan dengan php artisan test (output cantik) atau ./vendor/bin/pest.

Assert yang sering dipakai

assertStatus(200), assertOk(), assertRedirect(), assertSee('teks'), assertJsonPath('data.0.judul', 'x'), assertDatabaseHas(), assertDatabaseMissing(), assertSessionHasErrors().

Catatan teknis: Trait RefreshDatabase me-reset database tiap test dengan migration, jadi test tidak saling mengotori. Tanpa ini, data dari test A bisa bikin test B gagal secara acak (flaky). Selalu pakai RefreshDatabase di feature test yang menyentuh database.