Saya mencoba memahami BDD. Saya sudah membaca beberapa artikel dan seperti yang saya mengerti BDD adalah "langkah selanjutnya" dari TDD. Saya mengatakan itu karena saya menemukan keduanya sangat mirip, dan seperti yang dapat saya baca di artikel ini , BDD lahir sebagai peningkatan dari TDD. Bagus, saya sangat suka ide itu.
Ada satu hal praktis yang tidak saya dapatkan, pikir: ada file .feature di mana BA akan menulis semua perilaku yang diharapkan di mana sistem akan memiliki. Sebagai seorang BA, ia tidak tahu bagaimana sistem dibangun, jadi kami akan menulis sesuatu seperti ini:
+ Skenario 1: Akun dikredit +
Mengingat akun dalam kredit
Dan kartunya valid
Dan dispenser itu berisi uang tunai
Ketika pelanggan meminta uang tunai
Kemudian pastikan akun didebit dan pastikan uang tunai dikeluarkan
Dan memastikan kartu dikembalikan
Ok, ini bagus, tetapi ada banyak bagian dari sistem yang akan berkolaborasi sehingga hal itu dapat terjadi (pikirkan keberatan Akun, keberatan Dispenser, keberatan Pelanggan, dan sebagainya). Bagi saya ini terlihat seperti tes integrasi.
Saya ingin mengadakan Tes Unit. Bagaimana saya menguji kode yang memeriksa apakah dispenser memiliki uang? Atau bahwa uang tunai dibagikan? Atau bahwa akun didebet saat diperlukan? Bagaimana saya bisa mencampur tes unit dengan tes "BA Created"?
sumber
Jawaban:
Pengembangan Perilaku Didorong dan Pengembangan Test Driven adalah gratis, tetapi bukan pengganti untuk satu sama lain.
Bagaimana aplikasi "berperilaku" dijelaskan dalam Tes Penerimaan, yang menurut BDD akan menjadi Fitur dan Skenario yang ditulis dalam Mentimun.
Seluk beluk detail tentang bagaimana masing-masing komponen kecil bekerja dijelaskan dalam Tes Unit. Hasil dari Tes Unit mendukung Skenario yang Anda tulis dalam Mentimun.
Bayangkan proses membangun mobil.
Pertama, tim produk memunculkan ide-ide mereka, dan akhirnya mendidihkannya ke skenario penggunaan:
Saya tahu skenario ini kedengarannya agak konyol, tetapi ini adalah persyaratan tingkat tinggi, produk dan kebutuhan pengguna akhir. Hanya dengan membuka pintu, memutar kunci dan menyalakan mesin melibatkan BANYAK komponen yang berbeda yang bekerja bersama. Tes yang satu ini tidak cukup untuk memastikan kendaraan bekerja dengan baik. Anda perlu menguji starter, baterai, alternator, kunci, saklar pengapian --- dan daftar berjalan --- hanya untuk masuk ke mobil dan memulainya. Masing-masing komponen membutuhkan tes mereka sendiri.
Skenario di atas adalah tes "Gambaran Besar". Setiap komponen kendaraan memerlukan tes "Gambar Kecil" untuk memastikan komponen berfungsi dengan baik di dalam keseluruhan.
Membangun dan menguji perangkat lunak adalah sama dalam banyak hal. Anda mendesain dari atas ke bawah, lalu membangun dari bawah ke atas. Mengapa ada pintu yang terangkat jika Anda bahkan tidak dapat menghidupkan mesin? Mengapa punya starter jika Anda tidak punya baterai?
Tim produk Anda akan membuat Tes Penerimaan dan menyempurnakannya di Mentimun. Ini memberi Anda "Gambaran Besar". Sekarang tergantung pada tim teknik untuk merancang komponen yang tepat, dan bagaimana mereka berinteraksi, kemudian menguji masing-masing secara terpisah --- ini adalah Tes Unit Anda.
Setelah Tes Unit berlalu, mulailah menerapkan skenario Mentimun. Setelah itu berlalu, Anda telah menyampaikan apa yang diminta oleh tim produk.
sumber
Sebenarnya, tidak, BDD bukan "langkah selanjutnya" dari TDD. Itu adalah TDD. Atau lebih tepatnya, ini adalah pengulangan ulang TDD.
Pencipta BDD memperhatikan bahwa rintangan utama untuk memahami bahwa TDD bukan tentang pengujian tetapi tentang spesifikasi perilaku adalah bahwa semua terminologi TDD adalah tentang pengujian dan bukan tentang spesifikasi perilaku. Ini seperti mencoba untuk tidak memikirkan gajah merah muda ketika seseorang berkata kepada Anda "cobalah untuk tidak memikirkan gajah merah muda", kecuali dengan komplikasi tambahan berada di ruangan yang penuh dengan gajah merah muda dan seorang pria terus-menerus berteriak "gajah merah muda, merah muda gajah, gajah merah muda "di telingamu.
Jadi, mereka mengulang TDD dalam hal spesifikasi perilaku. "Tes" dan "kasus uji" sekarang "contoh", "unit" adalah "perilaku", "pernyataan" adalah "harapan", dan sebagainya.
Namun, metodologinya masih sama. Anda mulai dengan tes penerimaan (maksud saya "fitur"), memperbesar tes unit (maksud saya "contoh"), memperkecil kembali dll.
Cara yang sama Anda lakukan di TDD. Anda dapat menulis fitur dan contoh Anda dalam kerangka kerja yang berbeda (misalnya Ketimun dan RSpec) atau bahkan bahasa yang berbeda (misalnya menulis contoh untuk proyek C di C, dan fitur di FIT / Fitnesse), Anda dapat menggunakan kerangka kerja fitur tunggal untuk keduanya ( misalnya menulis contoh dan fitur dalam Mentimun) atau Anda dapat menggunakan kerangka contoh tunggal untuk keduanya (misalnya menulis keduanya di RSpec). Anda bahkan tidak perlu menggunakan kerangka sama sekali.
Contoh dari TDD-done-right (yang identik dengan BDD) hanya menggunakan satu kerangka kerja adalah JUnit itu sendiri, yang berisi campuran tes unit (contoh) dan tes fungsional / integrasi (fitur), semua ditulis dalam JUnit sendiri.
Saya percaya Kent Beck menyebut ini "zooming". Mulai level tinggi, lalu "perbesar" ke detail, lalu mundur lagi.
sumber
Penafian: Saya bukan ahli dalam BDD, tapi saya mencoba memberikan sudut pandang saya pada artikel yang Anda tautkan.
TDD adalah teknik implementasi - Anda pertama kali menulis tes, kemudian Anda menerapkan metode, menjalankan tes Anda, refactor, dan menambahkan tes lebih lanjut untuk metode yang sama atau untuk metode baru. TDD sebenarnya tidak mendefinisikan aturan apa pun tentang cara memilih nama kelas atau metode, itu terserah Anda. TDD juga tidak memberi tahu Anda "ketika Anda selesai".
Jadi, setiap kali Anda menulis tes untuk metode baru, Anda harus memilih nama metode - dan itulah titik di mana BDD masuk. Dengan memilih nama metode menggunakan istilah bisnis dari skenario di atas, dan dengan memilihnya dengan cara menggambarkan perilaku kelas Anda, Anda melakukan BDD. Setiap kali Anda bertanya pada diri sendiri "apakah saya harus menambahkan tes lebih lanjut", Anda dapat melihat skenario yang diberikan oleh BA Anda dan memeriksa apakah Anda telah menerapkan semua bagian yang dibutuhkan, sepenuhnya. Jika tidak, Anda perlu menambahkan lebih banyak tes.
Penulis artikel juga menyarankan untuk menggunakan skema penamaan yang lebih berhubungan dengan perilaku ketika memilih nama tes Anda, itu sebabnya ia menyarankan untuk mengganti JUnit dengan alat yang tidak bergantung pada skema penamaan di mana setiap kasus uji harus dimulai dengan nama "tes". Meskipun saya tidak tahu JBehave, saya pikir itulah perbedaan utama antara alat itu dan Junit.
Selain itu, skenario BDD juga akan menjadi cetak biru untuk tes integrasi - yang biasanya akan Anda tambahkan setelah Anda menyempurnakan nama metode oleh TDD dan setelah Anda menambahkan jumlah unit test yang masuk akal.
Jadi, menurut pemahaman saya, TDD adalah instrumen yang dapat Anda gunakan sebagai bagian dari BDD, dan BDD membantu Anda untuk menulis tes yang tepat dan memberi mereka nama yang lebih baik.
sumber