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
atauphpunit
, Laravel akan menggunakan koneksi database yang ditentukan untuk lingkungan pengujian. Ini biasanya diatur di file.env.testing
atau melalui konfigurasi di filephpunit.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
atauphpunit
) 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 filephpunit.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!