Bagaimana cara menggunakan unit test saat menggunakan BDD?

17

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"?

JSBach
sumber
Untuk itulah mengejek dan bertopik: untuk mengisolasi bagian-bagian yang sedang diuji.
Robert Harvey
Maaf, saya tidak mengerti. Maksudmu aku harus mengejek dispenser? Bagaimana saya mengujinya?
JSBach
Saat Anda menguji dispenser, Anda mengejek akun, kartu, dan pelanggan.
Robert Harvey
3
Mengapa Anda ingin menggabungkan tes unit dan "tes yang dibuat BA"? Gunakan TDD sebagai teknik untuk membuat tes unit untuk setiap bagian dari perangkat lunak Anda, dan tambahkan tes tambahan untuk menguji persyaratan dari sudut pandang BA (hubungi tes integrasi yang terakhir, jika Anda mau). Di mana Anda melihat kontradiksi?
Doc Brown
@DocBrown: Dengan "muncul secara alami," maksud saya bahwa beberapa TDD percaya bahwa desain perangkat lunak secara alami akan muncul dari unit test saat Anda "red-green-refactor." Percakapan obrolan yang sedang berlangsung tentang pertanyaan ini terjadi di Papan Tulis .
Robert Harvey

Jawaban:

27

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:

Scenario: Starting the car
    Given I am standing in front of the drivers door
    When I open the door
    Then the door should lift up DeLorean-style (yeah, baby!)
    When I get into the car
    And turn the key
    Then the engine roars to life

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.

Greg Burghardt
sumber
Apakah ada cara untuk menghubungkan tes "Gambar Besar" dengan tes "Gambar Kecil"? Maksud saya, ketika fitur berubah secara resmi (katakan skenario mentimun yang berubah), apakah ada cara untuk memetakan perubahan itu ke tes kelas bawah (katakanlah tes junit yang untuk skenario mentimun tertentu)?
Srikanth
Anda dapat memiliki metode pembantu dan pernyataan kustom yang dibagi antara tes "gambar besar" dan "gambar kecil", tetapi kemungkinan besar akan melibatkan pengaturan berbeda untuk menguji unit kode tertentu.
Nick McCurdy
[...] yang menurut BDD adalah Fitur dan Skenario yang ditulis dalam Mentimun. Anda menggabungkan prinsip dan perangkat.
jub0bs
Yah, ok, kata-katanya sedikit salah, tetapi intinya adalah perilaku aplikasi ditangkap dalam fitur dan skenario.
Greg Burghardt
9

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.

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.

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"?

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.

Jörg W Mittag
sumber
1

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.

Doc Brown
sumber
Sebagai titik cepat, Junit mendukung penamaan tes Anda apa saja; Anda hanya perlu menggunakan anotasi @Test. Itu mungkin tidak dilakukan pada tahun 2003.
soru
@soru Kembali pada tahun 2003 itu memang memberlakukan kata "test".
Lunivore
Penulis artikel ini adalah Dan North, yang muncul dengan konsep di tempat pertama. Salah satu hal yang dia perhatikan adalah bahwa kata "test" menyebabkan kita beralih ke pengujian implementasi kita (domain solusi) sedangkan sebenarnya, mengeksplorasi dan mendefinisikan tes harus benar-benar membuat kita tetap dalam domain masalah. Dan menggambarkan BDD sebagai "apa yang dimaksudkan TDD". Baca ini untuk info lebih lanjut: dannorth.net/2012/05/31/bdd-is-like-tdd-if
Lunivore