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 weightedTasksOnTime
yapı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 due
ve önem değeri importance
; [0, 1] aralığında normalize edilmiş bir değer, due
eğer verilen sırayla tamamlanırsa her bir görevden taskArray
baş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 time
için initialTime
. Yeni saat <ise due
, importance
bir 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 workPerDay
ve 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.