TDD'yi pratik etmeye çalışıyorum, Bit Vector gibi basit bir yazılım geliştirerek. Swift kullanıyorum ama bu dille ilgili bir soru.
Benim BitVector
bir olduğunu struct
depolayan tek UInt64
ve hediyeler bir koleksiyon gibi davranın sağlayan üzerine bir API. Detaylar çok önemli değil, ama oldukça basit. Yüksek 57 bit depolama bitleri ve düşük 6 bit "sayım bitleri" dir, bu da size depolama bitlerinin kaç tanesinin gerçek bir değeri sakladığını gösterir.
Şimdiye kadar çok basit yeteneklerim var:
- Boş bit vektörleri oluşturan bir başlatıcı
count
Tür bir özellikInt
- Bir tür
isEmpty
özelliğiBool
- Bir eşitlik operatörü (
==
). Not: Bu,Object.equals()
Java'daki gibi bir referans eşitliği operatörü değil, Java'daki bir değer eşitliği operatörüdür==
.
Bir sürü döngüsel bağımlılıkla karşılaşıyorum:
Başlatıcımı test eden ünite testi, yeni yapılanmayı doğrulamak zorunda
BitVector
. Bunu 3 yoldan biriyle yapabilir:- Kontrol
bv.count == 0
- Kontrol
bv.isEmpty == true
- Şunu kontrol et
bv == knownEmptyBitVector
Yöntem 1 dayanıyor
count
, yöntem 2 dayanıyorisEmpty
(kendine güveniyorcount
, bu yüzden onu kullanmanın bir anlamı yok), yöntem 3 dayanıyor==
. Her halükarda, başlatıcımı yalıtılmış olarak test edemiyorum.- Kontrol
Testin
count
, başlatıcılarımı kaçınılmaz olarak test eden bir şey üzerinde çalışması gerekiyor.Uygulanması
isEmpty
dayanırcount
Uygulamasına
==
dayanırcount
.
BitVector
Mevcut bir bit deseninden (a UInt64
) bir yapı oluşturan özel bir API kullanarak bu sorunu kısmen çözebildim . Bu, diğer başlatıcıları sınamadan değerleri başlatmama izin verdi, böylece yükselişimi "önyükleyebildim".
Birim testlerimin gerçekten birim testler olması için, kendimi prod ve test kodumu önemli ölçüde karmaşık hale getiren bir grup hack yaparken buluyorum.
Bu tür sorunları tam olarak nasıl çözüyorsunuz?
BitVector
ünite testi için mükemmel bir ünite büyüklüğüdür ve derhal sorunlu üyelerinBitVector
anlamlı testler yapmak için birbirlerine ihtiyaç duyduğu sorunları çözer .