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 BitVector
adalah struct
yang 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
count
properti jenisInt
- Sebuah
isEmpty
properti 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
count
kebutuhan untuk beroperasi pada sesuatu, yang pasti menguji inisialisasi sayaImplementasi
isEmpty
mengandalkancount
Implementasi
==
mengandalkancount
.
Saya dapat menyelesaikan sebagian masalah ini dengan memperkenalkan API pribadi yang membangun a BitVector
dari 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?
BitVector
adalah ukuran unit yang sangat baik untuk pengujian unit dan segera menyelesaikan masalah Anda bahwa anggota publikBitVector
saling membutuhkan untuk melakukan tes yang bermakna.