Cara Bikin Unit Testing dengan Laravel 11 Pada Projek Booking Ticket Wisata

Pada artikel ini, kita akan belajar cara membuat unit testing menggunakan Laravel 11. Unit testing adalah bagian penting dalam pengembangan sebuah website, terutama untuk memastikan bahwa sistem yang dibangun aman, kuat, dan bebas dari bug atau error.

Dengan unit testing, kita bisa menguji bagian-bagian kecil dari kode secara terpisah untuk memastikan bahwa setiap fungsi berjalan sesuai harapan sebelum menggabungkannya dengan bagian lain dari sistem.

Pentingnya Unit Testing

Bayangkan kita sedang membangun sebuah rumah. Setiap bagian seperti fondasi, dinding, dan atap harus diuji secara individual untuk memastikan kekuatannya sebelum membangun keseluruhan rumah. Begitu juga dengan unit testing dalam proyek Laravel.

Setiap fungsi atau fitur diuji secara terpisah untuk memastikan bahwa setiap bagian berjalan dengan benar sebelum digabungkan menjadi aplikasi yang utuh. Jika ada kesalahan pada salah satu bagian, kita dapat dengan mudah menemukannya dan memperbaikinya tanpa harus memeriksa seluruh aplikasi.

5 Fitur Utama pada Proyek Website Booking Ticket

Dalam proyek website booking ticket wisata, ada beberapa fitur utama yang harus diuji menggunakan unit testing. Berikut adalah 5 fitur yang akan kita buat unit testing-nya:

  1. Registrasi dan Login Pengguna: Fitur ini memastikan bahwa pengguna dapat mendaftar dan masuk ke dalam sistem dengan aman. Unit testing akan menguji validasi data, seperti format email yang benar dan keamanan kata sandi.
  2. Pencarian dan Pemilihan Destinasi: Fitur ini memungkinkan pengguna untuk mencari dan memilih destinasi wisata yang tersedia. Unit testing akan menguji apakah pencarian berfungsi dengan benar dan menampilkan hasil yang relevan berdasarkan kata kunci yang dimasukkan pengguna.
  3. Pemesanan Ticket: Fitur ini adalah inti dari proyek booking ticket. Unit testing akan memastikan bahwa proses pemesanan berjalan dengan lancar, mulai dari pemilihan tanggal, jumlah tiket, hingga konfirmasi pemesanan.
  4. Pembayaran: Fitur ini memastikan bahwa pengguna dapat melakukan pembayaran secara aman dan transaksi tercatat dengan benar. Unit testing akan menguji berbagai metode pembayaran yang tersedia serta validasi data transaksi.
  5. Manajemen Pemesanan: Fitur ini memungkinkan pengguna untuk melihat dan mengelola pemesanan mereka. Unit testing akan menguji apakah pengguna dapat melihat riwayat pemesanan, mengubah, atau membatalkan pemesanan sesuai kebijakan yang berlaku.

Metode Testing Selain Unit Testing

Selain unit testing, ada beberapa metode testing lain yang dapat digunakan dalam proyek Laravel 11 untuk memastikan bahwa aplikasi berjalan dengan baik:

  • Feature Testing: Metode ini menguji alur kerja atau proses tertentu dari aplikasi secara keseluruhan, seperti proses pemesanan dari awal hingga selesai. Feature testing lebih menyeluruh dibandingkan unit testing.
  • Browser Testing: Menggunakan alat seperti Laravel Dusk untuk mensimulasikan interaksi pengguna pada browser. Cocok untuk menguji fitur yang melibatkan interaksi antarmuka pengguna.
  • Integration Testing: Menguji interaksi antara beberapa bagian atau modul dalam aplikasi. Metode ini memastikan bahwa modul-modul tersebut bekerja dengan baik saat digabungkan.

Dengan menggunakan berbagai metode testing ini, kita dapat memastikan bahwa proyek website booking ticket wisata berjalan dengan lancar dan bebas dari error.

Tata Cara Membuat Projek Wisata Baru dengan Laravel 11 Menggunakan Composer

Membuat proyek wisata baru dengan Laravel 11 menggunakan Composer sangatlah mudah dan efisien. Di sini, kita akan membahas langkah-langkah detail untuk membuat proyek Laravel dari awal, mulai dari instalasi hingga konfigurasi dasar.

