Belajar unit testing, bagaimana cara mock bekerja? kenapa kita membutuhkannya, dan cara belajarnya.
sebelum kita melangkah lebih jauh, alangkah baiknya kita berkenalan dulu dengan unit test, dan juga beberapa metode yg di sering dipakai ketika membuat sebuah unit test. aku akan coba jelaskan dengan cara dan analogi yg sederhana
1. Apa Itu Unit Test?
Bayangin kamu lagi main lego, dan kamu pengen cek setiap bagian kecil dari lego itu, apakah udah pasangannya bener, kuat, dan gak gampang copot. Nah, unit test itu kayak kita ngecek satu-satu bagian legonya, biar nanti waktu digabungin, legonya gak mudah rusak.
2. Apa Itu Mocking?
Misalnya, kamu lagi pura-pura main dokter-dokteran, tapi kamu gak punya boneka pasien. Nah, kamu ambil bantal, kamu bilang, “Ini si boneka sakit, harus dikasih obat.” Di sini, bantal jadi boneka pura-pura atau mock. Jadi, mocking itu kita pura-pura bikin objek lain yang kelihatannya sama kayak aslinya, tapi sebenernya cuma mainan atau bohongan.
3. Kenapa Kita Butuh Mocking?
Kita butuh mocking biar:
- Gak Ribet: Kadang kalo pake objek asli, bikin test jadi ribet, kayak harus nyiapin banyak hal dulu.
- Lebih Cepet: Objek bohongan biasanya lebih cepet dipake daripada objek asli, apalagi kalo objek aslinya mesti nunggu data dari internet atau harus nanya orang dulu.
- Biar Testnya Simpel: Gak perlu nyiapin banyak hal yang sebenernya gak penting buat test kali itu, kita bisa fokus ke yang mau diuji aja.
4. Gimana Cara Kerja Mocking?
Cara kerja mocking itu kayak kamu bilang ke bantal tadi, “Kamu pura-pura jadi boneka yang sakit.” Terus kamu atur juga bantalnya: “Nanti kalo aku kasih obat, kamu pura-pura sembuh ya.” Di sini, kita bisa atur gimana si mock atau objek bohongan harus bertindak. Misalnya, kalo kita lagi nge-test aplikasi, kita bisa bilang ke si mock, “Kamu nanti pura-pura bilang data berhasil didapat dari internet,” padahal sebenernya gak ada data beneran.
5. Dasar-dasar yang Perlu Dipelajari
Nah, biar bisa jago unit test sama mocking, kamu perlu tau beberapa hal dasar dulu:
- Jenis-jenis Test Bohongan: Ada yang namanya mock, stub, sama spy. Ini beda-beda cara pakenya, kayak gimana caranya pura-pura yang pas buat situasi tertentu.
- Alat Buat Mocking: Biasanya kita pake tools yang udah disediain sama framework buat testing, kayak Jest. Misalnya, pake
jest.fn()
buat bikin fungsi bohongan. - Cara Struktur Test:
- Arrange: Siapin dulu semuanya kayak objek, mock, atau data yang dibutuhin.
- Act: Lakuin hal yang mau di-test.
- Assert: Cek apakah hasilnya sesuai sama yang diharapkan.
- Latihan Kasus: Latihan dulu dengan contoh-contoh sederhana, nanti baru pelan-pelan ke yang lebih rumit.
6. Contoh
Misalnya kamu lagi tes apakah boneka sakit bakal sembuh kalo dikasih obat:
// Fungsi asli yang mau kita test
async function getData() {
const data = await fetchData();
return data.value;
}
// Test buat fungsi getData
test('getData returns value from fetchData', async () => {
// Bikin mock function buat fetchData
const mockFetchData = jest.fn().mockResolvedValue({ value: 42 });
// Ganti fungsi asli dengan mock
fetchData = mockFetchData;
// Panggil fungsi yang mau di-test
const result = await getData();
// Cek apakah hasilnya sesuai harapan
expect(result).toBe(42);
// Cek apakah mock function dipanggil sekali
expect(mockFetchData).toHaveBeenCalledTimes(1);
});j
Di sini kita pura-purain fetchData
biar selalu kasih hasil { value: 42 }
, terus kita test apakah getData
bisa ngambil data itu beneran.
terus apa perbedaan Mock, Stub, dan juga Spy ?
1. Mock
Mock itu kayak objek atau fungsi bohongan yang kita atur supaya berperilaku sesuai sama skenario yang kita mau. Bayangin kamu lagi latihan acting, terus ada temen kamu yang pura-pura jadi karakter lain sesuai arahan sutradara.
Kasus dan Contoh Mock:
Misalnya, kamu punya aplikasi yang ngecek saldo bank lewat API. Tapi, kamu lagi mau test logika aplikasinya aja tanpa bener-bener ngecek API asli (soalnya API bisa lama atau bahkan bayar). Jadi kamu pake mock.
// Fungsi asli yang mau di-test
function cekSaldo(userId) {
return api.getUserBalance(userId); // Misalnya ini call ke API asli
}
// Test pakai mock
test('cekSaldo return balance dari api', () => {
const mockApi = {
getUserBalance: jest.fn().mockReturnValue(1000000) // Mock API-nya
};
const saldo = cekSaldo(123);
expect(saldo).toBe(1000000); // Ngecek kalo saldonya bener
expect(mockApi.getUserBalance).toHaveBeenCalledWith(123); // Ngecek kalo fungsi dipanggil sama userId 123
});
2. Stub
Stub itu mirip kayak mock, tapi lebih simpel. Biasanya kita pake buat ngasih respon spesifik tanpa perlu repot-repot ngerjain apa-apa lagi. Kayak pas kamu kasih jawaban ujian yang udah pasti bener ke temen, temen kamu gak perlu mikir lagi, tinggal salin aja.
Kasus dan Contoh Stub:
Misalnya, kamu lagi ngetest fungsi matematika yang butuh hasil dari fungsi lain, tapi hasil fungsi lain ini udah pasti. Jadi, kamu pake stub buat hasil yang udah pasti ini.
// Fungsi asli yang mau di-test
function hitungDiskon(harga, diskonPersen) {
const diskon = hitungPersen(harga, diskonPersen); // Misalnya ini fungsi lain
return harga - diskon;
}
// Test pakai stub
test('hitungDiskon ngasih diskon yang bener', () => {
const stubHitungPersen = jest.fn().mockReturnValue(5000); // Stub buat hitung diskon
const hargaAkhir = hitungDiskon(50000, 10);
expect(hargaAkhir).toBe(45000); // Ngecek kalo diskonnya bener 5000
expect(stubHitungPersen).toHaveBeenCalledWith(50000, 10); // Ngecek kalo fungsi dipanggil dengan parameter yang bener
});
3. Spy
Spy itu kayak detektif, tugasnya ngeliat dan ngerekam semua yang terjadi, tapi gak ngubah-ngubah apa yang sebenernya terjadi. Jadi, spy ngeliatin apakah fungsi bener-bener dipanggil, dengan argumen apa, dan berapa kali dipanggil, tapi dia gak ngubah hasil akhirnya.
Kasus dan Contoh Spy:
Misalnya, kamu lagi test aplikasi yang harus ngirim email pas pengguna daftar. Kamu pengen tau apakah fungsi ngirim email beneran dipanggil, tapi kamu gak mau beneran ngirim email tiap kali ngetest (bisa capek ngecek inbox terus).
// Fungsi asli yang mau di-test
function daftarUser(email) {
kirimEmail(email); // Misalnya ini fungsi buat ngirim email beneran
return 'User terdaftar!';
}
// Test pakai spy
test('daftarUser memanggil kirimEmail dengan email yang bener', () => {
const spyKirimEmail = jest.spyOn(global, 'kirimEmail'); // Spy buat ngeliatin fungsi
daftarUser('test@example.com');
expect(spyKirimEmail).toHaveBeenCalled(); // Ngecek apakah fungsi kirimEmail dipanggil
expect(spyKirimEmail).toHaveBeenCalledWith('test@example.com'); // Ngecek apakah dipanggil dengan email yang bener
});
Kapan Pake Mock, Stub, atau Spy?
- Pake Mock kalo kamu butuh objek atau fungsi bohongan yang bisa dikontrol sepenuhnya, kayak gimana outputnya atau gimana reaksinya terhadap input tertentu.
- Pake Stub kalo kamu cuma butuh ngasih output tertentu dari fungsi tanpa peduli logikanya.
- Pake Spy kalo kamu pengen tau apakah fungsi dipanggil, kapan, dan dengan apa, tapi gak pengen ngubah perilaku aslinya.