laravel testing unit test | java php laravel linux mysql sql bootstrap html css query java php laravel linux mysql sql bootstrap html css query: laravel testing unit test

Monday, April 13, 2026

laravel testing unit test

๐Ÿ“š Seri Belajar Laravel — Artikel 42 dari 50

Testing di Laravel:
Unit Test & Feature Test

Pelajari cara menulis testing Laravel PHPUnit yang benar — dari Unit Test sampai Feature Test — supaya aplikasi kamu kokoh, minim bug, dan siap production!

#Laravel #PHPUnit #Testing #PHP
⏱️12 menit baca
๐ŸŽฏLevel: Intermediate
๐Ÿ“…Updated: 2025

Pernah nggak, kamu sudah deploy aplikasi Laravel dengan penuh percaya diri — lalu tiba-tiba ada bug konyol yang bikin fitur login mati total? ๐Ÿ˜ญ Kalau pernah, selamat datang di klub yang nggak mau ada anggota baru. Solusinya satu kata: testing. Di artikel ke-42 dari seri 50 Artikel Belajar Laravel ini, kita akan bedah tuntas cara kerja testing Laravel PHPUnit — mulai dari apa itu testing, perbedaan Unit Test vs Feature Test, sampai kamu bisa langsung nulis test case sendiri. Anggap ini sebagai "helm pengaman" sebelum kamu ngebut di jalan production.

๐Ÿง  Definisi Penting

Testing dalam pengembangan software adalah proses memverifikasi bahwa kode yang kamu tulis bekerja sesuai ekspektasi. Laravel hadir dengan dukungan PHPUnit secara built-in, artinya kamu tidak perlu install tool tambahan — tinggal tulis, jalankan, dan periksa hasilnya.

๐Ÿ›ก️ Mengapa Testing Laravel PHPUnit Itu Wajib Dipelajari?

Bayangkan kamu membangun gedung bertingkat. Sebelum lantai 10 dibangun, insinyur pasti ngecek dulu apakah fondasi dan tiap lantai di bawahnya kokoh. Nah, testing di software itu fungsinya persis sama — memastikan setiap "lantai" (fungsi/fitur) kamu aman sebelum menambahkan yang baru di atasnya.

Tanpa testing, setiap kali kamu menambah fitur baru, kamu harus tes ulang semua fitur lama secara manual. Itu membuang waktu, tenaga, dan bikin developer cepat burnout. Dengan testing Laravel PHPUnit, proses itu bisa diotomasi.

๐Ÿ”ฅ
Fakta Menarik

Menurut studi IBM, biaya memperbaiki bug yang ditemukan setelah production bisa 6x lebih mahal dibanding memperbaikinya saat development. Testing = investasi, bukan pemborosan waktu!

๐Ÿ“Š Perbandingan: Tanpa Testing vs Dengan Testing

Aspek ❌ Tanpa Testing ✅ Dengan Testing
Deteksi Bug Manual, lambat, sering terlewat Otomatis, cepat, konsisten
Refaktor Kode Rawan merusak fitur lain Aman, ada safety net
Dokumentasi Tidak ada / terpisah Test = dokumentasi hidup
Deploy ke Production Deg-degan tiap saat ๐Ÿ˜ฐ Confident & siap CI/CD ๐Ÿš€

⚡ Perbedaan Unit Test dan Feature Test di Laravel PHPUnit

Laravel menyediakan dua jenis test utama: Unit Test dan Feature Test. Analoginya begini — Unit Test itu seperti ngecek apakah masing-masing baut dan mur di mobilmu berfungsi sendiri-sendiri. Sedangkan Feature Test itu seperti test drive — kamu menguji apakah seluruh mobil bisa berjalan dari A ke B dengan lancar.

๐Ÿ” Analisis: Unit Test vs Feature Test

๐Ÿงฉ Unit Test
  • Menguji satu fungsi/method terisolasi
  • Tidak melibatkan database atau HTTP
  • Eksekusi sangat cepat
  • Folder: tests/Unit/
๐ŸŒ Feature Test
  • Menguji alur lengkap (HTTP request → response)
  • Melibatkan database, routes, middleware
  • Eksekusi lebih lambat, tapi lebih komprehensif
  • Folder: tests/Feature/

๐Ÿงช Cara Menulis Unit Test di Laravel — Step by Step

Oke, mari langsung praktik! Kita akan buat Unit Test sederhana untuk sebuah class helper yang bertugas menghitung diskon produk.

1
Buat class yang akan di-test

Buat file app/Helpers/PriceCalculator.php berisi logika perhitungan diskon.

app/Helpers/PriceCalculator.php
<?php

namespace App\Helpers;

class PriceCalculator
{
    public function calculateDiscount(float $price, float $discountPercent): float
    {
        if ($discountPercent < 0 || $discountPercent > 100) {
            throw new \InvalidArgumentException('Diskon harus antara 0-100%');
        }

        return $price - ($price * $discountPercent / 100);
    }
}
2
Generate file Unit Test via Artisan
php artisan make:test PriceCalculatorTest --unit

File akan dibuat di tests/Unit/PriceCalculatorTest.php

3
Tulis test cases
tests/Unit/PriceCalculatorTest.php
<?php

namespace Tests\Unit;

use App\Helpers\PriceCalculator;
use PHPUnit\Framework\TestCase;

class PriceCalculatorTest extends TestCase
{
    protected PriceCalculator $calculator;

    protected function setUp(): void
    {
        parent::setUp();
        $this->calculator = new PriceCalculator();
    }

    /** @test */
    public function it_calculates_discount_correctly(): void
    {
        $result = $this->calculator->calculateDiscount(100000, 20);

        $this->assertEquals(80000, $result);
    }

