Guru TDD semakin banyak memberi tahu kami bahwa TDD bukan tentang tes, ini tentang desain . Jadi saya tahu beberapa pengembang yang membuat desain hebat tanpa TDD. Haruskah mereka berlatih TDD?
Guru TDD semakin banyak memberi tahu kami bahwa TDD bukan tentang tes, ini tentang desain . Jadi saya tahu beberapa pengembang yang membuat desain hebat tanpa TDD. Haruskah mereka berlatih TDD?
Jawaban:
TDD tidak hanya membantu saya mencapai desain akhir terbaik, ini membantu saya sampai di sana dalam upaya yang lebih sedikit.
Dulu saya memiliki dua atau tiga tusukan pada suatu masalah sebelum memutuskan desain mana yang saya pikir terbaik. Sekarang, waktu yang sama persis dihabiskan untuk menulis tes dan memfokuskan pikiran saya pada desain yang benar. Dan, sebagai bonus, itu membuat saya dengan serangkaian tes berulang. Menang!
Yang mengatakan, pasti akan ada orang-orang yang TDD tidak menawarkan apa-apa. Selama mereka masih memiliki tes otomatis yang dapat diulang di akhir, itu bagus.
forced
,. Saya tidak tahu mengapa orang tidak lebih sering terganggu oleh frekuensi kata "terpaksa" seperti yang terjadi dalam diskusi tentang TDD. Seseorang seharusnya tidak perlu dipaksa untuk merancang sesuatu dengan benar; mereka harus belajar bagaimana merancang sesuatu dengan benar, dan kemudian terus melakukannya tanpa dipaksa ke dalamnya, terutama ketika tindakan pemaksaan itu sangat memakan waktu.
Apa ini khususnya guru TDD benar-benar mencoba untuk mengatakan tidak bahwa TDD adalah proses desain (meskipun sejumlah orang telah sayangnya ditafsirkan seperti itu). Pesan di sini adalah bahwa menggunakan proses seperti TDD, jika Anda melakukannya dengan benar , akan cenderung meningkatkan desain Anda secara keseluruhan.
Konsep dasar adalah yang jauh lebih tua dari TDD; mendesain untuk testability . Jika Anda secara ketat mematuhi prinsip-prinsip SOLID , terutama Prinsip Tanggung Jawab Tunggal , Anda akan menemukan kode sangat mudah untuk diuji. Di sisi lain, jika Anda cenderung sedikit ceroboh dalam desain Anda, Anda mungkin akan menemukan proses penulisan unit test untuk memaksa Anda melakukan ini lebih sering, untuk menghindari frustrasi dari (a) mencari tahu apa yang perlu diuji, dan (b) menghabiskan lebih banyak waktu mengatur dependensi daripada menulis tes yang sebenarnya.
Anda tidak harus mengikuti TDD untuk mendapatkan manfaat ini, tetapi tidak membantu untuk menulis tes awal - sebaiknya segera setelah Anda menerapkan kelas, jika tidak sebelum atau selama. Jika Anda menunggu terlalu lama, Anda berisiko melakukan tes "hybrid kotor" yang dibicarakan penulis, yang tidak memiliki banyak nilai karena rapuh dan cenderung pecah selama refactoring yang tidak berbahaya - belum lagi membuat lebih besar -Resain ulang skala proses yang sangat sulit.
Anda tidak dapat mengetahui apakah Anda benar-benar merancang pengujian jika Anda tidak menulis tes, dan "tes fitur" yang serampangan dengan hanya 15% cakupan kode tidak masuk hitungan.
Tentu saja Anda dapat membuat desain yang bagus tanpa harus menulis tes tunggal - tetapi apakah Anda yakin itu desain yang hebat? Bagaimana Anda tahu, jika Anda tidak ditentukan dengan jelas oleh tes? Pengujian mengungkap banyak masalah, dan sementara proses QA mungkin menemukan bug yang terlihat, mereka tidak akan mengungkap keputusan desain yang buruk.
Jawaban sederhana yang datang dari seseorang yang berusaha mempelajari TDD: Anda tidak membutuhkannya , tetapi manfaat utama yang diberikannya kepada Anda adalah, cukup sederhana, kepercayaan diri : Keyakinan bahwa aplikasi Anda berfungsi. Keyakinan bahwa kasus penggunaan puas. Keyakinan bahwa logika Anda cocok untuk modul "Foobar". Keyakinan bahwa kode Anda disusun dengan benar agar dapat dipertahankan dan dapat diperpanjang enam bulan ke depan ketika CEO ingin menambahkan beberapa fitur gila baru yang ia baca. Percaya diri bahwa, ketika aplikasi Anda tumbuh, fondasi telah diletakkan agar arsitektur tidak berantakan atau membutuhkan sekumpulan peretasan berantakan untuk fitur baru juri.
Saya menyadari hal di atas terdengar agak evangelis tetapi itulah bagaimana saya melihat manfaat TDD. Bahkan jika Anda dapat membuat desain yang bagus, solid, dan dirancang dengan baik menggunakan TDD memaksa tangan Anda untuk melakukan hal-hal yang benar, dan kemudian membuktikan bahwa segala sesuatunya dilakukan dengan benar, dan yang lebih penting memberikan garis dasar untuk menjaga hal-hal yang benar. Dari sangat sedikit saya mencoba-coba di TDD, menggunakannya memaksa saya untuk membuat kode bersih dan mengikuti konsep rekayasa perangkat lunak yang tepat, di mana kalau tidak saya akan melakukan "hal tercepat mungkin" yang sering mengakibatkan kode "hack" berantakan.
Saya hanya dapat berbicara dari pengalaman saya. Bagi saya TDD membawa beberapa hal yang sebelumnya tidak saya miliki di kotak alat saya. Meskipun demikian, perlu dikatakan lagi bahwa TDD bukanlah solusi untuk semuanya. Saya selalu mencoba untuk memisahkan implementasi eksplorasi dan siap produksi. TDD dalam fase eksplorasi sama sekali tidak diperlukan dan bahkan melambat. Di sisi lain untuk kode siap produksi itu membawa beberapa manfaat yang dalam jangka pendek dan panjang sangat berharga bagi kesehatan mental pengembang dan karma proyek.
Ada satu hal yang tidak diperbaiki TDD. Jika Anda tidak tahu cara membangun benda yang sedang Anda bangun, maka TDD tidak akan menghasilkan solusi untuk Anda. Anda harus memiliki "desain" kasar atau gambaran umum masalah dan solusi. TDD akan membuat Anda menerapkannya dengan cara yang lebih elegan dan terpelihara dengan kode yang lebih berkualitas.
Akhirnya, saya lebih suka berpikir dalam istilah BDD yang bersandar pada praktik TDD. BDD membuat saya untuk mengimplementasikan solusi menggunakan kosa kata domain dan membuat perangkat lunak sesuai dengan masalah dengan lebih baik.
Mungkin ada banyak cara untuk mencapai desain hebat, dan ada banyak interpretasi berbeda tentang apa yang disebut "hebat" - atau bahkan "baik". Saya menduga sebagian besar TDDers tidak akan setuju dengan Anda tentang definisi - bahwa jika kita melihat kode yang Anda rasa bagus, kami akan menganggapnya kurang bagus. TDD mengarahkan kita ke beberapa kualitas yang sangat spesifik, dan kualitas ini jarang ditemukan dalam kode non-TDD.
Jelas, kemampuan ujian adalah salah satu dari kualitas-kualitas itu, dan yang paling utama. Metode dan kelas yang sangat kecil mungkin merupakan sub-karakteristik, dan ini mengarah pada penamaan yang sangat baik. Mungkin Anda mengenal programmer yang mencapai kualitas ini tanpa melakukan TDD, tapi saya tidak.