Pertanyaan tentang unit test vs integration test vs system test terkadang membingungkan bahkan developer berpengalaman. Tiga level pengujian ini membentuk fondasi kualitas perangkat lunak, namun tim seringkali menyalahgunakannya, menciptakan rangkaian pengujian yang terlalu dangkal atau sangat mahal untuk dipelihara. Memahami di mana setiap level cocok dalam strategi pengujian Anda bukanlah hal yang akademis, tetapi secara langsung berdampak pada seberapa cepat Anda dapat merilis dan seberapa yakin Anda dapat terhadap rilis Anda.
Panduan ini akan mengklarifikasi cakupan, tujuan, dan waktu dari setiap level pengujian, menunjukkan bagaimana mereka bekerja sama dalam piramida pengujian, dan juga menyediakan contoh-contoh praktis yang dapat Anda terapkan segera. Baik Anda mengembangkan microservice, monolit, atau API, penting untuk memahami unit test vs integration test vs system test.
Apa itu Pengujian Unit (Unit Testing)?
Pengujian unit memvalidasi bagian terkecil yang dapat diuji dari aplikasi Anda—fungsi, metode, atau kelas individual—dalam isolasi penuh. Tujuannya adalah untuk membuktikan bahwa setiap unit berfungsi dengan benar sesuai dengan spesifikasinya.
Cakupan dan Contoh
Pengujian unit memeriksa satu bagian logika tanpa dependensi. Berikut adalah contoh sederhana:
// Function under test
function calculateDiscount(price, discountPercent) {
if (discountPercent < 0 || discountPercent > 100) {
throw new Error('Invalid discount percentage');
}
return price * (discountPercent / 100);
}
// Unit test
describe('calculateDiscount', () => {
it('calculates 20% discount correctly', () => {
expect(calculateDiscount(100, 20)).toBe(20);
});
it('throws error for negative discount', () => {
expect(() => calculateDiscount(100, -5)).toThrow();
});
});
Perhatikan bahwa pengujian memberikan input dan memverifikasi output secara langsung—tidak melibatkan database, API, atau UI.
Keunggulan dan Kekurangan
Keunggulan:
- Eksekusi cepat (milidetik)
- Lokasi kegagalan yang tepat
- Mendorong desain modular
- Mudah dipelihara
- Berjalan pada setiap commit kode
Kekurangan:
- Tidak menangkap bug integrasi
- Mock dapat menyembunyikan masalah sebenarnya
- Biaya penulisan awal yang tinggi
- Tidak dapat menguji alur kerja pengguna
Apa itu Pengujian Integrasi (Integration Testing)?
Pengujian integrasi memverifikasi bahwa beberapa komponen bekerja sama dengan benar. Ini berfokus pada antarmuka antar unit—endpoint API, koneksi database, antrean pesan, dan interaksi layanan.
Cakupan dan Contoh
Berikut adalah pengujian integrasi untuk endpoint pendaftaran pengguna yang menyentuh database:
// Integration test for POST /api/users
describe('User Registration API', () => {
it('creates user and stores in database', async () => {
const userData = {
name: 'Test User',
email: 'test@example.com',
password: 'ValidPass123'
};
// Act: Call the actual API
const response = await axios.post('http://localhost:3000/api/users', userData);
// Assert: Check response AND database
expect(response.status).toBe(201);
expect(response.data).toHaveProperty('userId');
// Verify database state
const userInDb = await db.users.findByEmail('test@example.com');
expect(userInDb).toBeTruthy();
expect(userInDb.name).toBe('Test User');
});
});
Pengujian ini membuktikan bahwa API, logika bisnis, dan integrasi database bekerja sama.
Keunggulan dan Kekurangan
Keunggulan:
- Menangkap ketidakcocokan antarmuka
- Memvalidasi interaksi komponen yang sebenarnya
- Menguji aliran data yang sebenarnya
- Lebih realistis daripada pengujian unit
Kekurangan:
- Lebih lambat dari pengujian unit (detik)
- Lebih sulit untuk men-debug kegagalan
- Membutuhkan infrastruktur pengujian
- Gampang rapuh karena masalah waktu
Apa itu Pengujian Sistem (System Testing)?
Pengujian sistem memvalidasi sistem yang lengkap dan terintegrasi terhadap persyaratan bisnis. Ini memperlakukan aplikasi sebagai kotak hitam, menguji alur kerja end-to-end dari perspektif pengguna.
Cakupan dan Contoh
Pengujian sistem untuk alur kerja pembelian e-commerce:
// System test: Complete purchase flow
describe('E-commerce Purchase System', () => {
it('allows user to browse, add to cart, and checkout', async () => {
// Step 1: User registration
const user = await api.register('shopper@example.com', 'password');
// Step 2: Browse products
const products = await api.searchProducts('laptop');
expect(products.length).toBeGreaterThan(0);
// Step 3: Add to cart
await api.addToCart(user.token, products[0].id, 1);
// Step 4: Checkout
const order = await api.checkout(user.token, {
shippingAddress: '123 Main St',
paymentMethod: 'visa'
});
// Oracle: Verify complete order
expect(order.status).toBe('confirmed');
expect(order.total).toBeGreaterThan(0);
// Verify side effects
const inventory = await api.getInventory(products[0].id);
expect(inventory.stock).toBe(initialStock - 1);
});
});
Ini mencakup banyak API, database, dan layanan eksternal (gateway pembayaran).
Keunggulan dan Kekurangan
Keunggulan:
- Menguji alur kerja pengguna yang sebenarnya
- Memvalidasi persyaratan bisnis
- Menangkap masalah integrasi di seluruh lapisan
- Memberikan kepercayaan diri dalam rilis
Kekurangan:
- Sangat lambat (menit)
- Pengaturan dan pemeliharaan yang kompleks
- Gampang rapuh—mudah gagal dengan perubahan UI
- Sulit untuk mengisolasi penyebab kegagalan utama
Piramida Pengujian Perangkat Lunak: Hubungan Antara Ketiganya
Piramida pengujian memvisualisasikan bagaimana unit test vs integration test vs system test harus didistribusikan:
Pengujian Sistem (10%)
▲
Pengujian Integrasi (30%)
▲
Pengujian Unit (60%)
Lapisan Bawah (Pengujian Unit): Volume terbesar, eksekusi tercepat, berjalan terus-menerus
Lapisan Tengah (Pengujian Integrasi): Volume sedang, memvalidasi integrasi penting
Lapisan Atas (Pengujian Sistem): Volume terkecil, menguji alur kerja bisnis inti
Bentuk ini memastikan umpan balik yang cepat sambil mempertahankan kepercayaan diri. Balikkan piramida (banyak pengujian sistem, sedikit pengujian unit) dan rangkaian pengujian Anda akan menjadi lambat, rapuh, dan mahal.

