मैं अक्सर बहुत संख्यात्मक / गणितीय कार्यक्रमों के साथ काम करता हूं, जहां किसी फ़ंक्शन का सटीक परिणाम अग्रिम में भविष्यवाणी करना मुश्किल है।
इस तरह के कोड के साथ टीडीडी को लागू करने की कोशिश में, मैं अक्सर उस कोड के लिए यूनिट परीक्षण लिखने की तुलना में परीक्षण के तहत कोड को काफी आसान लिखता हूं, क्योंकि मुझे अपेक्षित परिणाम खोजने का एकमात्र तरीका एल्गोरिदम को लागू करना है (चाहे मेरे में) सिर, कागज पर, या कंप्यूटर द्वारा)। यह गलत लगता है, क्योंकि मैं अपने यूनिट परीक्षणों को सत्यापित करने के लिए कोड के तहत प्रभावी रूप से कोड का उपयोग कर रहा हूं, बजाय अन्य तरीके के।
क्या यूनिट परीक्षण लिखने और टीडीडी को लागू करने के लिए तकनीक ज्ञात है जब परीक्षण के तहत कोड का परिणाम भविष्यवाणी करना मुश्किल है?
परिणामों की भविष्यवाणी करने में मुश्किल के साथ कोड का ए (वास्तविक) उदाहरण:
एक फ़ंक्शन weightedTasksOnTime
, जो प्रति दिन किए गए काम की मात्रा को workPerDay
सीमा में (0, 24], वर्तमान समय initialTime
> 0, और कार्यों की एक सूची को देखते हुए दिया गया है taskArray
; प्रत्येक संपत्ति को पूरा करने के लिए एक समय के साथ time
> 0, नियत तारीख due
और महत्व मूल्य importance
; रेंज में एक सामान्यीकृत मूल्य [0, 1] उन कार्यों के महत्व का प्रतिनिधित्व करता है जो उनकी due
तिथि से पहले पूरा हो सकते हैं यदि प्रत्येक कार्य यदि दिए गए क्रम में पूरा हो जाता है taskArray
, तो शुरू होता है initialTime
।
इस फ़ंक्शन को लागू करने के लिए एल्गोरिथ्म अपेक्षाकृत सीधा है: इसमें कार्यों पर पुनरावृति taskArray
। प्रत्येक कार्य के लिए, जोड़ने time
के लिए initialTime
। यदि नया समय < due
, importance
एक संचायक में जोड़ें । उलटा वर्कपेयर द्वारा समय को समायोजित किया जाता है। संचायक को वापस करने से पहले, कार्य आयात के योग को सामान्य करने के लिए विभाजित करें।
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)
}
मेरा मानना है कि उपरोक्त समस्या को सरल बनाया जा सकता है, जबकि इसके मूल को बनाए रखने, हटाने workPerDay
और सामान्य करने की आवश्यकता, देने के लिए:
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
}
यह प्रश्न उन परिस्थितियों को संबोधित करता है जहां परीक्षण के तहत कोड किसी मौजूदा एल्गोरिथ्म का पुन: कार्यान्वयन नहीं है। यदि कोड एक पुन: कार्यान्वयन है, तो आंतरिक रूप से परिणामों की भविष्यवाणी करना आसान है, क्योंकि एल्गोरिथ्म के मौजूदा विश्वसनीय कार्यान्वयन एक प्राकृतिक परीक्षण के रूप में कार्य करते हैं।