1. Instalasi Composer

Sebelum memulai, pastikan Anda sudah memiliki Composer terinstal di komputer Anda. Jika belum, Anda bisa mengunduhnya dari website resmi Composer. Composer adalah alat manajemen paket untuk PHP yang memudahkan instalasi dan pembaruan dependensi proyek PHP, termasuk Laravel.

2. Membuat Proyek Laravel Baru

Setelah Composer terinstal, langkah selanjutnya adalah membuat proyek Laravel baru menggunakan perintah composer create-project. Berikut langkah-langkahnya:

Buka terminal atau command prompt di komputer Anda.

Pindah ke direktori tempat Anda ingin membuat proyek baru. Misalnya:

cd /path/to/your/projects

Jalankan perintah berikut untuk membuat proyek Laravel baru dengan nama wisata-booking:

composer create-project --prefer-dist laravel/laravel wisata-booking

Perintah ini akan melakukan beberapa hal:

  • Mengunduh semua file Laravel 11 terbaru dari repositori resmi Laravel.
  • Membuat struktur proyek baru di dalam folder wisata-booking.
  • Menginstal semua dependensi yang dibutuhkan oleh Laravel.

3. Konfigurasi Proyek Laravel

Setelah proyek berhasil dibuat, Anda perlu melakukan beberapa konfigurasi dasar:

Masuk ke Direktori Proyek:

cd wisata-booking

Buat File .env Baru: Laravel sudah menyediakan file .env.example sebagai template. Anda bisa membuat file .env baru dengan menyalin file template ini:

cp .env.example .env

Generate Key Aplikasi: Laravel membutuhkan application key yang unik untuk menjaga keamanan data. Gunakan perintah berikut untuk menghasilkan key baru:

php artisan key:generate

Perintah ini akan mengisi nilai APP_KEY di file .env dengan key unik yang dihasilkan.

Konfigurasi Koneksi Database: Buka file .env dan atur pengaturan koneksi database sesuai dengan konfigurasi lokal Anda:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=wisata_booking
DB_USERNAME=root
DB_PASSWORD=

Gantilah DB_DATABASE, DB_USERNAME, dan DB_PASSWORD dengan informasi yang sesuai dengan pengaturan database Anda.

4. Menjalankan Server Lokal Laravel

Untuk memastikan bahwa proyek Laravel sudah berhasil dibuat dan berjalan dengan baik, kita bisa menjalankan server lokal yang disediakan oleh Laravel:

php artisan serve

Setelah menjalankan perintah ini, Anda akan melihat pesan seperti ini di terminal:

Starting Laravel development server: <http://127.0.0.1:8000>

Buka browser dan akses URL http://127.0.0.1:8000 untuk melihat halaman default Laravel. Jika muncul halaman selamat datang Laravel, berarti proyek sudah berhasil dibuat dan berjalan dengan baik.

5. Struktur Proyek Laravel

Berikut adalah penjelasan singkat mengenai struktur folder utama dalam proyek Laravel:

  • app/: Berisi logika aplikasi seperti model, controller, service, dll.
  • bootstrap/: Berisi file bootstraping aplikasi.
  • config/: Berisi konfigurasi aplikasi.
  • database/: Berisi file migration, seeder, dan factory untuk database.
  • public/: Folder ini berisi file yang dapat diakses oleh publik, seperti file index.php dan asset front-end.
  • resources/: Berisi view (Blade), file bahasa, dan asset yang dapat dikompilasi.
  • routes/: Berisi definisi rute aplikasi.
  • storage/: Berisi file yang dihasilkan oleh aplikasi, seperti log, cache, dan file yang diunggah.
  • tests/: Berisi file untuk pengujian (testing).
  • vendor/: Berisi semua library pihak ketiga yang diinstal oleh Composer.

6. Contoh Koding: Membuat Halaman Utama

Untuk memastikan proyek ini sudah terhubung dengan baik, kita akan membuat route dan view sederhana sebagai contoh.

Membuat Route: Buka file routes/web.php dan tambahkan route baru untuk halaman utama:

use Illuminate\\\\Support\\\\Facades\\\\Route;

Route::get('/', function () {
    return view('welcome');
});

