Perspektif:
Jadi mari kita mundur dan tanyakan apa yang TDD coba bantu. TDD berusaha membantu kami menentukan apakah kode kami benar atau tidak. Dan yang benar, maksud saya "apakah kode memenuhi persyaratan bisnis?" Poin jualnya adalah bahwa kita tahu perubahan akan diperlukan di masa mendatang, dan kami ingin memastikan bahwa kode kami tetap benar setelah kami melakukan perubahan itu.
Saya membawa perspektif itu ke atas karena saya pikir mudah untuk tersesat dalam detail dan melupakan apa yang kita coba capai.
Prinsip - SAP:
Meskipun saya bukan seorang ahli dalam TDD, saya pikir Anda kehilangan bagian dari apa yang sedang diajarkan oleh Prinsip Pernyataan Tunggal (SAP). SAP dapat dinyatakan kembali sebagai "uji satu per satu." Tetapi TOTAT tidak menggulung lidah semudah SAP.
Menguji satu hal pada satu waktu berarti Anda fokus pada satu kasus; satu jalan; satu syarat batas; satu kasus kesalahan; satu apa pun per tes. Dan ide mengemudi di balik itu adalah Anda perlu tahu apa yang rusak ketika test case gagal, sehingga Anda dapat menyelesaikan masalah lebih cepat. Jika Anda menguji beberapa kondisi (mis. Lebih dari satu hal) dalam suatu tes dan tes gagal, maka Anda memiliki lebih banyak pekerjaan di tangan Anda. Pertama Anda harus mengidentifikasi mana dari beberapa kasus gagal dan kemudian mencari tahu mengapa itu terjadi gagal.
Jika Anda menguji satu hal pada satu waktu, cakupan pencarian Anda jauh lebih kecil dan cacat diidentifikasi lebih cepat. Perlu diingat bahwa "menguji satu hal pada suatu waktu" tidak serta merta mengecualikan Anda dari melihat lebih dari satu output proses pada suatu waktu. Misalnya, ketika menguji "jalur yang dikenal baik", saya mungkin berharap untuk melihat nilai spesifik yang dihasilkan foo
serta nilai lain di dalamnya bar
dan saya dapat memverifikasi itu foo != bar
sebagai bagian dari pengujian saya. Kuncinya adalah secara logis mengelompokkan cek output berdasarkan kasus yang sedang diuji.
Prinsip - PMP:
Demikian juga, saya pikir Anda sedikit kehilangan tentang apa yang harus diajarkan oleh Prinsip Metode Pribadi (PMP) kepada kami. PMP mendorong kita untuk memperlakukan sistem seperti kotak hitam. Untuk input yang diberikan, Anda harus mendapatkan output yang diberikan. Anda tidak peduli bagaimana kotak hitam menghasilkan output. Anda hanya peduli bahwa output Anda selaras dengan input Anda.
PMP adalah perspektif yang sangat baik untuk melihat aspek API dari kode Anda. Ini juga dapat membantu Anda menentukan apa yang harus Anda uji. Identifikasi poin antarmuka Anda dan verifikasi bahwa mereka memenuhi persyaratan kontrak mereka. Anda tidak perlu peduli tentang cara metode di belakang antarmuka (alias pribadi) melakukan tugasnya. Anda hanya perlu memverifikasi bahwa mereka melakukan apa yang seharusnya mereka lakukan.
TDD terapan ( untuk Anda )
Jadi situasi Anda menghadirkan sedikit kerutan di luar aplikasi biasa. Metode aplikasi Anda stateful, jadi outputnya bergantung tidak hanya pada input tetapi juga apa yang telah dilakukan sebelumnya. Saya yakin saya harus di <insert some lecture>
sini tentang keadaan mengerikan dan bla bla bla, tapi itu benar-benar tidak membantu menyelesaikan masalah Anda.
Saya akan menganggap Anda memiliki semacam tabel diagram keadaan yang menunjukkan berbagai keadaan potensial dan apa yang perlu dilakukan untuk memicu transisi. Jika tidak, Anda akan memerlukannya karena akan membantu mengekspresikan persyaratan bisnis untuk sistem ini.
Tes: Pertama, Anda akan berakhir dengan serangkaian tes yang memberlakukan perubahan status. Idealnya, Anda akan memiliki tes yang menjalankan berbagai perubahan status yang dapat terjadi, tetapi saya dapat melihat beberapa skenario di mana Anda mungkin tidak perlu pergi sejauh itu.
Selanjutnya, Anda perlu membuat tes untuk memvalidasi pemrosesan data. Beberapa tes negara akan digunakan kembali ketika Anda membuat tes pemrosesan data. Misalnya, anggap Anda memiliki metode Foo()
yang memiliki keluaran berbeda berdasarkan pada Init
dan State1
menyatakan. Anda akan ingin menggunakan ChangeFooToState1
tes Anda sebagai langkah pengaturan untuk menguji output ketika " Foo()
ada State1
".
Ada beberapa implikasi di balik pendekatan yang ingin saya sebutkan. Spoiler, di sinilah aku akan membuat marah para puritan
Pertama, Anda harus menerima bahwa Anda menggunakan sesuatu sebagai ujian dalam satu situasi dan pengaturan dalam situasi lain. Di satu sisi, ini tampaknya merupakan pelanggaran langsung terhadap SAP. Tetapi jika Anda secara logis membingkai ChangeFooToState1
memiliki dua tujuan maka Anda masih menemukan semangat dari apa yang SAP ajarkan kepada kami. Saat Anda perlu memastikan Foo()
status perubahan, maka Anda gunakan ChangeFooToState1
sebagai tes. Dan ketika perlu memvalidasi " Foo()
keluaran ketika di State1
" maka Anda menggunakan ChangeFooToState1
sebagai pengaturan.
Butir kedua adalah dari sudut pandang praktis, Anda tidak ingin pengujian unit sepenuhnya acak untuk sistem Anda. Anda harus menjalankan semua tes perubahan status sebelum menjalankan tes validasi output. SAP adalah semacam prinsip panduan di balik pemesanan itu. Untuk menyatakan apa yang seharusnya jelas - Anda tidak dapat menggunakan sesuatu sebagai pengaturan jika gagal sebagai tes.
Menyatukannya:
Dengan menggunakan diagram keadaan Anda, Anda akan membuat tes untuk mencakup transisi. Sekali lagi, menggunakan diagram Anda, Anda menghasilkan tes untuk mencakup semua kasus pemrosesan data input / output didorong oleh negara.
Jika Anda mengikuti pendekatan itu, bloated, complicated, long, and difficult to write
tes akan menjadi sedikit lebih mudah untuk dikelola. Secara umum, mereka harus berakhir lebih kecil dan mereka harus lebih ringkas (yaitu kurang rumit). Anda harus memperhatikan bahwa tes lebih dipisahkan atau modular juga.
Sekarang, saya tidak mengatakan prosesnya akan benar-benar bebas dari rasa sakit karena menulis tes yang baik memang membutuhkan usaha. Dan beberapa di antaranya masih akan sulit karena Anda memetakan parameter kedua (keadaan) pada beberapa kasus Anda. Dan sebagai tambahan, itu akan menjadi sedikit lebih jelas mengapa sistem stateless lebih mudah untuk membangun tes. Tetapi jika Anda mengadaptasi pendekatan ini untuk aplikasi Anda, Anda harus menemukan bahwa Anda dapat membuktikan aplikasi Anda berfungsi dengan benar.