November 29, 2025 (5mo ago) — last updated March 27, 2026 (1mo ago)

Panduan Red‑Green‑Refactor TDD

Pelajari siklus Red‑Green‑Refactor TDD: langkah praktis, contoh React/TypeScript, dan manfaat bisnis untuk kode lebih bersih dan mudah dipelihara.

← Back to blog
Cover Image for Panduan Red‑Green‑Refactor TDD

Siklus Red‑Green‑Refactor TDD membantu Anda memecah pengembangan menjadi langkah kecil yang dapat diverifikasi: tulis tes yang gagal, buat kode minimal agar lulus, lalu rapikan. Panduan ini memberikan alur kerja praktis, contoh React/TypeScript, dan alasan bisnis untuk menerapkan TDD di tim Anda.

Panduan Red‑Green‑Refactor TDD

Ringkasan: Kuasai siklus Red‑Green‑Refactor TDD dengan alur langkah demi langkah, contoh React/TypeScript, dan alasan bisnis untuk menulis kode yang lebih bersih dan mudah dipelihara.

Pendahuluan

Siklus Red‑Green‑Refactor dalam Test‑Driven Development (TDD) adalah praktik desain yang disiplin: mulai dengan tes yang gagal (Red), tulis kode minimal untuk membuatnya lulus (Green), lalu perbaiki struktur kode (Refactor). Dengan pendekatan ini Anda memecah pekerjaan menjadi langkah kecil yang dapat diverifikasi, mengurangi risiko, dan meningkatkan kualitas perangkat lunak.

Lihat bagian selanjutnya untuk contoh praktis menggunakan React dan TypeScript, tips penerapan tim, serta alasan bisnis mengapa TDD layak diadopsi. Untuk navigasi cepat, gunakan tautan internal ke bagian utama: Irama TDD, Praktik, dan Perangkap Umum.

Irama Test‑Driven Development

Diagram buatan tangan yang menggambarkan siklus Red-Green-Refactor untuk alur kerja Test-Driven Development (TDD).

Banyak pengembang mengira TDD hanya soal pengujian, tetapi ini sebenarnya praktik desain. Menulis tes terlebih dahulu memaksa Anda berpikir tentang bagaimana kode akan digunakan sebelum implementasi. Pendekatan ini mendorong kemajuan kecil yang disengaja dan menjadikan refactor aman berkat jaring pengaman tes.

Memahami Tiga Tahap

Setiap tahap mempertahankan fokus dan menjaga pekerjaan tetap kecil serta dapat diverifikasi.

  • Fase Red (tes gagal): Tulis satu tes otomatis yang mewakili perilaku berguna terkecil.
  • Fase Green (buat lulus): Implementasikan kode paling sederhana untuk memenuhi tes.
  • Fase Refactor (perbaiki kode): Bersihkan penamaan, hilangkan duplikasi, dan perbaiki struktur tanpa mengubah perilaku.

Jangan melewatkan langkah refactor; melewatkannya menumpuk hutang teknis dan membuat perubahan di masa depan lebih sulit.

Red‑Green‑Refactor Sekilas

PhasePurposeDeveloper Goal
RedDefine the requirement and validate the testWrite one small test that fails
GreenSatisfy the requirementAdd the minimum code to make the test pass
RefactorImprove internal qualityClean up duplication and clarify intent

Mengadopsi irama ini membantu tim bergerak secara terprediksi dan percaya diri. Di beberapa wilayah, banyak tim telah memasukkan TDD ke dalam praktik mereka; pola adopsi dan hasil bervariasi menurut pasar dan organisasi1.

Menjalankan Siklus TDD dalam Praktik

Diagram tulisan tangan yang menggambarkan alur proses dengan ikon hati merah, sebuah kotak teks, dan ikon lingkaran hijau.

Contoh berikut membangun sebuah komponen LikeButton menggunakan TypeScript, React, dan Jest. Contoh ini menunjukkan bagaimana TDD membimbing desain sambil menjaga perilaku tetap dapat diprediksi.

Fase Red: mendefinisikan kebutuhan pertama

Kebutuhan paling sederhana: komponen dirender tanpa error dan menampilkan “Like.” Tulis tes sebelum komponen.

// LikeButton.test.tsx
import React from 'react';
import { render, screen } from '@testing-library/react';
import LikeButton from './LikeButton';

describe('LikeButton', () => {
  it('renders a button with the initial text "Like"', () => {
    render(<LikeButton />);
    const likeButton = screen.getByRole('button', { name: /like/i });
    expect(likeButton).toBeInTheDocument();
  });
});

