Saya bereksperimen dengan pengembangan yang digerakkan oleh tes, dan saya menemukan bahwa saya sering datang ke situasi berikut:
- Saya menulis tes untuk beberapa fungsionalitas X. Tes-tes itu gagal.
- Ketika mencoba mengimplementasikan X, saya melihat bahwa saya perlu mengimplementasikan beberapa fitur Y di lapisan bawah kode saya. Begitu...
- Saya menulis tes untuk Y. Sekarang kedua tes untuk X dan Y gagal.
Suatu ketika saya memiliki 4 fitur di berbagai lapisan kode yang sedang dikerjakan pada saat yang sama, dan saya kehilangan fokus pada apa yang sebenarnya saya lakukan (terlalu banyak tes gagal pada saat yang sama).
Saya pikir saya bisa menyelesaikan ini dengan lebih berupaya merencanakan tugas saya bahkan sebelum saya mulai menulis tes. Tetapi dalam beberapa kasus saya tidak tahu bahwa saya harus masuk lebih dalam, karena misalnya saya tidak tahu API lapisan bawah dengan sangat baik.
Apa yang harus saya lakukan dalam kasus seperti itu? Apakah TDD punya rekomendasi?
sumber
X
saya harus tahu bagian mana dari dependensi yangX
perlu saya tiru. Saya merasa bahwa ini adalah bagian dari detail implementasi, yang seharusnya tidak menjadi bagian dari tes - jika tidak saya mungkin perlu mengubah tes saat refactoring implementasi. Haruskah saya khawatir tentang itu?Rintisan dan tiruan dapat digunakan untuk mensimulasikan fungsi yang belum dimodifikasi / diimplementasikan. Mereka juga dapat membantu Anda menyelesaikan dependensi yang menyebabkan 'reaksi berantai' semacam ini.
Di sisi lain, mungkin hanya menyimpan satu (gagal) tes yang mendorong perubahan berikutnya adalah pendekatan terbaik.
Tes lain yang menargetkan kode yang bergantung pada fungsionalitas baru dapat dinonaktifkan sementara karena mereka tidak benar-benar relevan pada titik ini yaitu. dalam kasus Anda, nonaktifkan tes untuk X sampai Anda menerapkan Y dll.
Dengan begitu Anda bisa tetap fokus pada perubahan berikutnya hanya yang Anda inginkan, saya pikir.
sumber
unittest
sudah melewati tes. Ini mungkin cukup bagiku.Berhenti
Begitu saja sepertinya ada dua masalah terpisah di sini:
Anda lupa beberapa cerita dan skenario pengujian, dan tidak menemukannya sampai Anda mulai mengerjakan skenario pengujian tertentu, dan / atau
Anda benar-benar melakukan pengujian unit, dan bukan pengujian fitur TDD
Untuk # 1, berhenti , kembali, dan perbarui cerita dan uji skenario, kemudian mulai lagi dengan skenario yang berbeda.
Untuk # 2, berhentilah , dan ingat bahwa Anda sedang menguji fitur, bukan unit, jadi gunakan ejekan untuk mengabaikan antarmuka lain dan / atau menerapkan lebih banyak kode untuk membuat lulus uji tanpa menambahkan skenario pengujian baru. Ini mengasumsikan bahwa Anda tidak melewatkan skenario pengujian, tetapi sebaliknya - dan ini benar-benar umum - menggabungkan pengujian unit dan TDD.
sumber
Ini adalah pertanyaan yang bagus dan frustrasi besar bagi saya juga dengan TDD. Saya merasa seperti kekurangan TDD dalam skenario ini di mana Anda tidak memiliki cara untuk mengetahui komponen atau fitur tingkat rendah apa yang akan Anda butuhkan sampai Anda mulai berkembang.
Secara pribadi saya menemukan bahwa TDD hanya berfungsi jika Anda tahu persis apa yang perlu Anda lakukan dan apa yang perlu Anda panggil untuk melakukan fitur. Pengembang tidak selalu tahu segalanya sebelum kita mulai jadi saya telah menemukan bahwa cara terbaik bagi diri saya untuk mengurangi situasi yang Anda gambarkan:
Prototipe
Ketika saya membuat aplikasi prototipe sederhana untuk mengeksplorasi dan menemukan metode dan pendekatan untuk masalah teknis maka saya menemukan banyak pekerjaan kaki dan mendapatkan penelitian dari jalan sebelum saya mulai. Merancang dan memperkirakan menjadi jauh lebih mudah juga.
Jika prototipe harus terlibat sehingga menjadi aplikasi maka saya mendorong Anda untuk tidak melakukan hal yang malas namun dan membangun unit test untuk prototipe Anda setelah fakta.
Anda harus tahu lebih banyak tentang API tingkat lebih rendah pada saat itu dan dapat berhasil mengejek API tingkat lebih rendah di komponen level yang lebih tinggi.
sumber
Tergantung tes apa yang Anda tulis saat mengerjakan TDD.
Model klasik adalah untuk menulis tes unit dan menggunakan tiruan atau bertopik untuk memisahkan tes dari "unit" kode lainnya.
Ada banyak model alternatif lain seperti ATDD di mana tes stack penuh, atau hampir stack test penuh. Dalam kasus khusus ini, tes penulisan Anda yang menegaskan perilaku program yang diperlukan bukan satu unit kode sehingga Anda tidak akan menulis tes lain. Anda akan mendapatkan implement pulang pergi untuk memenuhi tes. Anda kemudian menambahkan tes lain untuk fitur / perilaku lain.
sumber