Apakah Anda benar-benar harus melakukan BDD / TDD dalam ujian terlebih dahulu?

11

Meskipun saya belum pernah dalam proyek TDD atau BDD, atau saya pernah berada di beberapa yang mengatakan mereka melakukan TDD tetapi cukup jauh dari itu, ini adalah hal-hal yang saya pikirkan dan benar-benar mencoba membaca sebanyak yang saya bisa tentang.

Kembali ke pertanyaan. Ketika Anda melakukan BDD, Anda harus menulis "tes" terlebih dahulu dan membuatnya gagal, bukan? Dan kemudian mengimplementasikan fitur itu atau apa yang Anda sebut itu. Tetapi jika Anda menganggap ini ekstrem, bukankah ini semacam pengembangan top-down? Anda sedang melihat UI Anda dan berkata, "Saya ingin memiliki fitur / perilaku ini di sini". Kemudian Anda memperbaiki UI Anda untuk mengimplementasikan fitur itu dan kode yang mendukung UI. Pada titik ini Anda belum menerapkan logika bisnis atau logika akses data apa pun, Anda baru saja menerapkan perilaku Anda. Yang saya maksudkan alih-alih menulis tes terlebih dahulu Anda menulis kode UI Anda terlebih dahulu. Dalam beberapa kasus harus menghasilkan kode yang sama untuk akses data dan lapisan bisnis, karena Anda menggunakan kode UI untuk menentukan apa yang perlu didukung bisnis Anda.

Tentu saja Anda harus melengkapi ini dengan tes yang digunakan untuk memastikan bahwa fitur berfungsi sebagaimana mestinya dalam fitur.

Adakah pikiran?

Tomas Jansson
sumber
Tes di bawah TDD adalah tes unit , yang mengarahkan modul secara langsung, sama seperti jika itu melalui terpisah main. Dalam komentar top-down Anda, Anda berbicara tentang tes fungsional, yang menjalankan seluruh program melalui satu main.
Macneil
@ Macneil: Saya tidak berbicara tentang tes fungsional yang menguji seluruh program, bahkan berpikir Anda menerapkan / merancang program Anda dari atas ke bawah, Anda masih harus menerapkan uji unit untuk semua kode publik Anda. Hanya karena Anda melakukannya dari atas ke bawah, bukan berarti Anda tidak dapat membuat lapisan yang berbeda menjadi abstrak sehingga Anda dapat mengisolasi semua lapisan dengan sendirinya.
Tomas Jansson
1
@ Macneil: Ini adalah kesalahpahaman umum. Tes TDD bukan tes unit . Fitur tes TDD , yang tidak memiliki skala yang ditetapkan.
Steven A. Lowe
2
Tetapi ada skala yang ditetapkan: tes harus dijalankan dengan cepat dalam TDD. Ada tes yang harus terjadi yang juga di luar ruang lingkup TDD. Secara keseluruhan, TDD adalah rencana pengembangan, bukan rencana pengujian.
Macneil
@ Macneil: "cepat" adalah istilah yang relatif. Test suite dalam proyek terakhir saya dijalankan dalam waktu sekitar 30 menit. Ini menggantikan 8 jam pengujian manual. Itu "cukup cepat"!
Steven A. Lowe

Jawaban:

8

Anda berbicara tentang BDD dari perspektif tingkat tinggi dalam menguji UI Anda. Pengujian sedikit lebih lembut pada level ini daripada lebih rendah ke bawah dalam kode sisi Javascript / server Anda.

Beberapa buku yang saya baca di TDD mengatakan Anda harus menulis kode seolah-olah sistem yang mendasarinya ada, dan cukup menulis agar tes Anda lulus. Anda dapat menulis bertopik pada server untuk mendapatkan lulus tes perilaku UI Anda. Kemudian Anda mulai pada jahitan rintisan ini dan menulis beberapa tes unit untuk kode sisi server Anda dan turun ke implementasi penuh.

Saya sering memberi kode seolah-olah lapisan yang mendasarinya ada untuk mendapatkan tes tingkat tinggi untuk lulus, rasanya seperti turun ke lubang kelinci dan mengekstraksi banyak kelas lain untuk memenuhi tes tingkat tinggi, dan kemudian menulis tes untuk tingkat yang lebih rendah ini. Seperti yang sudah Anda kenali, ada baiknya Anda tetap fokus mulai dengan tes tingkat yang lebih tinggi.

Seperti yang diketahui oleh programmer berpengalaman, ada banyak lapisan untuk pengembangan perangkat lunak. Saya cenderung bekerja lebih rendah dari UI dan berpikir tentang data atau perilaku UI saya perlu dari server dan mulai di sana (mungkin karena saya tidak melakukan banyak pekerjaan UI hari ini).

Jika saya benar-benar jujur, mengekstraksi kelas dari lapisan yang mendasarinya berarti saya tidak melakukan tes terlebih dahulu tetapi ... dalam beberapa menit atau kadang-kadang jam saya akan memiliki tes untuk kode itu. Ini masih terasa bermanfaat bagi saya karena saya membantu melihat di mana Anda mungkin perlu menyediakan dependensi ke kelas dan menghormati prinsip tanggung jawab tunggal - jika sulit untuk menguji, Anda melakukan terlalu banyak di satu tempat dll.

