ฉันทำงานกับโปรแกรมตัวเลข / คณิตศาสตร์บ่อยครั้งมากซึ่งผลลัพธ์ที่แน่นอนของฟังก์ชั่นนั้นยากที่จะทำนายล่วงหน้า
ในการพยายามใช้ TDD กับรหัสประเภทนี้ฉันมักจะพบว่าการเขียนรหัสภายใต้การทดสอบง่ายกว่าการเขียนการทดสอบหน่วยสำหรับรหัสนั้นอย่างมีนัยสำคัญเพราะวิธีเดียวที่ฉันรู้ในการค้นหาผลลัพธ์ที่คาดหวังคือการใช้อัลกอริทึมเอง หัวกระดาษหรือโดยคอมพิวเตอร์) สิ่งนี้รู้สึกผิดเพราะฉันใช้รหัสภายใต้การทดสอบเพื่อตรวจสอบการทดสอบหน่วยของฉันอย่างมีประสิทธิภาพแทนที่จะเป็นวิธีอื่น
มีเทคนิคที่รู้จักกันสำหรับการเขียนการทดสอบหน่วยและการใช้ TDD เมื่อผลลัพธ์ของรหัสภายใต้การทดสอบนั้นยากที่จะทำนายหรือไม่?
ตัวอย่างโค้ด (จริง) ที่ยากต่อการคาดการณ์ผลลัพธ์:
ฟังก์ชั่นweightedTasksOnTime
ที่ได้รับจำนวนเงินของงานที่ทำต่อวันworkPerDay
ในช่วง (0, 24], เวลาปัจจุบันinitialTime
> 0 และรายชื่อของงานtaskArray
แต่ละที่มีเวลาที่จะเสร็จสมบูรณ์คุณสมบัติtime
> 0 วันที่ครบกำหนดdue
และความคุ้มค่าความสำคัญimportance
; ผลตอบแทน ค่าปกติอยู่ในช่วง [0, 1] เป็นตัวแทนของความสำคัญของงานที่สามารถจะแล้วเสร็จก่อนของพวกเขาdue
วันถ้าแต่ละงานถ้าเสร็จสมบูรณ์ในการสั่งซื้อที่กำหนดโดยเริ่มต้นที่taskArray
initialTime
ขั้นตอนวิธีการที่จะใช้ฟังก์ชั่นนี้ค่อนข้างตรงไปตรงมา: taskArray
ย้ำกว่างานใน สำหรับแต่ละงานเพิ่มเพื่อtime
initialTime
หากเวลาใหม่ < due
เพิ่มimportance
ไปยังแอคคูมูเลเตอร์ ปรับเวลาด้วย inverse workPerDay ก่อนที่จะส่งคืนตัวสะสมหารด้วยผลรวมของความสำคัญของงานเพื่อทำให้ปกติ
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
}
คำถามนี้กล่าวถึงสถานการณ์ที่โค้ดภายใต้การทดสอบไม่ใช่การนำอัลกอริทึมกลับมาใช้ใหม่ หากรหัสเป็นการใช้งานซ้ำอีกครั้งรหัสนั้นมีความง่ายในการทำนายผลเนื่องจากการใช้งานที่เชื่อถือได้ของอัลกอริทึมทำหน้าที่เป็นออราเคิลทดสอบตามธรรมชาติ