Sıklıkla, bir fonksiyonun kesin sonucunu önceden tahmin etmenin zor olduğu çok sayısal / matematiksel programlarla çalışıyorum.
TDD'yi bu tür bir kodla uygulamaya çalışırken, çoğu zaman test altındaki kodu bu kod için birim testleri yazmaktan çok daha kolay buluyorum, çünkü beklenen sonucu bulmanın tek yolu algoritmayı kendim uygulamaktır. baş, kağıda veya bilgisayardan). Bu doğru gelmiyor, çünkü birim testlerimi doğrulamak yerine test etme kodunu etkili bir şekilde kullanıyorum.
Birim testleri yazmak ve test edilen kodun sonucunu tahmin etmek zor olduğunda TDD uygulamak için bilinen teknikler var mı?
Sonuçları tahmin etmesi zor olan (gerçek) kod örneği:
Günde weightedTasksOnTimeyapılan bir çalışma miktarı workPerDay(0, 24], şimdiki zaman initialTime> 0, ve bir iş listesi taskArray; her biri time> 0, tamamlanma zamanı > 0, son tarih dueve önem değeri importance; [0, 1] aralığında normalize edilmiş bir değer, dueeğer verilen sırayla tamamlanırsa her bir görevden taskArraybaşlayarak başlayarak, görevlerinden önce tamamlanabilecek görevlerin önemini temsil eder initialTime.
Bu işlevi uygulamak için algoritma oldukça basittir: içinde görevler üzerinde yineleme taskArray. Her işlem için, eklemek timeiçin initialTime. Yeni saat <ise due, importancebir aküye ekleyin . Zaman ters workPerDay ile ayarlanır. Akümülatörü iade etmeden önce, normalleştirmek için görev ithalatının toplamına bölün.
function weightedTasksOnTime(workPerDay, initialTime, taskArray) {
let simulatedTime = initialTime
let accumulator = 0;
for (task in taskArray) {
simulatedTime += task.time * (24 / workPerDay)
if (simulatedTime < task.due) {
accumulator += task.importance
}
}
return accumulator / totalImportance(taskArray)
}
Yukarıdaki sorunun basitleştirilebileceğine inanıyorum, çekirdeğini korurken, kaldırma workPerDayve normalleştirme gerekliliklerini yerine getirerek:
function weightedTasksOnTime(initialTime, taskArray) {
let simulatedTime = initialTime
let accumulator = 0;
for (task in taskArray) {
simulatedTime += task.time
if (simulatedTime < task.due) {
accumulator += task.importance
}
}
return accumulator
}
Bu soru, test edilen kodun mevcut bir algoritmanın yeniden uygulanması olmadığı durumları ele almaktadır. Kod bir yeniden uygulama ise, algoritmayı varolan güvenilir uygulamalar doğal bir test oracle gibi davrandığından, sonuçları tahmin etmek kolaydır.