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:
<!-- phpunit.xml -->
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>Buat test baru:
php artisan make:test PostTestFeature test: simulasi HTTP
// 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
RefreshDatabaseme-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 pakaiRefreshDatabasedi feature test yang menyentuh database.