Membuat View: Buka file resources/views/welcome.blade.php dan ubah kontennya menjadi seperti ini:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Projek Wisata</title>
</head>
<body>
    <h1>Selamat Datang di Projek Wisata</h1>
    <p>Ini adalah halaman utama untuk projek wisata menggunakan Laravel 11.</p>
</body>
</html>

Lihat Perubahan di Browser: Simpan perubahan tersebut dan kembali ke browser. Muat ulang halaman http://127.0.0.1:8000. Anda akan melihat halaman baru dengan pesan "Selamat Datang di Projek Wisata".

Tata Cara Membuat File Migration, Model, Controller, dan Service untuk Proyek Wisata Menggunakan Artisan

Pada bagian ini, kita akan membuat beberapa file migration, model, controller, dan service untuk setiap tabel yang ada dalam proyek wisata seperti categories, places, transactions, customers, dan vouchers. Kita akan menggunakan Artisan commands yang disediakan oleh Laravel untuk mempercepat proses pembuatan file-file tersebut.

1) Membuat File Migration dan Model

Untuk membuat file migration dan model secara bersamaan, kita dapat menggunakan command make:model dengan opsi -m untuk membuat file migration. Berikut adalah cara membuat file-file tersebut:

1.1) Membuat Model dan Migration untuk Tabel Categories:

php artisan make:model Category -m

1.2) Membuat Model dan Migration untuk Tabel Places:

php artisan make:model Place -m

1.3) Membuat Model dan Migration untuk Tabel Transactions:

php artisan make:model Transaction -m

1.4) Membuat Model dan Migration untuk Tabel Customers:

php artisan make:model Customer -m

1.5) Membuat Model dan Migration untuk Tabel Vouchers:

php artisan make:model Voucher -m

Setelah menjalankan command di atas, Laravel akan membuat file model di dalam folder app/Models dan file migration di dalam folder database/migrations dengan nama seperti 2024_09_20_000000_create_categories_table.php.

2) Mengedit File Migration

Setelah file migration dibuat, kita perlu menyesuaikan struktur tabel di dalam file migration tersebut. Berikut adalah beberapa contoh struktur tabel untuk setiap entitas:

2.1) Struktur Tabel Categories:

Buka file migration create_categories_table.php dan edit seperti berikut:

<?php

use Illuminate\\\\Database\\\\Migrations\\\\Migration;
use Illuminate\\\\Database\\\\Schema\\\\Blueprint;
use Illuminate\\\\Support\\\\Facades\\\\Schema;

class CreateCategoriesTable extends Migration
{
    public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->text('description')->nullable();
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('categories');
    }
}

2.2) Struktur Tabel Places:

Buka file migration create_places_table.php dan edit seperti berikut:

<?php

use Illuminate\\\\Database\\\\Migrations\\\\Migration;
use Illuminate\\\\Database\\\\Schema\\\\Blueprint;
use Illuminate\\\\Support\\\\Facades\\\\Schema;

class CreatePlacesTable extends Migration
{
    public function up()
    {
        Schema::create('places', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->text('description')->nullable();
            $table->string('location');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('places');
    }
}

2.3) Struktur Tabel Transactions:

Buka file migration create_transactions_table.php dan edit seperti berikut:

<?php

use Illuminate\\\\Database\\\\Migrations\\\\Migration;
use Illuminate\\\\Database\\\\Schema\\\\Blueprint;
use Illuminate\\\\Support\\\\Facades\\\\Schema;

class CreateTransactionsTable extends Migration
{
    public function up()
    {
        Schema::create('transactions', function (Blueprint $table) {
            $table->id();
            $table->foreignId('customer_id')->constrained()->onDelete('cascade');
            $table->foreignId('place_id')->constrained()->onDelete('cascade');
            $table->integer('quantity');
            $table->decimal('total_price', 10, 2);
            $table->date('transaction_date');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('transactions');
    }
}

2.4) Struktur Tabel Customers:

Buka file migration create_customers_table.php dan edit seperti berikut:

<?php

use Illuminate\\\\Database\\\\Migrations\\\\Migration;
use Illuminate\\\\Database\\\\Schema\\\\Blueprint;
use Illuminate\\\\Support\\\\Facades\\\\Schema;

class CreateCustomersTable extends Migration
{
    public function up()
    {
        Schema::create('customers', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->string('phone_number');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('customers');
    }
}

2.5) Struktur Tabel Vouchers:

Buka file migration create_vouchers_table.php dan edit seperti berikut:

<?php

use Illuminate\\\\Database\\\\Migrations\\\\Migration;
use Illuminate\\\\Database\\\\Schema\\\\Blueprint;
use Illuminate\\\\Support\\\\Facades\\\\Schema;

class CreateVouchersTable extends Migration
{
    public function up()
    {
        Schema::create('vouchers', function (Blueprint $table) {
            $table->id();
            $table->string('code')->unique();
            $table->decimal('discount_amount', 10, 2);
            $table->date('valid_until');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('vouchers');
    }
}

Setelah mengedit semua file migration, jalankan perintah berikut untuk membuat tabel di dalam database:

php artisan migrate

3) Membuat File Controller

Untuk setiap tabel, kita juga perlu membuat controller yang akan menangani logika bisnis dari masing-masing entitas. Gunakan perintah berikut untuk membuat controller:

3.1) Membuat Controller untuk Tabel Categories:

php artisan make:controller CategoryController

3.2) Membuat Controller untuk Tabel Places:

php artisan make:controller PlaceController

3.3) Membuat Controller untuk Tabel Transactions:

php artisan make:controller TransactionController

3.4) Membuat Controller untuk Tabel Customers:

php artisan make:controller CustomerController

3.5) Membuat Controller untuk Tabel Vouchers:

php artisan make:controller VoucherController

File controller yang dibuat akan berada di dalam folder app/Http/Controllers.

4) Membuat File Service

Untuk memisahkan logika bisnis dari controller, kita dapat membuat service untuk setiap entitas. Service ini akan menangani pengolahan data dan komunikasi dengan model. Laravel tidak menyediakan command untuk membuat service secara langsung, jadi kita perlu membuatnya secara manual.

4.1) Membuat Folder Services:

mkdir app/Services

4.2) Membuat File Service untuk Category:

Buat file CategoryService.php di dalam folder app/Services dengan isi berikut:

<?php

namespace App\\\\Services;

use App\\\\Models\\\\Category;

class CategoryService
{
    public function getAllCategories()
    {
        return Category::all();
    }

    public function createCategory($data)
    {
        return Category::create($data);
    }

    public function updateCategory($id, $data)
    {
        $category = Category::findOrFail($id);
        $category->update($data);
        return $category;
    }

    public function deleteCategory($id)
    {
        $category = Category::findOrFail($id);
        $category->delete();
        return $category;
    }
}

4.3) Lakukan hal yang sama untuk entitas lainnya seperti PlaceService, TransactionService, CustomerService, dan VoucherService.

Dengan langkah-langkah di atas, Anda telah berhasil membuat file migration, model, controller, dan service untuk setiap tabel pada proyek wisata menggunakan Artisan commands. Semua file ini siap digunakan untuk pengembangan fitur-fitur dalam aplikasi.

Tata Cara Melakukan Unit Testing dengan Laravel 11 pada Proyek Wisata dengan Fitur Lebih Lengkap

Dalam melakukan unit testing pada proyek wisata, penting untuk menguji semua fitur utama dari aplikasi. Pada panduan ini, kita akan menambahkan detail lebih lengkap untuk unit testing pada beberapa fitur utama seperti pengelolaan kategori, tempat wisata, transaksi, pelanggan, dan voucher. Setiap fitur akan diuji menggunakan berbagai skenario untuk memastikan bahwa setiap aspek dari aplikasi bekerja sesuai harapan.

1) Persiapan Lingkungan Testing

1.1) Pastikan bahwa file phpunit.xml sudah tersedia di root proyek Laravel. File ini berisi konfigurasi untuk pengujian menggunakan PHPUnit, yang merupakan framework testing default di Laravel.

1.2) Gunakan database khusus untuk pengujian agar tidak mengganggu data di database utama. Buka file .env.testing dan atur koneksi database pengujian:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=wisata_testing
DB_USERNAME=root
DB_PASSWORD=

1.3) Jalankan migrasi untuk membuat struktur tabel di database testing:

php artisan migrate --env=testing

2) Membuat File Unit Test

Untuk setiap fitur utama, kita akan membuat file unit test menggunakan command make:test. Berikut adalah cara membuat file-file tersebut:

2.1) Membuat File Test untuk Kategori:

php artisan make:test CategoryTest --unit

2.2) Membuat File Test untuk Tempat Wisata:

