나는 함수의 정확한 결과를 미리 예측하기 어려운 수치 적 / 수학적 프로그램을 자주 사용합니다.
이런 종류의 코드로 TDD를 적용하려고 할 때 종종 테스트중인 코드를 작성하는 것이 코드에 대한 단위 테스트를 작성하는 것보다 훨씬 쉽다는 것을 알았습니다. 예상 결과를 찾는 유일한 방법은 알고리즘 자체를 적용하는 것입니다. 머리, 종이 또는 컴퓨터). 나는 다른 방법 대신에 테스트중인 코드를 효과적으로 사용하여 단위 테스트를 확인하고 있기 때문에 잘못된 느낌입니다.
테스트중인 코드의 결과를 예측하기 어려운 경우 단위 테스트를 작성하고 TDD를 적용하는 알려진 기술이 있습니까?
결과를 예측하기 어려운 코드의 실제 예 :
함수 weightedTasksOnTime
하루에 할 일의 양을 주어진 workPerDay
범위 (0, 24], 현재 시간 initialTime
> 0, 및 작업의 목록을 taskArray
각 시간과 재산 완료 time
> 0, 마감일 due
및 중요성 값을 importance
, 반환 에서 시작 due
하는 순서대로 각 작업을 완료 한 경우 날짜 이전에 완료 할 수있는 작업의 중요도를 나타내는 [0, 1] 범위의 정규화 된 값 .taskArray
initialTime
이 기능을 구현하는 알고리즘은 비교적 간단합니다 taskArray
.의 작업을 반복합니다 . 각 작업의 경우, 추가 time
에 initialTime
. 새로운 시간 < due
이면 importance
누산기에 추가하십시오 . 시간은 역 일 perDay에 의해 조정됩니다. 누산기를 반환하기 전에 작업 중요도를 합하여 정규화하십시오.
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
}
이 질문은 테스트중인 코드가 기존 알고리즘을 다시 구현하지 않는 상황을 해결합니다. 코드가 재 구현 된 경우 알고리즘의 기존 신뢰할 수있는 구현이 자연스러운 테스트 오라클 역할을하기 때문에 본질적으로 결과를 쉽게 예측할 수 있습니다.