Back to blog
Best Practice

Cara Menulis Kode yang Mudah Di-test Sejak Awal Tanpa Framework Testing Khusus

Kode yang mudah di-test bukan soal framework, tetapi soal cara berpikir saat menulis fungsi. Pelajari prinsipnya dari awal.

super admin·16 Juni 2026·3 min read
Cara Menulis Kode yang Mudah Di-test Sejak Awal Tanpa Framework Testing Khusus
Article Content

Testing bukan tentang framework, tetapi cara berpikir

Banyak developer menunda belajar testing karena merasa kodenya belum siap. Padahal kode yang mudah di-test dimulai dari cara menulis fungsi sejak awal, bukan dari framework testing yang dipilih. Artikel ini membahas prinsip-prinsip yang membuat kode lebih testable.

1. Pure function: output hanya bergantung pada input

Fungsi yang pure tidak bergantung pada state luar dan tidak menghasilkan side effect. Fungsi seperti ini sangat mudah di-test karena outputnya selalu sama untuk input yang sama.

// Tidak testable: bergantung pada state luar
function getDiscountedPrice() {
  return currentPrice * (1 - globalDiscount);
}

// Testable: semua input eksplisit
function getDiscountedPrice(price, discountRate) {
  return price * (1 - discountRate);
}

2. Pisahkan logic dari side effect

Side effect seperti HTTP request, database query, atau manipulasi DOM susah di-test secara langsung. Pisahkan logic bisnis dari side effect.

// Logic bisnis yang murni dan testable
function buildArticlePayload(formData, authorId) {
  return {
    title: formData.title.trim(),
    slug: formData.title.toLowerCase().replace(/\s+/g, '-'),
    authorId,
    publishedAt: new Date().toISOString(),
  };
}

// Side effect dipisah
async function publishArticle(formData, authorId) {
  const payload = buildArticlePayload(formData, authorId);
  return await apiClient.post('/articles', payload);
}

3. Satu fungsi, satu tanggung jawab

Fungsi yang melakukan terlalu banyak hal sulit di-test karena kamu perlu menyiapkan banyak kondisi sekaligus. Pecah menjadi fungsi-fungsi kecil yang masing-masing punya satu tanggung jawab jelas.

4. Dependency injection

Daripada membuat dependency di dalam fungsi, masukkan sebagai parameter. Ini memudahkan penggantian dependency dengan mock saat testing.

// Sulit di-test: database langsung di dalam fungsi
async function getUserProfile(userId) {
  return await prisma.user.findUnique({ where: { id: userId } });
}

// Mudah di-test: database diinjeksikan
async function getUserProfile(userId, db) {
  return await db.user.findUnique({ where: { id: userId } });
}

5. Hindari global state yang tersembunyi

Global state seperti variabel module-level yang berubah-ubah membuat test bisa saling mempengaruhi. Gunakan state yang dibawa melalui parameter atau context yang jelas.

6. Mulai dengan test manual yang terstruktur

Kalau belum pakai framework testing, bisa mulai dengan test manual yang terstruktur. Tulis fungsi kecil dan verifikasi outputnya di console. Kebiasaan berpikir seperti ini akan sangat membantu ketika kamu mulai menggunakan Jest atau Vitest.

// Test manual sederhana
const result = getDiscountedPrice(100000, 0.2);
console.assert(result === 80000, `Expected 80000, got ${result}`);

Kesimpulan

Kode yang mudah di-test adalah kode yang sudah dirancang dengan baik: fungsi kecil, pure jika memungkinkan, dependency yang eksplisit, dan side effect yang terisolasi. Mulai dari prinsip ini dan kamu akan siap menggunakan framework testing apapun tanpa perubahan besar pada arsitektur kode.

Mau langsung pakai template?

Jelajahi template gratis dan premium di TampilKit untuk mempercepat proses development project kamu.

Browse Templates