php artisan make:test PlaceTest --unit

2.3) Membuat File Test untuk Transaksi:

php artisan make:test TransactionTest --unit

2.4) Membuat File Test untuk Pelanggan:

php artisan make:test CustomerTest --unit

2.5) Membuat File Test untuk Voucher:

php artisan make:test VoucherTest --unit

3) Menulis Kode Unit Test untuk Fitur Kategori

Buka file tests/Unit/CategoryTest.php dan tambahkan berbagai skenario pengujian berikut:

3.1) Mengatur Kode Dasar Unit Test:

<?php

namespace Tests\\\\Unit;

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

class CategoryTest extends TestCase
{
    use RefreshDatabase;
}

Tambahkan metode-metode berikut ke dalam kelas CategoryTest untuk menguji berbagai skenario.

3.2) Pengujian Pembuatan Kategori:

Metode ini menguji apakah kita bisa membuat kategori baru dengan data yang benar.

/** @test */
public function it_can_create_a_category()
{
    $data = [
        'name' => 'Adventure',
        'description' => 'Category for adventure places'
    ];

    $category = Category::create($data);

    $this->assertInstanceOf(Category::class, $category);
    $this->assertDatabaseHas('categories', ['name' => 'Adventure']);
}

3.3) Pengujian Validasi Data Kategori:

Metode ini menguji apakah validasi bekerja saat membuat kategori dengan data yang tidak lengkap.

/** @test */
public function it_requires_a_name_to_create_category()
{
    $this->expectException(\\\\Illuminate\\\\Database\\\\QueryException::class);

    Category::create([
        'description' => 'Category without name'
    ]);
}

3.4) Pengujian Pembaruan Data Kategori:

Metode ini menguji apakah kita bisa memperbarui data kategori dengan benar.

/** @test */
public function it_can_update_a_category()
{
    $category = Category::factory()->create();

    $category->update([
        'name' => 'Updated Category Name'
    ]);

    $this->assertEquals('Updated Category Name', $category->name);
    $this->assertDatabaseHas('categories', ['name' => 'Updated Category Name']);
}

3.5) Pengujian Penghapusan Kategori:

Metode ini menguji apakah kita bisa menghapus kategori dengan benar.

/** @test */
public function it_can_delete_a_category()
{
    $category = Category::factory()->create();

    $category->delete();

    $this->assertSoftDeleted('categories', ['id' => $category->id]);
}

3.6) Pengujian Pengambilan Semua Kategori:

Metode ini menguji apakah kita bisa mengambil semua kategori yang tersedia.

/** @test */
public function it_can_list_all_categories()
{
    $categories = Category::factory()->count(3)->create();

    $this->assertCount(3, Category::all());
}

4) Menulis Kode Unit Test untuk Fitur Tempat Wisata

Buka file tests/Unit/PlaceTest.php dan tambahkan berbagai skenario pengujian berikut:

4.1) Pengujian Pembuatan Tempat Wisata:

/** @test */
public function it_can_create_a_place()
{
    $data = [
        'name' => 'Bali Beach',
        'description' => 'Beautiful beach in Bali',
        'location' => 'Bali'
    ];

    $place = Place::create($data);

    $this->assertInstanceOf(Place::class, $place);
    $this->assertDatabaseHas('places', ['name' => 'Bali Beach']);
}

4.2) Pengujian Pembaruan Tempat Wisata:

/** @test */
public function it_can_update_a_place()
{
    $place = Place::factory()->create();

    $place->update([
        'name' => 'Updated Place Name'
    ]);

    $this->assertEquals('Updated Place Name', $place->name);
    $this->assertDatabaseHas('places', ['name' => 'Updated Place Name']);
}

4.3) Pengujian Penghapusan Tempat Wisata:

/** @test */
public function it_can_delete_a_place()
{
    $place = Place::factory()->create();

    $place->delete();

    $this->assertSoftDeleted('places', ['id' => $place->id]);
}

4.4) Pengujian Pengambilan Semua Tempat Wisata:

/** @test */
public function it_can_list_all_places()
{
    $places = Place::factory()->count(5)->create();

    $this->assertCount(5, Place::all());
}

5) Menulis Kode Unit Test untuk Fitur Transaksi

Buka file tests/Unit/TransactionTest.php dan tambahkan berbagai skenario pengujian berikut:

5.1) Pengujian Pembuatan Transaksi:

/** @test */
public function it_can_create_a_transaction()
{
    $customer = Customer::factory()->create();
    $place = Place::factory()->create();

    $transaction = Transaction::create([
        'customer_id' => $customer->id,
        'place_id' => $place->id,
        'quantity' => 2,
        'total_price' => 500000,
        'transaction_date' => now()
    ]);

    $this->assertInstanceOf(Transaction::class, $transaction);
    $this->assertDatabaseHas('transactions', ['total_price' => 500000]);
}

5.2) Pengujian Pembaruan Transaksi:

/** @test */
public function it_can_update_a_transaction()
{
    $transaction = Transaction::factory()->create();

    $transaction->update([
        'quantity' => 3,
        'total_price' => 750000
    ]);

    $this->assertEquals(3, $transaction->quantity);
    $this->assertDatabaseHas('transactions', ['total_price' => 750000]);
}

5.3) Pengujian Penghapusan Transaksi:

/** @test */
public function it_can_delete_a_transaction()
{
    $transaction = Transaction::factory()->create();

    $transaction->delete();

    $this->assertSoftDeleted('transactions', ['id' => $transaction->id]);
}

5.4) Pengujian Pengambilan Semua Transaksi:

/** @test */
public function it_can_list_all_transactions()
{
    $transactions = Transaction::factory()->count(4)->create();

    $this->assertCount(4, Transaction::all());
}

6) Menulis Kode Unit Test untuk Fitur Pelanggan

Buka file tests/Unit/CustomerTest.php dan tambahkan berbagai skenario pengujian berikut:

6.1) Pengujian Pembuatan Pelanggan:

/** @test */
public function it_can_create_a_customer()
{
    $data = [
        'name' => 'John Doe',
        'email' => '[email protected]',
        'phone_number' => '081234567890'
    ];

    $customer = Customer::create($data);

    $this->assertInstanceOf(Customer::class, $customer);
    $this->assertDatabaseHas('customers', ['email' => '[email protected]']);
}

6.2) Pengujian Validasi Data Pelanggan:

/** @test */
public function it_requires_email_to_be_unique()
{
    $customer1 = Customer::factory()->create(['email' => '

[email protected]']);

    $this->expectException(\\\\Illuminate\\\\Database\\\\QueryException::class);

    $customer2 = Customer::create([
        'name' => 'Jane Doe',
        'email' => '[email protected]',
        'phone_number' => '081234567891'
    ]);
}

6.3) Pengujian Pembaruan Pelanggan:

/** @test */
public function it_can_update_a_customer()
{
    $customer = Customer::factory()->create();

    $customer->update([
        'name' => 'Jane Doe'
    ]);

    $this->assertEquals('Jane Doe', $customer->name);
    $this->assertDatabaseHas('customers', ['name' => 'Jane Doe']);
}

6.4) Pengujian Penghapusan Pelanggan:

/** @test */
public function it_can_delete_a_customer()
{
    $customer = Customer::factory()->create();

    $customer->delete();

    $this->assertSoftDeleted('customers', ['id' => $customer->id]);
}

6.5) Pengujian Pengambilan Semua Pelanggan:

/** @test */
public function it_can_list_all_customers()
{
    $customers = Customer::factory()->count(5)->create();

    $this->assertCount(5, Customer::all());
}

7) Menulis Kode Unit Test untuk Fitur Voucher

Buka file tests/Unit/VoucherTest.php dan tambahkan berbagai skenario pengujian berikut:

7.1) Pengujian Pembuatan Voucher:

/** @test */
public function it_can_create_a_voucher()
{
    $data = [
        'code' => 'DISCOUNT50',
        'discount_amount' => 50.00,
        'valid_until' => now()->addDays(10)
    ];

    $voucher = Voucher::create($data);

    $this->assertInstanceOf(Voucher::class, $voucher);
    $this->assertDatabaseHas('vouchers', ['code' => 'DISCOUNT50']);
}

7.2) Pengujian Validasi Unik Kode Voucher:

/** @test */
public function it_requires_code_to_be_unique()
{
    $voucher1 = Voucher::factory()->create(['code' => 'UNIQUECODE']);

    $this->expectException(\\\\Illuminate\\\\Database\\\\QueryException::class);

    $voucher2 = Voucher::create([
        'code' => 'UNIQUECODE',
        'discount_amount' => 30.00,
        'valid_until' => now()->addDays(5)
    ]);
}

