TDD vs BDD: Perbedaan Utama, Satu Fitur Dibangun dengan Dua Cara dan Kapan Menggunakan Masing-masing

  1. Beranda
  2. Blog
  3. Uji Otomatisasi

Uji Otomatisasi

TDD vs BDD: Perbedaan Utama, Satu Fitur Dibangun dengan Dua Cara dan Kapan Menggunakan Masing-masingnya

TDD membantu pengembang merancang kode yang benar. BDD membantu seluruh tim menyepakati apa yang harus dilakukan perangkat lunak. Lihat fitur diskon yang sama yang dibuat dengan setiap pendekatan, dan pelajari bagaimana keduanya bekerja sama.

9 menit baca
TDD vs BDD: perbedaan utama, satu fitur dibangun dengan dua cara dan kapan menggunakan masing-masing fitur

Poin penting

  • TDD berarti menulis tes yang gagal terlebih dahulu, kemudian kode secukupnya untuk lulus, lalu membereskannya.
  • BDD menggambarkan perilaku dalam bahasa bersama, biasanya sebagai Diberikan, Kapan, Lalu.
  • TDD terutama memandu desain kode. BDD terutama membangun pemahaman bersama.
  • Mereka bukan saingan, dan banyak tim menggunakan BDD untuk fitur dan TDD untuk detail di bawah.

Perdebatan TDD vs BDD sering kali dibingkai sebagai pemilihan pihak. Kenyataannya, mereka menjawab pertanyaan yang berbeda. Pengembangan berbasis pengujian menanyakan apakah kode tersebut sesuai dengan keinginan pengembang, sedangkan pengembangan berbasis perilaku menanyakan apakah tim menyetujui apa yang harus dilakukan perangkat lunak.

Untuk membuat perbedaan menjadi nyata, kami membuat satu fitur diskon kecil pada setiap pendekatan. Kami menjalankan kode pada Python 3.13, menggunakan pustaka standar, dan hasil di bawah berasal dari proses tersebut. Bagian BDD menggunakan pelari kecil kita sendiri untuk menunjukkan mekanismenya, sehingga proyek nyata akan menggunakan alat seperti Mentimun atau berperilaku sebagai gantinya.

Jawaban singkatnya

Pengembangan berbasis pengujian (TDD) adalah praktik pengkodean. Anda menulis tes kecil yang gagal, lulus dengan kode paling sederhana, dan kemudian memperbaiki desainnya. Pengujian ditulis dalam kode, dan sebagian besar dilakukan oleh pengembang. Kent Beck mempopulerkan praktik ini.

Pembangunan berbasis perilaku (BDD) adalah praktik kolaborasi yang tumbuh dari TDD, dan Dan North yang memperkenalkan istilah tersebut. Pengembang, penguji, dan pebisnis sepakat mengenai contoh bagaimana sistem harus berperilaku, ditulis dalam bahasa sederhana, dan contoh tersebut kemudian dapat diotomatisasi.

TDD vs BDD berdampingan

Aspek TDD BDD
Fokus utama Kode yang benar dan dirancang dengan baik Pemahaman bersama tentang perilaku
Ditulis dalam Bahasa pemrograman Bahasa sederhana, seperti Gherkin
Ditulis oleh Pengembang Bisnis, QA, dan pengembang bersama-sama
Dapat dibaca oleh Pengembang Semua orang di tim
Tingkat tipikal Satuan Fitur atau penerimaan
Titik awal Tes yang gagal Percakapan dengan contoh
Siklus Merah, hijau, refaktorisasi Temukan, formulasikan, otomatisasi
Alat umum pytest, JUnit, Jest Mentimun, berperilaku, SpecFlow, Reqnroll

Fiturnya

Berikut aturan bisnis yang akan kami terapkan: Pesanan 1000 atau lebih mendapat diskon 10%. Anggota mendapat tambahan diskon 5% untuk pesanan tersebut.

Hal ini mungkin terdengar jelas, namun sudah menjadi hal yang ambigu. Apakah anggota yang membelanjakan 500 mendapat diskon 5%? Kalimatnya mengatakan “perintah itu”, jadi kita asumsikan tidak. Ingatlah hal itu, karena pertanyaan seperti inilah yang dirancang BDD untuk dilontarkan sejak dini.

Membangunnya dengan TDD

TDD mengikuti loop pendek yang dikenal sebagai red, green, refactor:

Langkah Apa yang kamu lakukan
Merah Tulis satu tes untuk perilaku yang belum ada, dan lihat tes tersebut gagal
Hijau Tulis kode paling sederhana yang membuatnya lolos
Refaktorisasi Perbaiki kodenya, jaga agar pengujian tetap hijau

Ini adalah pengujian kami, dengan satu pengujian untuk setiap aturan:

class DiscountTests(unittest.TestCase):
    def test_no_discount_below_1000(self):
        self.assertEqual(discount(999, False), 0)

    def test_ten_percent_from_1000(self):
        self.assertEqual(discount(1000, False), 100)

    def test_member_gets_extra_five_percent(self):
        self.assertEqual(discount(1000, True), 150)

Kami kemudian menulis kode dalam tiga tahap, menjalankan pengujian setelahnya. Sesi TDD yang ketat menambahkan satu tes pada satu waktu, dan ini menunjukkan perkembangan yang sama:

Tahap 1: hal paling sederhana

def discount(total, is_member):
    return 0

# 3 tests, 2 failed
#   test_member_gets_extra_five_percent
#   test_ten_percent_from_1000

Mengembalikan angka nol terlihat konyol, tetapi ini membuktikan bahwa pengujian tersebut sebenarnya bisa gagal, dan satu-satunya pengujian yang dilewatinya adalah aturan “tidak ada diskon”.

Tahap 2: tambahkan ambang batas

def discount(total, is_member):
    if total >= 1000:
        return total * 0.1
    return 0

# 3 tests, 1 failed
#   test_member_gets_extra_five_percent

Tahap 3: menambah anggota, dan membersihkan

def discount(total, is_member):
    rate = 0.1 if total >= 1000 else 0
    if is_member:
        rate += 0.05
    return round(total * rate, 2)

# 3 tests, 0 failed

Ketiganya lulus. Tapi bacalah versi ini dengan cermat. Ini memberi anggota yang membelanjakan 500 diskon 5%, yang menurut kami bukan maksud dari aturan tersebut. Tidak ada tes yang mencakup kasus itu, jadi tidak ada yang menandainya. TDD hanya melindungi perilaku yang ingin Anda uji. Itu adalah batasan nyata, dan alasan mengapa percakapan tentang contoh sangat penting.

Mengapa siklus itu penting

  • Merah membuktikan bahwa tes tersebut berhasil. Tes yang tidak pernah gagal belum tentu menguji apa pun.
  • Hijau membuat Anda tetap fokus. Anda hanya menulis kode yang diperlukan, yang membantu mencegah rekayasa berlebihan.
  • Refactor menjaga kualitas tetap tinggi. Pengujian memberi Anda kepercayaan diri untuk mengubah desain dengan aman.
  • Ini mempengaruhi desain. Kode yang sulit untuk diuji sering kali digabungkan terlalu erat, dan Anda langsung menyadarinya.

tutorial pytest kami menunjukkan cara yang lebih mudah untuk menulis pengujian seperti ini, dan analisis nilai batas menjelaskan mengapa kami memilih 999 dan 1000 sebagai nilai.

Membangunnya dengan BDD

BDD dimulai dengan percakapan, bukan dengan alat. Seringkali ini merupakan pertemuan singkat yang dikenal sebagai tiga sahabat, dengan staf produk, pengembang, dan penguji mendiskusikan contoh nyata:

Tester:  What about a member spending 500?
Product: Good question. No discount. It has to reach 1000 first.
Dev:     And exactly 1000 counts?
Product: Yes, 1000 or more.

Pertukaran yang satu itu akan menangkap masalah dalam kode TDD kami. Mereka kemudian mencatat contoh mereka dalam format terstruktur yang disebut Gherkin:

Feature: Order discounts

  Scenario: Member reaches the discount threshold
    Given a member with a cart worth 1000
    When they view the amount to pay
    Then the amount to pay is 850

  Scenario: Member below the threshold gets no discount
    Given a member with a cart worth 500
    When they view the amount to pay
    Then the amount to pay is 500
Kata kunci Tujuan
Diberikan Situasi awal
Kapan Tindakan atau peristiwa
Lalu Hasil yang diharapkan

Siapa pun di tim dapat membacanya dan berkata “ya, itu benar” atau “tidak, itu salah”. Meskipun Anda tidak pernah mengotomatiskannya, skenario tersebut telah memberikan hasil yang bermanfaat.

Menghubungkan langkah-langkah ke kode

