Cara Bikin dan Melakukan Unit Testing dengan Laravel 11 Pada Projek Website Toko Buah Online

Dalam pengembangan perangkat lunak, selain membuat fitur CRUD atau sistem login, programmer juga wajib menyediakan dan melakukan unit testing. Bayangkan jika kita membuat sebuah resep masakan; kita perlu mencicipi setiap bahan untuk memastikan rasa yang pas. Begitu pula dengan unit testing, yang membantu tim untuk menguji coba fitur sebelum dirilis, memastikan semuanya berfungsi dengan baik dan mengurangi kemungkinan kesalahan di masa depan.

Di Laravel 11, melakukan unit testing menjadi sangat mudah. Laravel menyediakan berbagai alat dan fungsionalitas yang memungkinkan programmer untuk menulis dan menjalankan pengujian dengan cepat. Dengan bantuan framework ini, pengujian bisa dilakukan secara otomatis, sehingga pengembang dapat lebih fokus pada pengembangan fitur baru tanpa khawatir akan kesalahan yang mungkin ada.

Ketika membuat website jual buah online, ada beberapa fitur unggulan yang biasanya tersedia. Pertama, halaman produk yang menampilkan berbagai jenis buah dengan deskripsi dan harga. Kedua, keranjang belanja yang memungkinkan pengguna untuk menambahkan barang sebelum melakukan checkout.

Ketiga, sistem pembayaran yang aman untuk memudahkan transaksi. Keempat, pelacakan pesanan untuk memberi tahu pengguna tentang status pengiriman. Terakhir, fitur ulasan pengguna, yang memungkinkan pembeli memberikan feedback tentang produk yang mereka beli, meningkatkan kepercayaan pengguna lain.

Cara Membuat Proyek Laravel 11 Baru dengan Composer dan Mengatur .env untuk Unit Testing

Untuk memulai proyek Laravel 11 baru, pertama-tama pastikan Anda telah menginstal Composer di sistem Anda. Berikut adalah langkah-langkahnya:

Buka terminal atau command prompt, lalu jalankan perintah berikut untuk membuat proyek baru:

composer create-project laravel/laravel nama-proyek

Gantilah nama-proyek dengan nama yang Anda inginkan. Setelah proses selesai, masuk ke direktori proyek:

cd nama-proyek

Selanjutnya, Anda perlu mengatur file .env untuk konfigurasi database yang digunakan dalam unit testing. Buka file .env di editor teks Anda dan sesuaikan pengaturan database, misalnya:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nama_database
DB_USERNAME=root
DB_PASSWORD=password

Gantilah nilai-nilai di atas sesuai dengan konfigurasi database Anda.

Untuk menjalankan unit testing, pastikan Anda sudah membuat beberapa fitur atau model yang ingin diuji. Misalnya, jika Anda memiliki model Product, buatlah pengujian untuk memastikan model tersebut berfungsi dengan baik. Jalankan perintah berikut untuk membuat pengujian:

php artisan make:test ProductTest

Kemudian, buka file tests/Feature/ProductTest.php dan tambahkan kode berikut untuk menguji fitur produk:

<?php

namespace Tests\\\\Feature;

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

class ProductTest extends TestCase
{
    use RefreshDatabase;

    public function test_product_creation()
    {
        $response = $this->post('/api/products', [
            'name' => 'Apple',
            'price' => 2000,
        ]);

        $response->assertStatus(201);
        $this->assertDatabaseHas('products', [
            'name' => 'Apple',
            'price' => 2000,
        ]);
    }
}

Terakhir, jalankan pengujian dengan perintah berikut:

php artisan test

Dengan langkah-langkah di atas, Anda sudah berhasil membuat proyek Laravel 11 baru, mengatur file .env, dan melakukan unit testing pada fitur yang telah Anda buat.

Cara Membuat dan Mengatur File Unit Testing untuk Fitur-Fitur di Laravel 11

Untuk melakukan unit testing pada lima fitur utama website jual buah online, pertama-tama pastikan Anda sudah memiliki struktur database dan API endpoint yang sesuai. Berikut adalah cara membuat dan mengatur file unit testing untuk masing-masing fitur dengan contoh kode lengkap.