Menjalankan tes akan gagal karena komponen belum ada. Inilah fase Red—tepat seperti yang kita inginkan.

Fase Green: cukup untuk membuat lulus

Buat komponen minimal untuk memenuhi tes.

// LikeButton.tsx
import React from 'react';

const LikeButton = () => {
  return <button>Like</button>;
};

export default LikeButton;

Jalankan tes lagi, dan tes lulus. Misi selesai untuk siklus ini.

Fase Refactor: poles implementasi

Sekarang bersihkan kodenya. Tambahkan tipe dan tetapkan pola untuk pengembangan di masa depan.

// LikeButton.tsx (refactored)
import React, { FC } from 'react';

type LikeButtonProps = {};

const LikeButton: FC<LikeButtonProps> = () => {
  return <button>Like</button>;
};

export default LikeButton;

Tes tetap lulus. Jaring pengaman memungkinkan Anda memperbaiki kode dengan percaya diri.

Contoh iterasi: mengeklik tombol

Kebutuhan baru: mengklik tombol mengubah teksnya menjadi “Liked” dan menonaktifkannya untuk mencegah klik berulang. Mulai dengan tes yang gagal.

// LikeButton.test.tsx
it('changes text to "Liked" and becomes disabled when clicked', () => {
  render(<LikeButton />);
  const likeButton = screen.getByRole('button', { name: /like/i });
  fireEvent.click(likeButton);
  expect(likeButton).toHaveTextContent('Liked');
  expect(likeButton).toBeDisabled();
});

Implementasikan perilaku minimal untuk membuat tes lulus.

// LikeButton.tsx
import React, { FC, useState } from 'react';

type LikeButtonProps = {};

const LikeButton: FC<LikeButtonProps> = () => {
  const [liked, setLiked] = useState(false);
  const handleClick = () => setLiked(true);
  return (
    <button onClick={handleClick} disabled={liked}>
      {liked ? 'Liked' : 'Like'}
    </button>
  );
};

export default LikeButton;

Jalankan rangkaian tes, semua hijau. Ulangi: satu kebutuhan kecil pada satu waktu, dilindungi oleh tes.

Alasan Bisnis untuk Kualitas Kode

Timbangan buatan tangan yang membandingkan pengembangan perangkat lunak tanpa TDD (banyak bug, berat) dengan dengan TDD (lebih sedikit masalah, lebih ringan).

Manfaat teknik TDD cepat diterjemahkan menjadi nilai bisnis: lebih sedikit cacat di produksi, biaya dukungan yang lebih rendah, dan reputasi produk yang lebih kuat. Praktik TDD yang disiplin dikaitkan dengan perbaikan kualitas dan pengurangan upaya debugging dalam studi empiris2.

Tim performa tinggi dalam laporan State of DevOps menunjukkan keuntungan nyata dari otomatisasi dan pengujian: mereka melakukan deploy jauh lebih sering dan memiliki lead time yang jauh lebih cepat, yang menekankan pentingnya mengotomatiskan pipeline dan menjalankan tes pada setiap commit3.

Mengurangi cacat pasca‑rilis dan biaya pemeliharaan

Dengan menulis tes sebelum kode, Anda hanya menambahkan kode produksi yang diperlukan untuk memenuhi tes. Ini menciptakan jaring pengaman yang kuat dan mengurangi regresi. Fokus pada kualitas sejak awal menurunkan total biaya kepemilikan perangkat lunak, karena Anda menghindari biaya majemuk dari hutang teknis.

Mempercepat onboarding dan meningkatkan prediktabilitas

Suite tes yang komprehensif berfungsi sebagai dokumentasi eksekusional. Pengembang baru dapat menjalankan tes untuk mempelajari perilaku yang diharapkan sistem daripada bergantung pada dokumentasi statis yang kadaluwarsa. Praktik TDD juga meningkatkan prediktabilitas dengan memecah pekerjaan menjadi siklus kecil yang dapat dipantau dan diukur1.

Perangkap Umum TDD dan Cara Menghindarinya

TDD mudah dijelaskan tetapi halus untuk dikuasai. Anti‑pola berikut sering merusak manfaat TDD.

Tes integrasi dalam pakaian tes unit

Masalah: Tes memeriksa terlalu banyak bagian sekaligus—komponen, layanan, klien API, dan bahkan database—membuat tes lambat dan rapuh.

Perbaikan: Uji satu unit secara terisolasi. Gunakan mock, stub, dan fake untuk dependensi eksternal. Tulislah tes integrasi terpisah untuk cakupan lintas‑komponen.