Alat menghubungkan setiap baris bahasa sederhana ke suatu fungsi, yang disebut definisi langkah. Untuk menunjukkan idenya, kami sendiri yang menulis versi kecilnya dan menjalankan skenario pertama:

@step("a member with a cart worth 1000")
def given(ctx):
    ctx["cart"] = Cart(is_member=True)
    ctx["cart"].add(1000)

@step("they view the amount to pay")
def when(ctx):
    ctx["amount"] = ctx["cart"].payable()

@step("the amount to pay is 850")
def then(ctx):
    assert ctx["amount"] == 850

# ok Given a member with a cart worth 1000
# ok When they view the amount to pay
# ok Then the amount to pay is 850

Alat nyata menambahkan parameter, sehingga satu langkah dapat mencocokkan “1000” dan “500”, ditambah pelaporan. Hasilnya adalah dokumentasi langsung: deskripsi sederhana tentang sistem yang gagal total jika tidak lagi benar.

Tips: Nilai BDD terletak pada percakapan. Tim yang memiliki satu orang yang menulis Gherkin sendirian setelah kodenya selesai akan mendapatkan biaya alat tersebut, dan hampir tidak ada keuntungan yang didapat.

Menulis skenario yang bagus

Lemah Lebih baik
Ketika saya mengklik tombol dengan id "btn-77" Ketika saya menerapkan kupon
Maka hasilnya benar Maka jumlah yang harus dibayar adalah 850
Dua puluh langkah dalam satu skenario Satu perilaku per skenario
Menjelaskan layar Menjelaskan maksud bisnis

Skenario yang menjelaskan klik dan ID bidang terputus pada setiap desain ulang, dan pembaca bisnis berhenti membacanya. Simpan detail antarmuka pengguna dalam kode langkah. Skenario ini mirip dengan contoh dalam kasus uji vs skenario pengujian, dan sering digunakan dalam pengujian penerimaan pengguna juga.

Menggunakan keduanya secara bersamaan

Keduanya secara alami cocok dengan alur kerja “luar-dalam”:

  1. Tim menyetujui perilaku dan menulis skenario BDD. Gagal, karena belum ada.
  2. Pengembang menggunakan TDD untuk membangun unit kecil yang dibutuhkan.
  3. Pengujian unit berhasil, dan pada akhirnya skenario pun berhasil.
  4. Semuanya berjalan di pipa CI/CD Anda.

Pertahankan masing-masing pada level yang tepat. Anda harus memiliki beberapa skenario untuk perilaku penting, dan banyak pengujian unit cepat untuk detailnya. Panduan kami untuk pengujian unit vs integrasi mencakup keseimbangan.

Alat

Bahasa TDD (pengujian unit) BDD
ular piton paling kecil, paling unit berperilaku, pytest-bdd
JavaScript Bercanda, Vitest Cucumber.js
Jawa JUnit, UjiNG Mentimun-JVM
.NET xUnit, NUnit Daftar Ulang, SpecFlow

Kapan menggunakan masing-masing

TDD cocok ketika:

  • Anda menulis logika yang kompleks, seperti penetapan harga, penguraian, atau izin.
  • Anda sedang memperbaiki bug, karena Anda dapat mereproduksinya terlebih dahulu dengan pengujian yang gagal.
  • Anda sedang mengerjakan kode yang akan sering berubah.

BDD cocok ketika:

  • Aturan bisnis itu rumit, dan kesalahpahaman bisa berakibat buruk.
  • Orang-orang non-teknis akan benar-benar membaca dan mendiskusikan skenarionya.
  • Beberapa tim memerlukan definisi bersama tentang bagaimana sesuatu berperilaku.

Keduanya mungkin berlebihan ketika: Anda sedang menulis prototipe sekali pakai atau mengeksplorasi ide teknis yang tidak jelas. Banyak pengembang melakukan lonjakan terlebih dahulu, lalu menulis ulang dengan pengujian. Perkakas BDD juga merupakan investasi yang buruk jika tidak ada orang di luar bidang teknik yang melihat skenarionya. Dalam hal ini, tes biasa dengan nama baik lebih sederhana.

