Pernah nggak, kamu udah capek-capek nulis ratusan baris kode Node.js, terus pas dijalankan… boom — error yang nggak kamu sangka. Yang bikin frustasi, bug itu baru ketahuan setelah aplikasi kamu live di production dan dipakai user beneran. Kalau kamu pernah ngalamin ini, berarti kamu butuh banget yang namanya testing Node.js.
Testing bukan cuma buat developer senior. Justru pemula yang baru belajar Node.js harus paham testing dari awal, biar kebiasaan menulis kode yang bisa diandalkan terbentuk sejak dini. Di artikel ini, kita bakal bahas tuntas cara pakai Jest unit test dan Supertest integration test Node.js — dua senjata andalan developer profesional untuk memastikan aplikasi berjalan sebagaimana mestinya.
"Testing bukan berarti kamu tidak percaya kodenya. Testing berarti kamu cukup profesional untuk membuktikan kodenya benar."
Unit Test — menguji satu fungsi/unit kecil secara terisolasi. | Integration Test — menguji bagaimana banyak komponen bekerja bersama (termasuk HTTP endpoint).
๐ค Apa Itu Testing dan Kenapa Penting di Node.js?
Bayangkan kamu lagi membangun jembatan. Sebelum jembatan itu dibuka untuk umum, insinyur pasti melakukan serangkaian uji coba: apakah bisa menahan beban sekian ton? Apakah material-nya tahan cuaca? Nah, testing di software prinsipnya persis sama — kamu menguji "jembatan" kodenya sebelum dipakai orang banyak.
Dalam ekosistem testing Node.js, ada dua jenis tes yang paling sering dipakai:
Unit Test vs Integration Test
| Aspek | Unit Test (Jest) | Integration Test (Supertest) |
|---|---|---|
| Fokus | Satu fungsi / modul kecil | Alur lengkap (route → controller → DB) |
| Kecepatan | ⚡ Sangat cepat | ๐ข Lebih lambat (buka server/DB) |
| Tool Utama | Jest | Supertest + Jest |
| Cocok untuk | Utility, helper, logic murni | API endpoint, middleware, auth |
| Isolasi | Ya — pakai mock/spy | Tidak sepenuhnya (perlu server) |
Menurut survei Stack Overflow Developer Survey, developer yang menulis automated testing melaporkan kepuasan kerja yang lebih tinggi karena mereka lebih percaya diri saat merilis fitur baru. Testing bukan beban — testing adalah superpowermu.
๐ Mulai dengan Jest: Panduan Unit Test Node.js Step by Step
Jest adalah testing framework buatan Meta (Facebook) yang paling populer di ekosistem JavaScript/Node.js. Ia punya semua yang kamu butuhkan: test runner, assertion library, hingga code coverage — semuanya dalam satu paket. Inilah cara memulai Jest unit test dari nol:
Instalasi Jest ke Project Node.js
Pastikan kamu sudah punya project Node.js dengan package.json. Lalu install Jest sebagai dev dependency:
npm install --save-dev jest # Lalu tambahkan script di package.json "scripts": { "test": "jest", "test:coverage": "jest --coverage" }
Buat File Fungsi yang Akan Diuji
Buat file src/math.js — fungsi sederhana yang akan kita tes:
// Fungsi helper sederhana function tambah(a, b) { return a + b; } function bagi(a, b) { if (b === 0) throw new Error('Tidak bisa bagi dengan nol!'); return a / b; } module.exports = { tambah, bagi };
Tulis File Test Pertamamu
Buat file src/math.test.js — Jest otomatis mendeteksi file *.test.js:
const { tambah, bagi } = require('./math'); // 'describe' mengelompokkan test yang berhubungan describe('Fungsi Math', () => { // 'test' atau 'it' mendefinisikan satu skenario uji test('tambah(2, 3) harus mengembalikan 5', () => { expect(tambah(2, 3)).toBe(5); }); test('tambah dengan angka negatif', () => { expect(tambah(-1, 1)).toBe(0); }); test('bagi dengan nol harus throw Error', () => { expect(() => bagi(10, 0)).toThrow('Tidak bisa bagi dengan nol!'); }); });
Jalankan Test
Ketik perintah ini di terminal, dan Jest akan menjalankan semua test:
npm test # Output yang diharapkan: PASS src/math.test.js Fungsi Math ✓ tambah(2, 3) harus mengembalikan 5 (3ms) ✓ tambah dengan angka negatif (1ms) ✓ bagi dengan nol harus throw Error (2ms) Tests: 3 passed, 3 total
Biasakan menulis nama test dengan format "[fungsi] harus [hasil yang diharapkan] ketika [kondisi]". Contoh: "fungsi login harus return token ketika kredensial valid". Test yang deskriptif akan jadi dokumentasi hidup proyekmu!
๐ Integration Test dengan Supertest: Uji API Node.js Secara Nyata
Kalau unit test itu seperti menguji setiap baut dan baut pada mesin secara terpisah, maka Supertest integration test Node.js itu seperti menghidupkan mesinnya dan lihat apakah semua komponen bekerja bersama dengan benar. Supertest memungkinkan kamu membuat request HTTP ke API Express-mu tanpa harus menjalankan server secara manual.
Instalasi Supertest
npm install --save-dev supertest
Pisahkan App dari Server
Ini pola penting! Pisahkan definisi app dari pemanggilan app.listen(). Ini agar Supertest bisa menggunakan app-nya tanpa benar-benar membuka port:
const express = require('express'); const app = express(); app.use(express.json()); app.get('/api/users', (req, res) => { res.json({ users: [{ id: 1, name: 'Budi' }] }); }); app.post('/api/users', (req, res) => { const { name } = req.body; if (!name) return res.status(400).json({ error: 'Nama wajib diisi' }); res.status(201).json({ id: 2, name }); }); module.exports = app; // ← export app, jangan listen di sini!
Tulis Integration Test dengan Supertest
const request = require('supertest'); const app = require('./app'); describe('GET /api/users', () => { test('harus mengembalikan daftar user dengan status 200', async () => { const res = await request(app).get('/api/users'); expect(res.statusCode).toBe(200); expect(res.body.users).toHaveLength(1); expect(res.body.users[0].name).toBe('Budi'); }); }); describe('POST /api/users', () => { test('harus berhasil membuat user baru', async () => { const res = await request(app) .post('/api/users') .send({ name: 'Siti' }); expect(res.statusCode).toBe(201); expect(res.body.name).toBe('Siti'); }); test('harus return 400 jika nama kosong', async () => { const res = await request(app) .post('/api/users') .send({}); expect(res.statusCode).toBe(400); expect(res.body.error).toBeDefined(); }); });
Perhatikan penggunaan async/await di integration test. Karena request HTTP bersifat asynchronous, kamu harus menggunakan async pada callback test dan await sebelum pemanggilan request. Tanpa itu, Jest bisa menganggap test sudah selesai sebelum response datang!
๐️ Cheat Sheet Matcher Jest yang Wajib Kamu Hafal
Jest punya puluhan matcher (fungsi seperti toBe, toEqual) untuk memverifikasi hasil. Ini yang paling sering kamu pakai dalam testing Node.js sehari-hari:
Jangan gunakan .toBe() untuk membandingkan object atau array! toBe menggunakan referensi memori (===), jadi {a:1} === {a:1} selalu false. Gunakan .toEqual() untuk membandingkan isi object/array.
Jalankan npm run test:coverage untuk lihat seberapa banyak kodemu yang sudah dicover oleh test. Jest akan menampilkan laporan persentase untuk setiap file. Usahakan coverage minimal 70-80% untuk aplikasi production!
Artikel ini adalah bagian ke-14 dari 16 artikel dalam seri lengkap belajar Node.js dari nol. Lihat daftar isi lengkap seri ini:
Kesimpulan
Menulis test bukan overhead — ini adalah investasi kualitas yang kamu bayar di awal agar tidak bayar mahal di production.
Sekarang giliran kamu! Coba tulis test pertamamu hari ini. Punya pertanyaan, bingung di bagian mana, atau punya pengalaman menarik soal testing? Tulis di kolom komentar ya! Dan kalau artikel ini bermanfaat, share ke teman-teman yang juga lagi belajar Node.js. ๐
๐ Lihat Semua Artikel Seri Node.js
No comments:
Post a Comment