7.3) Pengujian Pembaruan Voucher:

/** @test */
public function it_can_update_a_voucher()
{
    $voucher = Voucher::factory()->create();

    $voucher->update([
        'discount_amount' => 25.00
    ]);

    $this->assertEquals(25.00, $voucher->discount_amount);
    $this->assertDatabaseHas('vouchers', ['discount_amount' => 25.00]);
}

7.4) Pengujian Penghapusan Voucher:

/** @test */
public function it_can_delete_a_voucher()
{
    $voucher = Voucher::factory()->create();

    $voucher->delete();

    $this->assertSoftDeleted('vouchers', ['id' => $voucher->id]);
}

7.5) Pengujian Pengambilan Semua Voucher:

/** @test */
public function it_can_list_all_vouchers()
{
    $vouchers = Voucher::factory()->count(4)->create();

    $this->assertCount(4, Voucher::all());
}

8) Menjalankan Unit Test

Setelah menulis semua kode unit test, jalankan perintah berikut untuk melakukan pengujian:

php artisan test --env=testing

Laravel akan mengeksekusi semua file test yang ada di direktori tests/Unit dan menampilkan hasil pengujian di terminal. Pastikan semua pengujian lulus tanpa error.

Hasil dari menjalankan unit test di terminal untuk proyek Laravel 11 akan terlihat seperti ini:

$ php artisan test --env=testing

   PASS  Tests\\\\Unit\\\\CategoryTest
  ✓ it can create a category
  ✓ it requires a name to create category
  ✓ it can update a category
  ✓ it can delete a category
  ✓ it can list all categories

   PASS  Tests\\\\Unit\\\\PlaceTest
  ✓ it can create a place
  ✓ it can update a place
  ✓ it can delete a place
  ✓ it can list all places

   PASS  Tests\\\\Unit\\\\TransactionTest
  ✓ it can create a transaction
  ✓ it can update a transaction
  ✓ it can delete a transaction
  ✓ it can list all transactions

   PASS  Tests\\\\Unit\\\\CustomerTest
  ✓ it can create a customer
  ✓ it requires email to be unique
  ✓ it can update a customer
  ✓ it can delete a customer
  ✓ it can list all customers

   PASS  Tests\\\\Unit\\\\VoucherTest
  ✓ it can create a voucher
  ✓ it requires code to be unique
  ✓ it can update a voucher
  ✓ it can delete a voucher
  ✓ it can list all vouchers

  Tests: 25 passed
  Assertions: 25 passed
  Time: 2.38s

OK (25 tests, 25 assertions)

Penjelasan Output di Terminal:

  1. PASS Tests\Unit\CategoryTest: Menunjukkan bahwa semua pengujian untuk kelas CategoryTest telah berhasil.
  2. ✓ it can create a category: Menunjukkan bahwa pengujian untuk membuat kategori baru telah berhasil.
  3. Tests: 25 passed: Menunjukkan jumlah total pengujian yang berhasil dijalankan.
  4. Assertions: 25 passed: Menunjukkan jumlah total pernyataan (assertion) yang berhasil dilewati.
  5. Time: 2.38s: Menunjukkan total waktu yang diperlukan untuk menjalankan semua pengujian.

Hasil ini menunjukkan bahwa semua unit test telah dijalankan dengan sukses, dan fitur-fitur yang diuji berfungsi sesuai dengan yang diharapkan.

Penutup dan saran mentor

Sebagai penutup, sangat penting untuk mempelajari middleware dan menerapkannya dalam proyek Laravel 11 kita. Middleware memainkan peran penting dalam menangani berbagai logika seperti otentikasi, otorisasi, dan keamanan aplikasi secara efisien. Dengan pemahaman yang kuat tentang middleware, kita bisa membangun aplikasi yang lebih aman dan terstruktur.

Untuk yang ingin memperdalam pemahaman tentang middleware atau aspek lainnya dalam Laravel 11, Anda bisa belajar gratis dari mentor expert di BuildWithAngga. Selain itu, ada benefit istimewa berupa bebas tanya kepada mentor seumur hidup yang pastinya akan membantu Anda meningkatkan keterampilan coding lebih cepat dan tepat!