Kesalahan umum

  • Memperlakukan BDD sebagai alat pengujian. Mentimun tanpa kolaborasi hanyalah cara yang panjang untuk menulis tes.
  • Pengujian implementasi di TDD. Pengujian yang terkait dengan detail pribadi terhenti selama setiap refaktorisasi.
  • Melewatkan langkah refactor. Anda lulus tes di atas kode yang berantakan.
  • Menulis tes setelah kode dan menyebutnya TDD. Itu masih berguna, tetapi Anda kehilangan masukan desain.
  • Menulis terlalu banyak skenario UI. Ini menjadi lambat dan tidak stabil. Lihat tes yang tidak stabil.
  • Mengejar jumlah cakupan. Liputan yang baik masih belum memperhitungkan perilaku yang tidak dipertimbangkan oleh siapa pun, seperti yang ditunjukkan dalam contoh kami.

Penutup

TDD membantu Anda membangun sesuatu dengan benar, dan BDD membantu Anda membangun sesuatu yang benar. Contoh diskon kami menunjukkan kedua sisi: kode lulus semua pengujiannya, namun percakapan sederhana mengungkapkan asumsi yang salah. Cobalah pada fitur kecil Anda berikutnya. Tulis tiga contoh nyata dengan rekan kerja sebelum kode apa pun, lalu buatlah satu pengujian yang gagal dalam satu waktu.

Pertanyaan yang sering diajukan

Apa perbedaan utama antara TDD dan BDD?

TDD berfokus pada pengembang yang menulis pengujian kode yang gagal sebelum implementasi. BDD berfokus pada keseluruhan tim yang menyetujui perilaku menggunakan contoh bahasa sederhana.

Bisakah Anda menggunakan TDD dan BDD secara bersamaan?

Ya, dan banyak tim melakukannya. Skenario BDD menentukan fitur dari luar, dan TDD menggerakkan unit kode yang lebih kecil di bawahnya.

Apakah BDD lebih baik dari TDD?

Secara keseluruhan tidak ada yang lebih baik, karena keduanya memecahkan masalah yang berbeda. BDD membantu pemahaman bersama, dan TDD membantu dengan desain kode dan umpan balik yang cepat.

Apa itu ketimun?

Gherkin adalah format bahasa sederhana terstruktur untuk menulis skenario, menggunakan kata kunci seperti Diberikan, Kapan, dan Lalu. Alat seperti Mentimun dapat menjalankannya.

Apakah TDD memperlambat pengembangan?

Ini mungkin terasa lebih lambat pada awalnya, terutama saat belajar. Tim sering kali mendapatkan kembali waktu melalui lebih sedikit bug dan perubahan yang lebih aman, meskipun efeknya berbeda-beda tergantung proyek.

Teruslah belajar

Bekerja dengan Stack Quora

Butuh bantuan dengan pengujian, WordPress atau SEO?

Kami membantu tim mengirimkan perangkat lunak yang lebih baik dan mengembangkan situs mereka. Beritahu kami apa yang sedang Anda kerjakan dan kami akan menyarankan langkah selanjutnya yang jelas.

Teruslah membaca

Panduan lebih lanjut tentang pengujian, AI & pengembangan modern

Menikmati artikel ini? Pilih topik dan langsung masuk ke tutorial terbaru kami.

Kecerdasan buatan

Penjelasan Halusinasi AI: Mengapa Model Bahasa Memperbaiki Masalah dan Cara Menguranginya

Halusinasi AI menjelaskan: apa itu, mengapa model bahasa memproduksinya, tipe umum, cara menguranginya dengan landasan dan petunjuk, dan pemeriksaan…

Baca artikel →
DevOps

Penjelasan Variabel Lingkungan: File .env, Rahasia, dan Konfigurasi Dilakukan dengan Benar

Variabel lingkungan dijelaskan dengan contoh Python yang kami jalankan: membaca dan mengaturnya, mengapa setiap nilai berupa string, file .env, pewa…

Baca artikel →
Pengembangan perangkat lunak

Penjelasan Pembatasan Kecepatan API: Algoritma, Header, dan Penanganan 429 Kesalahan

Pembatasan laju API dijelaskan dengan simulasi yang kami jalankan: keranjang token, jendela tetap, jendela geser, respons 429, header batas laju, pe…

Baca artikel →
Otomatisasi pengujian

Mengejek dengan Python: unittest.mock, patch dan Kesalahan yang Membuat Tes Berbohong

Mengejek dengan Python dengan unittest.mock, menguji: Mock dan return_value, side_effect, menambal di mana nama digunakan, spesifikasi dan autospec,…

Baca artikel →
Pengujian perangkat lunak