    /** @test */
    public function it_returns_full_price_when_discount_is_zero(): void
    {
        $result = $this->calculator->calculateDiscount(100000, 0);

        $this->assertEquals(100000, $result);
    }

    /** @test */
    public function it_throws_exception_for_invalid_discount(): void
    {
        $this->expectException(\InvalidArgumentException::class);

        $this->calculator->calculateDiscount(100000, 150);
    }
}
4
Jalankan test dan lihat hasilnya
php artisan test --filter PriceCalculatorTest
  PASS  Tests\Unit\PriceCalculatorTest
  ✓ it calculates discount correctly                      0.08s
  ✓ it returns full price when discount is zero           0.01s
  ✓ it throws exception for invalid discount              0.01s

  Tests:    3 passed (3 assertions)
  Duration: 0.15s
๐Ÿ’ก
Tips

Nama method test yang deskriptif seperti it_calculates_discount_correctly() jauh lebih bermanfaat daripada test1(). Anggap nama test sebagai "spesifikasi hidup" dari kode kamu!

๐ŸŒ Menulis Feature Test: Simulasi HTTP Request Nyata

Sekarang kita naik level dengan Feature Test. Kita akan mensimulasikan request ke endpoint API dan memverifikasi response-nya. Contoh kasus: testing endpoint login menggunakan testing Laravel PHPUnit dengan database testing menggunakan Refresh Database.

1
Generate Feature Test
php artisan make:test AuthTest

Tanpa flag --unit, file akan dibuat di tests/Feature/ secara default.

2
Tulis Feature Test dengan RefreshDatabase
tests/Feature/AuthTest.php
<?php

namespace Tests\Feature;

use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class AuthTest extends TestCase
{
    use RefreshDatabase;

    /** @test */
    public function user_can_login_with_correct_credentials(): void
    {
        // Arrange: buat user menggunakan factory
        $user = User::factory()->create([
            'email'    => 'test@example.com',
            'password' => bcrypt('password123'),
        ]);

        // Act: kirim POST request ke endpoint login
        $response = $this->postJson('/api/login', [
            'email'    => 'test@example.com',
            'password' => 'password123',
        ]);

        // Assert: periksa response
        $response->assertStatus(200)
                 ->assertJsonStructure(['token', 'user']);
    }

    /** @test */
    public function user_cannot_login_with_wrong_password(): void
    {
        User::factory()->create([
            'email'    => 'test@example.com',
            'password' => bcrypt('password123'),
        ]);

        $response = $this->postJson('/api/login', [
            'email'    => 'test@example.com',
            'password' => 'salahpassword',
        ]);

        $response->assertStatus(422);
    }

    /** @test */
    public function authenticated_user_can_access_profile(): void
    {
        $user = User::factory()->create();

        $response = $this->actingAs($user)
                         ->getJson('/api/profile');

        $response->assertStatus(200)
                 ->assertJson(['email' => $user->email]);
    }
}
Insight Penting

Trait RefreshDatabase akan me-reset database ke kondisi awal setelah setiap test berjalan. Ini memastikan setiap test case berjalan dalam kondisi bersih dan tidak saling mempengaruhi satu sama lain.

⚠️
Perhatian

Pastikan kamu menggunakan database testing terpisah (misalnya SQLite in-memory) agar data production kamu tidak tersentuh saat menjalankan test. Konfigurasikan di file phpunit.xml atau .env.testing.

๐Ÿ† Best Practices Testing Laravel PHPUnit yang Wajib Kamu Tahu

Menulis test itu seni, bukan sekadar formalitas. Ada beberapa prinsip yang membuat test kamu benar-benar bermanfaat, bukan sekadar menambah jumlah file di folder tests/.

๐ŸŽฏ
Prinsip AAA

Setiap test harus mengikuti pola Arrange → Act → Assert. Buat datanya, jalankan fungsinya, periksa hasilnya.

๐Ÿงฉ
Satu Test, Satu Hal

Setiap method test hanya menguji satu skenario. Jangan gabungkan 5 assertion berbeda dalam satu test.

๐Ÿญ
Pakai Model Factory

Gunakan Laravel Factory untuk generate data dummy. Lebih bersih daripada hardcode data di setiap test.

๐Ÿš€
Test Edge Cases

Jangan hanya test "happy path". Test juga input kosong, nilai ekstrem, dan kondisi error yang mungkin terjadi.

๐Ÿš€
Pro Tip

Integrasikan testing Laravel PHPUnit kamu ke pipeline CI/CD (GitHub Actions, GitLab CI, dll). Setiap push ke repository akan otomatis menjalankan semua test — aplikasi yang lolos CI dijamin jauh lebih stabil di production.

๐ŸŽ‰

Kesimpulan

Kita sudah menjelajahi dunia testing Laravel PHPUnit dari awal sampai akhir. Intinya:

  • Testing bukan opsional — di lingkungan profesional, ini adalah standar minimum.
  • Unit Test menguji fungsi terisolasi dengan cepat; Feature Test menguji alur lengkap aplikasi.
  • Ikuti prinsip AAA (Arrange-Act-Assert) dan beri nama test yang deskriptif.
  • Gunakan RefreshDatabase untuk Feature Test agar data selalu bersih.
  • Integrasikan ke CI/CD untuk otomasi yang sesungguhnya! ๐Ÿš€

Artikel ini adalah bagian dari 50 Artikel Belajar Laravel — seri terlengkap dalam bahasa Indonesia!

#Laravel #PHP #PHPUnit #UnitTest #FeatureTest #WebDevelopment #TDD

No comments:

Post a Comment

saifiahmada.com adalah blog belajar programming Indonesia, membahas lengkap materi bahasa pemrograman: code HTML, CSS, Bootstrap, Desain, PHP, MySQL, coding Java, Query, SQL, dan dunia linux