1. Pengujian Fitur Produk

Buat file test baru untuk menguji fitur produk:

php artisan make:test ProductTest

Buka file tests/Feature/ProductTest.php dan tambahkan kode berikut untuk menguji fitur produk, termasuk membuat dan memastikan produk tersimpan di database:

<?php

namespace Tests\\\\Feature;

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

class ProductTest extends TestCase
{
    use RefreshDatabase;

    public function test_create_product()
    {
        $response = $this->postJson('/api/products', [
            'name' => 'Apple',
            'price' => 10000,
            'stock' => 50,
        ]);

        $response->assertStatus(201);
        $this->assertDatabaseHas('products', [
            'name' => 'Apple',
            'price' => 10000,
        ]);
    }
}

2. Pengujian Fitur Keranjang Belanja

Buat file test baru untuk menguji fitur keranjang belanja:

php artisan make:test CartTest

Buka file tests/Feature/CartTest.php dan tambahkan kode berikut untuk menguji fitur menambah produk ke keranjang:

<?php

namespace Tests\\\\Feature;

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

class CartTest extends TestCase
{
    use RefreshDatabase;

    public function test_add_to_cart()
    {
        $product = Product::create([
            'name' => 'Banana',
            'price' => 5000,
            'stock' => 30,
        ]);

        $response = $this->postJson('/api/cart', [
            'product_id' => $product->id,
            'quantity' => 2,
        ]);

        $response->assertStatus(200)
                 ->assertJson([
                     'added' => true,
                     'product_id' => $product->id,
                     'quantity' => 2,
                 ]);
    }
}

3. Pengujian Fitur Pembayaran

Buat file test baru untuk menguji fitur pembayaran:

php artisan make:test PaymentTest

Buka file tests/Feature/PaymentTest.php dan tambahkan kode berikut untuk menguji fitur pembayaran:

<?php

namespace Tests\\\\Feature;

use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase;
use Tests\\\\TestCase;

class PaymentTest extends TestCase
{
    use RefreshDatabase;

    public function test_secure_payment()
    {
        $response = $this->postJson('/api/payment', [
            'amount' => 15000,
            'payment_method' => 'credit_card',
        ]);

        $response->assertStatus(200)
                 ->assertJson([
                     'payment_status' => 'success',
                 ]);
    }
}

4. Pengujian Fitur Pelacakan Pesanan

Buat file test baru untuk menguji fitur pelacakan pesanan:

php artisan make:test OrderTrackingTest

Buka file tests/Feature/OrderTrackingTest.php dan tambahkan kode berikut untuk menguji fitur pelacakan pesanan:

<?php

namespace Tests\\\\Feature;

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

class OrderTrackingTest extends TestCase
{
    use RefreshDatabase;

    public function test_order_tracking()
    {
        $order = Order::create([
            'user_id' => 1,
            'status' => 'shipped',
            'total' => 25000,
        ]);

        $response = $this->getJson('/api/orders/' . $order->id);

        $response->assertStatus(200)
                 ->assertJson([
                     'status' => 'shipped',
                 ]);
    }
}

5. Pengujian Fitur Ulasan Pengguna

Buat file test baru untuk menguji fitur ulasan pengguna:

php artisan make:test ReviewTest

Buka file tests/Feature/ReviewTest.php dan tambahkan kode berikut untuk menguji fitur ulasan pengguna:

<?php

namespace Tests\\\\Feature;

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

class ReviewTest extends TestCase
{
    use RefreshDatabase;

    public function test_user_review()
    {
        $product = Product::create([
            'name' => 'Grapes',
            'price' => 8000,
            'stock' => 20,
        ]);

        $response = $this->postJson('/api/reviews', [
            'product_id' => $product->id,
            'rating' => 5,
            'comment' => 'Excellent quality!',
        ]);

        $response->assertStatus(201)
                 ->assertJson([
                     'reviewed' => true,
                     'product_id' => $product->id,
                 ]);
    }
}

Setelah semua file pengujian selesai dibuat, jalankan perintah berikut untuk menjalankan semua pengujian:

php artisan test

Semua pengujian akan dijalankan, dan Anda akan melihat hasilnya di terminal. Dengan cara ini, Anda bisa memastikan bahwa setiap fitur di website toko buah online berfungsi sesuai dengan harapan.

Pengertian tentang RefreshDatabase

Menggunakan RefreshDatabase pada Laravel hanya akan memengaruhi database pengujian (testing) dan tidak akan menghapus atau memengaruhi data asli di server production Anda. Namun, penting untuk memahami bagaimana RefreshDatabase bekerja agar tidak terjadi kesalahpahaman.

Bagaimana RefreshDatabase Bekerja?

RefreshDatabase adalah trait yang digunakan pada pengujian Laravel untuk memastikan database dalam keadaan bersih setiap kali pengujian dijalankan. Trait ini akan menjalankan perintah migrate:fresh yang akan menghapus semua tabel di database dan kemudian membuat ulang tabel sesuai dengan migrasi yang ada.

  • Penggunaan Lokal atau Pengembangan: Saat Anda menjalankan pengujian secara lokal atau di lingkungan pengembangan, RefreshDatabase akan bekerja pada database pengujian yang ditentukan di file .env.testing atau di .env jika tidak ada konfigurasi khusus untuk testing.
  • Penggunaan di Production: Laravel tidak secara otomatis menggunakan database production untuk pengujian. Saat Anda menjalankan perintah php artisan test atau phpunit, Laravel akan menggunakan koneksi database yang ditentukan untuk lingkungan pengujian. Ini biasanya diatur di file .env.testing atau melalui konfigurasi di file phpunit.xml.

Apakah Data di Production Akan Hilang?

Tidak, data di server production Anda tidak akan terhapus jika:

  • Anda tidak menjalankan perintah pengujian (php artisan test atau phpunit) di lingkungan production.
  • Anda memastikan bahwa pengujian dilakukan dengan koneksi database yang terpisah dari database production, yang biasanya diatur dalam file .env.testing.

Tips untuk Keamanan Pengujian

  • Selalu Gunakan Koneksi Database Pengujian: Pastikan koneksi database untuk pengujian berbeda dengan koneksi database production. Anda bisa membuat database khusus untuk pengujian.
  • Cek Konfigurasi env: Pastikan Anda menggunakan file .env.testing atau pengaturan khusus di file phpunit.xml untuk koneksi database pengujian.
  • Jangan Jalankan php artisan test di Production: Hindari menjalankan pengujian di lingkungan production untuk menghindari risiko yang tidak perlu.

Dengan mengikuti praktik-praktik di atas, Anda dapat menggunakan RefreshDatabase dengan aman tanpa khawatir data production akan terpengaruh.

Kesalahan Umum dalam Melakukan Unit Testing di Laravel

Unit testing adalah bagian penting dari pengembangan aplikasi, namun seringkali terdapat kesalahan yang dilakukan oleh programmer, terutama bagi yang baru memulai. Berikut adalah tiga kesalahan umum saat melakukan unit testing di Laravel beserta contoh kode yang relevan.

Menggunakan Database Production untuk Pengujian

Salah satu kesalahan terbesar adalah menggunakan database production untuk menjalankan pengujian. Ini sangat berbahaya karena dapat menghapus atau memodifikasi data yang sebenarnya digunakan dalam aplikasi. Misalnya, jika menggunakan RefreshDatabase tanpa memastikan bahwa koneksi database sudah diset untuk pengujian, semua data di database production bisa terhapus.

Contoh kode yang salah:

use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase;
use Tests\\\\TestCase;

class ProductTest extends TestCase
{
    use RefreshDatabase;

    public function test_create_product()
    {
        // Jika koneksi menggunakan database production, ini akan menghapus semua data.
        $response = $this->post('/api/products', [
            'name' => 'Apple',
            'price' => 10000,
            'stock' => 50,
        ]);

        $response->assertStatus(201);
    }
}

Pastikan untuk menggunakan database khusus pengujian dengan menambahkan konfigurasi di file .env.testing seperti:

DB_CONNECTION=mysql_testing
DB_DATABASE=testing_database

Tidak Menggunakan Mocking untuk Layanan Eksternal

Ketika melakukan unit testing, penting untuk memisahkan pengujian dari dependensi luar, seperti API eksternal atau layanan pembayaran. Menghubungkan langsung ke layanan eksternal saat pengujian tidak hanya memperlambat proses, tetapi juga dapat menyebabkan hasil yang tidak konsisten.

Contoh kode yang salah:

class PaymentTest extends TestCase
{
    public function test_payment_process()
    {
        // Memanggil layanan pembayaran eksternal secara langsung.
        $response = $this->post('/api/payment', [
            'amount' => 15000,
            'payment_method' => 'credit_card',
        ]);

        $response->assertStatus(200);
    }
}

Untuk mengatasi ini, gunakan mocking atau fake service agar pengujian tetap cepat dan terisolasi:

class PaymentTest extends TestCase
{
    public function test_payment_process()
    {
        // Menggunakan mock untuk layanan pembayaran.
        $this->mock(PaymentService::class, function ($mock) {
            $mock->shouldReceive('process')
                 ->andReturn(['status' => 'success']);
        });

        $response = $this->post('/api/payment', [
            'amount' => 15000,
            'payment_method' => 'credit_card',
        ]);

        $response->assertStatus(200)
                 ->assertJson(['status' => 'success']);
    }
}

Menulis Pengujian Terlalu Kompleks atau Tidak Fokus

Pengujian unit seharusnya hanya menguji satu fungsi atau bagian kecil dari kode. Kesalahan yang umum adalah menulis pengujian yang terlalu kompleks, yang menguji beberapa fitur sekaligus, sehingga sulit menemukan penyebab kesalahan jika pengujian gagal.

Contoh kode yang salah:

class ComplexFeatureTest extends TestCase
{
    public function test_complex_feature()
    {
        // Menguji terlalu banyak hal dalam satu pengujian.
        $response = $this->post('/api/products', [
            'name' => 'Banana',
            'price' => 5000,
            'stock' => 30,
        ]);
        $response->assertStatus(201);

        $response = $this->post('/api/cart', [
            'product_id' => 1,
            'quantity' => 2,
        ]);
        $response->assertStatus(200);

        $response = $this->post('/api/payment', [
            'amount' => 10000,
            'payment_method' => 'credit_card',
        ]);
        $response->assertStatus(200);
    }
}

Untuk pengujian yang lebih baik, pisahkan pengujian menjadi beberapa bagian yang lebih kecil dan terfokus:

class ProductTest extends TestCase
{
    public function test_create_product()
    {
        $response = $this->post('/api/products', [
            'name' => 'Banana',
            'price' => 5000,
            'stock' => 30,
        ]);

        $response->assertStatus(201);
    }
}

class CartTest extends TestCase
{
    public function test_add_to_cart()
    {
        $product = Product::create([
            'name' => 'Banana',
            'price' => 5000,
            'stock' => 30,
        ]);

        $response = $this->post('/api/cart', [
            'product_id' => $product->id,
            'quantity' => 2,
        ]);

        $response->assertStatus(200);
    }
}

Penutup dan saran mentor

Laravel terus berkembang dan menjadi salah satu framework PHP yang paling populer berkat update fitur-fitur menarik yang memudahkan developer dalam mengembangkan aplikasi web dengan cepat dan efisien. Dengan komunitas yang besar dan dokumentasi yang lengkap, Laravel memberikan dukungan yang kuat bagi para programmer di seluruh dunia.

Untuk terus mengasah kemampuan Anda dalam menggunakan Laravel, pastikan untuk selalu memantau BuildWithAngga. Mereka sering mengupdate kelas-kelas gratis dengan studi kasus yang menarik dan dipandu oleh mentor berpengalaman. Selain itu, Anda juga akan mendapatkan akses seumur hidup untuk setiap kelas yang diikuti, sehingga Anda bisa belajar kapan saja tanpa batasan waktu. Terus belajar dan kembangkan keterampilan Anda bersama BuildWithAngga!