Menguji implementasi daripada perilaku

Masalah: Tes memeriksa detail internal sehingga rusak saat Anda merapikan internals, meskipun perilaku tetap benar.

Perbaikan: Uji API publik dan efek yang dapat diamati. Tes yang memverifikasi perilaku tahan terhadap refactor yang tidak terkait dan tetap menjadi dokumentasi yang berharga.

Melewatkan langkah refactor

Masalah: Pengembang buru‑buru ke fitur berikutnya setelah tes lulus, meninggalkan implementasi yang berantakan.

Perbaikan: Perlakukan refactor sebagai langkah wajib. Dengan tes yang lulus, pembersihan kecil aman dan akan terakumulasi menjadi basis kode yang mudah diubah.

Mengintegrasikan TDD ke dalam Tim dan Kode Legacy

Diagram tulisan tangan yang menunjukkan pengembang bekerja pada kode legacy dengan tes karakterisasi dan CI/CD.

Mengadopsi TDD adalah perubahan budaya sekaligus teknis. Dorong pembelajaran praktis, jadikan tes bagian dari Definition of Done, dan rayakan kemenangan yang didorong oleh tes.

Mengkampanyekan TDD dalam tim

Cara praktis untuk membangun momentum:

  • Pair programming, di mana pengembang berpengalaman membimbing rekan melalui siklus Red‑Green‑Refactor.
  • Mob programming untuk masalah yang kompleks, bergiliran siapa yang mengemudi agar pengetahuan tersebar.
  • Sesi lunch‑and‑learn yang mendemonstrasikan contoh TDD nyata dalam basis kode Anda.

Mulailah dari yang kecil, dan biarkan hasil awal dari tes menjadi bukti untuk tim.

Menjinakkan kode legacy dengan tes karakterisasi

Untuk kode tanpa tes, tulis tes karakterisasi yang mendokumentasikan perilaku saat ini. Tes ini memungkinkan Anda menambahkan fitur atau merapikan kode dengan lebih percaya diri.

Mengotomatiskan kualitas dengan pipeline CI/CD

Jalankan suite tes pada setiap commit di CI untuk umpan balik segera dan gerbang kualitas sebelum penggabungan. Otomasi menjaga loop umpan balik tetap cepat dan andal, sehingga refactor dan pengiriman fitur menjadi lebih aman.

Pertanyaan Teratas Anda tentang TDD, Dijawab

Apakah TDD menggantikan jenis pengujian lain?

Tidak. TDD menekankan tes unit sebagai alat desain, tetapi Anda tetap memerlukan tes integrasi dan end‑to‑end untuk memvalidasi interaksi komponen dan alur pengguna penuh.

Bagaimana cara menggunakan TDD dengan basis data atau API eksternal?

Pisahkan logika dari dependensi eksternal dan gunakan mock, stub, atau fake untuk pengujian unit. Sisakan tes integrasi nyata untuk rangkaian yang berbeda.

Apakah layak menguji komponen UI sederhana?

Ya—uji perilaku yang dapat diamati, bukan implementasi. Verifikasi apa yang dilihat dan dilakukan pengguna, seperti apakah tombol merender label yang benar atau memicu aksi saat diklik.

Tanya Jawab Singkat — Ringkasan Praktis

Q: Apa langkah terkecil untuk mulai TDD?

A: Mulai dengan satu fitur atau bug nonkritis: tulis tes gagal, buat kode minimal hingga lulus, lalu refactor.

Q: Bagaimana menghindari tes lambat dan rapuh?

A: Pisahkan tes unit dan tes integrasi; gunakan mock untuk dependensi eksternal.

Q: Kapan refactor harus dilakukan?

A: Segera setelah tes lulus di siklus yang sama—jadikan refactor sebagai langkah wajib.

1.
Digital.ai, “State of Agile Report,” Digital.ai, https://digital.ai/resource-center/state-of-agile-report
2.
Basili, Victor R., dan lainnya, “An Empirical Study on the Effects of Test-Driven Development,” https://link.springer.com/article/10.1007/s10664-015-9378-2
3.
Google Cloud, “State of DevOps Report,” https://cloud.google.com/devops/state-of-devops
4.
Martin Fowler, “TestDrivenDevelopment,” https://martinfowler.com/bliki/TestDrivenDevelopment.html
← Back to blog
🙋🏻‍♂️

AI menulis kode.
Anda membuatnya bertahan.

Di era akselerasi AI, kode bersih bukan hanya praktik yang baik — ini adalah perbedaan antara sistem yang berkembang dan codebase yang runtuh di bawah beratnya sendiri.