Unit test tidak hanya memfasilitasi desain, tetapi itu adalah salah satu manfaat utama mereka.
Penulisan uji-pertama mengusir modularitas dan struktur kode bersih.
Ketika Anda menulis tes kode Anda terlebih dahulu, Anda akan menemukan bahwa "kondisi" dari unit kode tertentu secara alami didorong ke dependensi (biasanya melalui mengejek atau bertopik) ketika Anda menganggapnya dalam kode Anda.
"Diberikan kondisi x, perkirakan perilaku y," akan sering menjadi rintisan untuk memasok x
(yang merupakan skenario di mana tes perlu memverifikasi perilaku komponen saat ini) dan y
akan menjadi tiruan, panggilan yang akan diverifikasi di akhir tes (kecuali jika itu "harus kembali y
," dalam hal tes hanya akan memverifikasi nilai kembali secara eksplisit).
Kemudian, setelah unit ini berperilaku seperti yang ditentukan, Anda beralih ke menulis dependensi (untuk x
dan y
) yang Anda temukan.
Hal ini membuat penulisan kode modular yang bersih menjadi proses yang sangat mudah dan alami, jika tidak demikian, seringkali mudah untuk mengaburkan tanggung jawab dan perilaku pasangan tanpa disadari.
Tes menulis nanti akan memberi tahu Anda ketika kode Anda terstruktur dengan buruk.
Ketika menulis tes untuk sepotong kode menjadi sulit karena ada terlalu banyak hal untuk di-stub atau diolok-olok, atau karena hal-hal yang terlalu erat digabungkan bersama-sama, Anda tahu Anda memiliki perbaikan untuk dibuat dalam kode Anda.
Ketika "mengubah tes" menjadi beban karena ada begitu banyak perilaku dalam satu unit, Anda tahu Anda memiliki perbaikan untuk dibuat dalam kode Anda (atau hanya dalam pendekatan Anda dalam menulis tes - tetapi ini tidak biasanya terjadi dalam pengalaman saya) .
Ketika skenario Anda menjadi terlalu rumit ( "jika x
dan y
dan z
kemudian ...") karena Anda perlu lebih abstrak, Anda tahu Anda memiliki perbaikan untuk membuat dalam kode Anda.
Ketika Anda berakhir dengan tes yang sama di dua fixture berbeda karena duplikasi dan redundansi, Anda tahu Anda memiliki perbaikan yang harus dilakukan dalam kode Anda.
Berikut ini adalah pembicaraan yang sangat baik oleh Michael Feathers menunjukkan hubungan yang sangat dekat antara testability dan desain dalam kode (awalnya diposting oleh displayName di komentar). Pembicaraan juga membahas beberapa keluhan umum dan kesalahpahaman tentang desain yang baik dan kemampuan uji pada umumnya.