Kapan Melakukan Setiap Pengujian: Integrasi Siklus Hidup
| Fase Pengembangan | Jenis Pengujian Utama | Frekuensi | Waktu Eksekusi |
|---|---|---|---|
| Penulisan kode | Pengujian unit | Pada setiap penyimpanan | < 1 detik |
| Permintaan tarik (Pull request) | Unit + Integrasi | Pra-commit | 1-5 menit |
| Pra-gabung (Pre-merge) | Integrasi + Sistem Terpilih | Pada persetujuan PR | 5-15 menit |
| Build malam (Nightly build) | Rangkaian lengkap (semua jenis) | Harian | 30-60 menit |
| Pra-rilis | Pengujian sistem + Pengujian asap (Smoke tests) | Sebelum deploy | 15-30 menit |
| Produksi | Pengujian asap + Pemantauan | Berkelanjutan | Waktu nyata |
Mendapatkan waktu yang tepat untuk unit test vs integration test vs system test mencegah hambatan sambil memastikan gerbang kualitas bermakna.
Tabel Perbandingan: Memilih Pengujian yang Tepat
| Faktor | Pengujian Unit | Pengujian Integrasi | Pengujian Sistem |
|---|---|---|---|
| Kecepatan | ⚡⚡⚡ Sangat Cepat | ⚡⚡ Sedang | ⚡ Lambat |
| Isolasi | Tinggi | Sedang | Rendah |
| Kemudahan Debugging | Mudah | Sedang | Sulit |
| Kepercayaan Diri | Rendah | Sedang | Tinggi |
| Pemeliharaan | Rendah | Sedang | Tinggi |
| Kapan Ditulis | Sebelum/selama pengkodean | Setelah unit berfungsi | Setelah integrasi |
| Siapa yang Menulis | Developer | Developer + QA | QA + Developer |
Contoh Praktis: Menguji Endpoint API
Mari kita lihat unit test vs integration test vs system test dalam aksi untuk endpoint POST /api/users:
Pengujian Unit (Menguji Logika Validasi)
// Test only the validation function
describe('validateUser', () => {
it('rejects invalid email', () => {
const result = validateUser({ email: 'invalid' });
expect(result.isValid).toBe(false);
expect(result.errors).toContain('Invalid email format');
});
});
Pengujian Integrasi (Menguji API + Database)
// Test API layer with real database
describe('POST /api/users integration', () => {
it('creates user in database', async () => {
const response = await request(app)
.post('/api/users')
.send({ name: 'Test', email: 'test@example.com' });
expect(response.status).toBe(201);
// Oracle: Verify database
const user = await db.users.findByEmail('test@example.com');
expect(user.name).toBe('Test');
});
});
Pengujian Sistem (Menguji Alur Kerja Lengkap)
// Test registration → login → profile update
describe('User management system', () => {
it('allows complete user lifecycle', async () => {
// Register
const reg = await api.post('/api/users', userData);
expect(reg.status).toBe(201);
// Login
const login = await api.post('/api/auth/login', credentials);
expect(login.data.token).toBeTruthy();
// Update profile
const update = await api.put('/api/users/me', updates, {
headers: { Authorization: `Bearer ${login.data.token}` }
});
expect(update.status).toBe(200);
// Verify final state
const profile = await api.get('/api/users/me', {
headers: { Authorization: `Bearer ${login.data.token}` }
});
expect(profile.data.name).toBe(updates.name);
});
});
Bagaimana Apidog Membantu Tim Dev dengan Pengujian API
Memahami unit test vs integration test vs system test sangat penting, tetapi mengimplementasikannya untuk API bisa jadi melelahkan. Apidog mengotomatiskan pekerjaan berat, terutama untuk pengujian integrasi dan sistem.
Pembuatan Oracle Pengujian Otomatis
Untuk pengujian integrasi, Apidog membuat oracle pengujian langsung dari spesifikasi OpenAPI Anda:
# Dari spesifikasi API Anda, Apidog menghasilkan:
Test: POST /api/users
Oracle 1: Status harus 201
Oracle 2: Respons harus sesuai skema Pengguna
Oracle 3: Header Lokasi harus ada
Oracle 4: Waktu respons < 500ms
Oracle 5: Kueri database mengembalikan pengguna yang dibuat
Ini menghilangkan definisi oracle manual dan menjaga pengujian tetap sinkron dengan kontrak API Anda.
Pembuat Pengujian Visual untuk Pengujian Sistem
Pengujian sistem alur kerja yang kompleks menjadi visual di Apidog:
Test: Complete User Onboarding
1. POST /api/users (create)
2. POST /api/auth/verify (email verification)
3. POST /api/auth/login (authenticate)
4. GET /api/dashboard (load data)
5. POST /api/preferences (set preferences)
Assertions at each step + final state validation
Anda membangun ini dengan menyeret dan menjatuhkan panggilan API, dengan Apidog menangani otentikasi, rantai data, dan asersi secara otomatis.