Greg K.
sumber
Saya pikir kamu benar. Ini membuat saya ketika saya mencoba ruby ​​on rail musim panas ini, di sana mereka memiliki beberapa tes bdd yang mendorong UI yang kemudian mendorong implementasi kelas yang mendasarinya.
Tomas Jansson
17

Iya! Jika tidak, yang Anda dapatkan adalah pengujian yang digerakkan oleh pengembangan .

Secara realistis, ada beberapa masalah yang sulit untuk didekati dengan menggunakan TDD "murni". Anda bisa menjadi lebih produktif menulis dengan menulis beberapa kode produksi yang tidak terbuka di muka dan menutupinya dengan tes nanti (dan belajar bagaimana mendekati masalah yang sama dengan TDD di masa depan). Lihatlah teknik ini , yang penulisnya sebut bilas-dan-ulangi TDD karena ingin istilah yang lebih baik.

azheglov
sumber
3
Baris pertama luar biasa.
EpsilonVector
Dibandingkan dengan TDD itu benar, tetapi melakukan hal-hal top-down harus selaras dengan BDD, bukan? Saya melihat GUI dan menentukan perilaku yang saya inginkan, tentu saja saya tidak langsung menulis "tes perilaku", tetapi saya memang menentukan perilaku melalui UI sebelum saya menerapkannya.
Tomas Jansson
15

Jika Anda tidak menulis tes terlebih dahulu, Anda tidak mendorong pengembangan melalui tes Anda. Ergo, Anda tidak melakukan pengembangan berbasis tes!

Frank Shearar
sumber
Agar adil bukankah pertanyaannya lebih lanjut tentang apakah ketika melakukan BDD (bukan TDD) apakah kita harus menulis tes terlebih dahulu?
bytedev
Jangan ragu untuk mengganti "tes" dengan "perilaku". Saya belum melihat apa pun untuk meyakinkan saya bahwa, pada dasarnya, ada banyak perbedaan antara TDD dan BDD. Fokus, mungkin. Tetapi gagasan intinya? Tidak terlalu banyak.
Frank Shearar
Tidak setuju dengan kenyataan bahwa Anda tidak melakukan pengembangan berbasis tes. Anda tidak melakukannya sesuai dengan definisi istilah yang diketik, tetapi selama Anda mengembangkan tes untuk kode Anda, kode Anda pasti didorong oleh tes, terlepas dari kapan Anda menulisnya.
alternatif
TDD secara khusus berarti menulis tes sebelum kode. Jika Anda tidak suka itu, lanjutkan dengan Kent Beck, yang menemukan istilah itu. Menulis tes setelah kode Anda mungkin mendorong kode Anda untuk beberapa batas, tapi Anda masih bisa mengelabui diri sendiri menjadi percaya Anda mengemudi desain kode Anda melalui tes ketika Anda tidak. Dan lebih sulit untuk menulis tes itu, karena Anda sering harus mengubah kode yang belum diuji . Terlihat terlalu sering untuk disebutkan.
Frank Shearar
@ FrankShearar Saya mengakui bahwa itu bukan TDD sesuai dengan apa yang dikatakan Kent Beck, tapi terus terang saya tidak peduli dengan apa yang dikatakan oleh beberapa orang secara acak. Sangat mungkin untuk mengarahkan desain kode melalui tes tanpa menulis tes terlebih dahulu.
alternatif
4

Jika Anda ingin bekerja dengan cara ini, lakukan saja. Tapi ini bukan pengembangan yang digerakkan oleh tes.

Don Roby
sumber
3

Apa yang Anda gambarkan terdengar sangat mirip dengan pendekatan Desain Depan-Depan . Sayangnya, Front-Ahead Design adalah tusukan satiris Alex Papadimoulis pada metode gesit.

pengguna281377
sumber
Saya bertanya-tanya apakah Anda tahu ada artikel yang melawan FAD, menghilangkan prasangka yang menyebalkan?
CL22
3

Secara pribadi, saya percaya bahwa sangat penting untuk berpikir tentang pengujian selama tahap desain. Benar-benar hebat memiliki implementasi kerja, tetapi satu-satunya cara Anda dapat memastikan bahwa Anda memiliki produk yang berfungsi adalah jika Anda telah mengujinya sepotong demi sepotong. Cara untuk mengatasinya adalah dengan kombinasi tes Unit dan tim QA terampil yang bekerja dalam kemitraan.

Sekarang bagaimana Anda menginstal disiplin ini ke dalam tim Anda terserah Anda. TDD adalah salah satu strategi semacam itu - dan salah satu yang memiliki tempatnya, dan ada banyak variasi lainnya. Namun, TDD tidak terlalu cocok untuk mengembangkan tata letak UI.

Michael Shaw
sumber