Saya mencoba untuk mempraktekkan TDD, dengan menggunakannya untuk mengembangkan yang sederhana seperti Bit Vector. Saya kebetulan menggunakan Swift, tetapi ini adalah pertanyaan bahasa-agnostik.
My BitVectoradalah structyang menyimpan satu UInt64, dan menyajikan API di atasnya yang memungkinkan Anda memperlakukannya seperti koleksi. Detailnya tidak terlalu penting, tetapi cukup sederhana. 57 bit tinggi adalah bit penyimpanan, dan 6 bit lebih rendah adalah bit "hitung", yang memberitahu Anda berapa banyak bit penyimpanan yang benar-benar menyimpan nilai yang terkandung.
Sejauh ini, saya memiliki beberapa kemampuan yang sangat sederhana:
- Inisialisasi yang membangun vektor bit kosong
- Sebuah
countproperti jenisInt - Sebuah
isEmptyproperti jenisBool - Operator kesetaraan (
==). NB: ini adalah operator kesetaraan nilai yang serupa denganObject.equals()di Jawa, bukan operator kesetaraan referensi seperti==di Jawa.
Saya mengalami sekelompok ketergantungan siklus:
Tes unit yang menguji penginisialisasi saya perlu memverifikasi bahwa yang baru dibangun
BitVector. Ini dapat dilakukan dengan salah satu dari 3 cara:- Memeriksa
bv.count == 0 - Memeriksa
bv.isEmpty == true - Periksa itu
bv == knownEmptyBitVector
Metode 1 mengandalkan
count, metode 2 bergantung padaisEmpty(yang bergantung pada itu sendiricount, jadi tidak ada gunanya menggunakannya), metode 3 bergantung==. Bagaimanapun, saya tidak dapat menguji inisialisasi saya secara terpisah.- Memeriksa
Tes
countkebutuhan untuk beroperasi pada sesuatu, yang pasti menguji inisialisasi sayaImplementasi
isEmptymengandalkancountImplementasi
==mengandalkancount.
Saya dapat menyelesaikan sebagian masalah ini dengan memperkenalkan API pribadi yang membangun a BitVectordari pola bit yang ada (sebagai a UInt64). Ini memungkinkan saya untuk menginisialisasi nilai tanpa menguji inisialisasi lainnya, sehingga saya bisa "booting" dengan cara saya.
Agar unit test saya benar-benar menjadi unit test, saya menemukan diri saya melakukan banyak peretasan, yang menyulitkan prod dan kode pengujian saya secara substansial.
Bagaimana tepatnya Anda mengatasi masalah semacam ini?
BitVectoradalah ukuran unit yang sangat baik untuk pengujian unit dan segera menyelesaikan masalah Anda bahwa anggota publikBitVectorsaling membutuhkan untuk melakukan tes yang bermakna.