Integrasi CI/CD untuk Pengujian Berkelanjutan
Apidog menjalankan hierarki unit test vs integration test vs system test Anda di CI/CD:
# GitHub Actions pipeline
- name: Run Unit Tests
run: npm test:unit
- name: Run Apidog Integration Tests
run: apidog run --tags "@integration"
- name: Run Apidog System Tests
run: apidog run --tags "@system"
Ini memastikan setiap jenis pengujian berjalan pada tahap yang sesuai dengan hasil yang diposting langsung ke Slack atau email.

Visibilitas Cakupan Pengujian
Apidog menunjukkan API mana yang memiliki cakupan pengujian unit, integrasi, dan sistem:
| Endpoint | Unit | Integrasi | Sistem | Cakupan |
|---|---|---|---|---|
| POST /users | ✅ | ✅ | ✅ | 100% |
| GET /users/:id | ✅ | ✅ | ❌ | 67% |
| DELETE /users | ❌ | ✅ | ✅ | 67% |
Visibilitas ini membantu tim mengisi celah pengujian secara strategis.
Pertanyaan yang Sering Diajukan
Q1: Haruskah saya menulis pengujian unit untuk endpoint API?
Jawab: Endpoint API mengorkestrasikan logika—mereka harus memiliki pengujian integrasi. Logika bisnis di dalam endpoint harus diuji unit secara terpisah.
Q2: Berapa banyak pengujian integrasi yang cukup?
Jawab: Cakup semua jalur kritis dan skenario kesalahan. Aturan yang baik: jika bug dalam integrasi akan mencapai produksi, tulis pengujian untuk itu.
Q3: Apakah pengujian sistem sebanding dengan biaya pemeliharaannya?
Jawab: Ya, tetapi hanya untuk alur kerja bisnis inti. Batasi pengujian sistem hingga 10-20% fitur yang menghasilkan 80% nilai bisnis.
Q4: Bisakah Apidog menghasilkan pengujian unit?
Jawab: Tidak. Pengujian unit memerlukan pengetahuan tentang struktur kode internal. Apidog unggul dalam pengujian integrasi dan sistem di mana ia dapat mengamati perilaku API dari luar.
Q5: Jenis pengujian mana yang harus saya prioritaskan untuk proyek baru?
Jawab: Mulailah dengan pengujian unit (fondasi), tambahkan pengujian integrasi saat komponen terhubung, lalu tambahkan pengujian sistem untuk perjalanan pengguna yang kritis. Pendekatan piramida ini mencegah utang teknis.
Kesimpulan
Keputusan unit test vs integration test vs system test bukanlah tentang memilih salah satu di antara yang lain—ini tentang menerapkan masing-masing pada waktu dan proporsi yang tepat. Pengujian unit memberi Anda kecepatan dan presisi untuk pengembangan. Pengujian integrasi menangkap masalah koneksi yang dilewatkan oleh unit. Pengujian sistem memberikan kepercayaan diri bahwa seluruh produk berfungsi untuk pengguna.
Kuasai hierarki ini dan rangkaian pengujian Anda menjadi aset strategis daripada beban pemeliharaan. Mulailah dengan mengaudit distribusi pengujian Anda saat ini. Apakah Anda terbalik dengan terlalu banyak pengujian sistem yang lambat dan rapuh? Geser fokus ke bawah. Apakah Anda kehilangan cakupan integrasi yang kritis? Isi celah-celah itu.
Alat modern seperti Apidog membuat lapisan integrasi dan sistem jauh lebih mudah dikelola dengan mengotomatiskan pembuatan dan eksekusi pengujian. Ini memungkinkan Anda untuk mempertahankan bentuk piramida pengujian tanpa memperlambat kecepatan pengembangan. Kualitas menjadi hasil alami dari proses Anda, bukan fase terpisah yang menunda rilis.
Ingat: tujuannya bukan untuk menguji semuanya—melainkan untuk menguji hal yang tepat pada level yang tepat. Ketika unit test vs integration test vs system test jelas dalam strategi Anda, pengiriman menjadi dapat diprediksi, kepercayaan diri tumbuh, dan tim Anda menghabiskan lebih sedikit waktu memadamkan api dan lebih banyak waktu membangun nilai.
