Laravel menyediakan ekosistem testing yang terintegrasi penuh dengan PHPUnit. Artikel ini membahas cara menulis unit test dan feature test secara praktis, mulai dari persiapan hingga eksekusi, sehingga kode Anda terjamin kualitasnya.
Langkah Persiapan Lingkungan
- Pastikan Composer terinstal
Jika belum, instal dengancomposer --versioncurl -sS https://getcomposer.org/installer | php. - Instal dependensi testing Laravel
Laravel 10 sudah menyertakan PHPUnit secara default, namun memastikan versi terbaru tetap penting.composer require --dev phpunit/phpunit ^10 composer require --dev laravel/browser-kit-testing - Konfigurasi file
.env.testing
Simpan file ini di root proyek. Laravel akan otomatis memuatnya saat menjalankanAPP_ENV=testing DB_CONNECTION=sqlite DB_DATABASE=:memory:php artisan test. - Generate basis test case
Perintah ini membuat filephp artisan make:test ExampleTesttests/Feature/ExampleTest.phpyang dapat Anda gunakan sebagai referensi.
Menulis Unit Test
Unit test berfokus pada logika kelas secara terisolasi, tanpa melibatkan HTTP atau database.
- Buat kelas unit test
File akan berada diphp artisan make:test CalculatorTest --unittests/Unit/CalculatorTest.php. - Implementasikan contoh kelas yang akan diuji
<?php namespace App\Services; class Calculator { public function add(int $a, int $b): int { return $a + $b; } public function divide(int $a, int $b): float { if ($b === 0) { throw new \InvalidArgumentException('Division by zero'); } return $a / $b; } } - Tulis unit test untuk metode
adddandivide<?php namespace Tests\Unit; use PHPUnit\Framework\TestCase; use App\Services\Calculator; class CalculatorTest extends TestCase { public function test_add_returns_correct_sum() { $calc = new Calculator(); $this->assertEquals(7, $calc->add(3, 4)); } public function test_divide_returns_correct_result() { $calc = new Calculator(); $this->assertEquals(2.5, $calc->divide(5, 2)); } public function test_divide_by_zero_throws_exception() { $this->expectException(\InvalidArgumentException::class); $calc = new Calculator(); $calc->divide(5, 0); } } - Jalankan unit test
Semua test harus berstatusphp artisan test --testsuite UnitOK.
Menulis Feature Test
Feature test menguji alur aplikasi secara end‑to‑end, mencakup routing, controller, request validation, dan database.
- Buat resource dan migration contoh
Tambahkan kolomphp artisan make:model Post -m php artisan migratetitledanbodypada migrationdatabase/migrations/*_create_posts_table.php. - Definisikan route, controller, dan request
// routes/web.php use App\Http\Controllers\PostController; Route::post('/posts', [PostController::class, 'store']); // app/Http/Controllers/PostController.php namespace App\Http\Controllers; use App\Models\Post; use Illuminate\Http\Request; class PostController extends Controller { public function store(Request $request) { $validated = $request->validate([ 'title' => 'required|string|max:255', 'body' => 'required|string', ]); $post = Post::create($validated); return response()->json($post, 201); } } // app/Models/Post.php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Post extends Model { use HasFactory; protected $fillable = ['title', 'body']; } - Buat feature test untuk endpoint
/postsphp artisan make:test PostFeatureTest // tests/Feature/PostFeatureTest.php namespace Tests\Feature; use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; use App\Models\Post; class PostFeatureTest extends TestCase { use RefreshDatabase; public function test_store_endpoint_creates_post() { $payload = [ 'title' => 'Judul Post Pertama', 'body' => 'Isi konten post yang lengkap.', ]; $response = $this->postJson('/posts', $payload); $response->assertStatus(201) ->assertJsonFragment(['title' => 'Judul Post Pertama']); $this->assertDatabaseHas('posts', ['title' => 'Judul Post Pertama']); } public function test_store_validation_fails_when_title_missing() { $payload = ['body' => 'Hanya body']; $response = $this->postJson('/posts', $payload); $response->assertStatus(422) ->assertJsonValidationErrors('title'); } } - Jalankan feature test
Pastikan semua skenario berhasil.php artisan test --testsuite Feature
"Testing bukan sekadar menulis kode tambahan, melainkan investasi jangka panjang untuk kualitas produk. Di AN Media, setiap modul Laravel kami uji secara unit dan feature sebelum dirilis ke klien." – Tim QA AN Media
Kesimpulan & Call to Action
Dengan mengikuti langkah‑langkah di atas, Anda dapat menyiapkan lingkungan, menulis unit test untuk logika bisnis, serta feature test untuk alur aplikasi secara menyeluruh. Implementasi testing otomatis ini mempercepat deteksi bug, meningkatkan kepercayaan klien, dan memudahkan refactoring di masa depan.
Jika Anda membutuhkan bantuan lebih lanjut dalam mengintegrasikan testing ke proyek Laravel Anda, hubungi tim AN Media melalui [email protected] atau kunjungi website resmi kami untuk konsultasi gratis.