Penjelasan Cakupan Kode: Cakupan Jalur vs Cabang dan Apa Arti 100% Sebenarnya

Cakupan kode dijelaskan dengan coverage.py yang sebenarnya dijalankan: cakupan garis, cabang dan kondisi, membaca laporan, mengapa cakupan 100% masi…

Baca artikel →
Basis data & SQL

DELETE vs TRUNCATE vs DROP dalam SQL: Perbedaan, Rollback dan Kapan Menggunakan Masing-Masing

DELETE vs TRUNCATE vs DROP dijelaskan dengan SQL yang diuji: apa yang dihapus, rollback, pemicu, reset identitas, kecepatan, dan perbedaan PostgreSQ…

Baca artikel →
Basis data & SQL

Penjelasan Tampilan SQL: Membuat, Menggunakan, dan Menghindari Kesalahan, Dengan Contoh

Tampilan SQL dijelaskan dengan kueri yang kami jalankan: membuat tampilan, hasil langsung, menyembunyikan kolom, kinerja, tampilan yang dapat diperb…

Baca artikel →
Pengembangan perangkat lunak

Antarmuka TypeScript vs Tipe: Perbedaan Nyata, Diuji Dengan Kompiler

Antarmuka TypeScript vs tipe, diperiksa dengan kompiler sebenarnya: apa yang bisa dilakukan keduanya, apa yang hanya bisa dilakukan satu orang, peng…

Baca artikel →
Pengembangan perangkat lunak

Penjelasan Python *args dan **kwargs: Fungsi Fleksibel Dengan Contoh Jelas

Python *args dan **kwargs dijelaskan dengan kode yang kami jalankan: pengepakan dan pembongkaran, urutan parameter, argumen hanya kata kunci dan pos…

Baca artikel →
Pengembangan perangkat lunak

Fungsi Python Lambda: Sintaks, Kegunaan Sebenarnya, dan Kapan Tidak Digunakan

Fungsi python lambda dijelaskan dengan kode yang kami jalankan: sintaksis, pengurutan dengan kunci, peta dan filter, penutupan, jebakan pengikatan a…

Baca artikel →
Kecerdasan buatan

Apa Itu Agen AI? Cara Kerjanya, Dengan Agent Loop Sederhana yang Dapat Anda Jalankan

Apa itu agen AI? Panduan sederhana tentang loop agen, alat, memori, dan pagar pembatas, dengan loop Python kecil yang kami jalankan, risiko nyata da…

Baca artikel →
DevOps

Pemantauan vs Observabilitas: Perbedaan Nyata, Dengan Log, Metrik, dan Jejak

Penjelasan pemantauan vs observabilitas: kegagalan yang diketahui dan tidak diketahui, log, metrik dan jejak, penelusuran insiden checkout, sinyal e…

Baca artikel →
DevOps

Volume Docker vs Bind Mounts: Pertahankan Data Kontainer dengan Cara yang Benar

Volume Docker vs pengikatan pengikat dijelaskan: mengapa data kontainer menghilang, volume yang diberi nama, pengikatan pengikatan, tmpfs, contoh Tu…

Baca artikel →
Otomatisasi pengujian

TDD vs BDD: Perbedaan Utama, Satu Fitur Dibangun dengan Dua Cara dan Kapan Menggunakan Masing-masing

TDD vs BDD dijelaskan dengan satu fitur diskon yang dibuat dengan dua cara: refactor merah-hijau dengan kode yang kami jalankan, skenario Mengingat-…

Baca artikel →
Pengembangan perangkat lunak

Git merge vs rebase: perbedaan, contoh, dan kapan memakai masing-masing

Git merge vs rebase dijelaskan dengan keluaran log nyata, tabel perbandingan, aturan emas rebase, dan alur kerja tim yang aman.

Baca artikel →
Pengembangan perangkat lunak

List Comprehension Python: Sintaks, Contoh, dan Kapan Harus Dihindari

List comprehension Python dijelaskan: sintaks, filter, if-else, perulangan bersarang, waktu yang diukur, dan kapan perulangan for biasa lebih baik.

Baca artikel →
Basis data & SQL

Penjelasan SQL JOIN dengan Contoh (Inner, Left, Right, Full)

Pahami SQL JOIN langkah demi langkah dengan tabel dan query contoh: INNER, LEFT, RIGHT, FULL, CROSS, dan SELF, plus kesalahan umum dan tips performa.

Baca artikel →