您应该一次性编写所有单元测试(在我看来)。虽然只创建专门覆盖必须测试的测试的想法是正确的,但您的特定规范需要一个功能sine()
函数,而不是一个sine()
适用于 0 和 PI 的函数。
找到一个你足够信任的来源(数学家朋友、数学书后面的表格或其他已经实现了正弦函数的程序)。
我之所以选择是bash/bc
因为我懒得手动输入所有内容:-)。如果它是一个sine()
函数,我只需运行以下程序并将其粘贴到测试代码中。我还会把这个脚本的副本作为评论放在那里,这样我就可以在发生变化时重新使用它(例如在这种情况下超过 20 度时所需的分辨率,或者你想要的 PI 值利用)。
#!/bin/bash
d=0
while [[ ${d} -le 400 ]] ; do
r=$(echo "3.141592653589 * ${d} / 180" | bc -l)
s=$(echo "s(${r})" | bc -l)
echo "assertNear(${s},sine(${r})); // ${d} deg."
d=$(expr ${d} + 20)
done
这输出:
assertNear(0,sine(0)); // 0 deg.
assertNear(.34202014332558591077,sine(.34906585039877777777)); // 20 deg.
assertNear(.64278760968640429167,sine(.69813170079755555555)); // 40 deg.
assertNear(.86602540378430644035,sine(1.04719755119633333333)); // 60 deg.
assertNear(.98480775301214683962,sine(1.39626340159511111111)); // 80 deg.
assertNear(.98480775301228458404,sine(1.74532925199388888888)); // 100 deg.
assertNear(.86602540378470305958,sine(2.09439510239266666666)); // 120 deg.
assertNear(.64278760968701194759,sine(2.44346095279144444444)); // 140 deg.
assertNear(.34202014332633131111,sine(2.79252680319022222222)); // 160 deg.
assertNear(.00000000000079323846,sine(3.14159265358900000000)); // 180 deg.
assertNear(-.34202014332484051044,sine(3.49065850398777777777)); // 200 deg.
assertNear(-.64278760968579663575,sine(3.83972435438655555555)); // 220 deg.
assertNear(-.86602540378390982112,sine(4.18879020478533333333)); // 240 deg.
assertNear(-.98480775301200909521,sine(4.53785605518411111111)); // 260 deg.
assertNear(-.98480775301242232845,sine(4.88692190558288888888)); // 280 deg.
assertNear(-.86602540378509967881,sine(5.23598775598166666666)); // 300 deg.
assertNear(-.64278760968761960351,sine(5.58505360638044444444)); // 320 deg.
assertNear(-.34202014332707671144,sine(5.93411945677922222222)); // 340 deg.
assertNear(-.00000000000158647692,sine(6.28318530717800000000)); // 360 deg.
assertNear(.34202014332409511011,sine(6.63225115757677777777)); // 380 deg.
assertNear(.64278760968518897983,sine(6.98131700797555555555)); // 400 deg.
显然,您需要将此答案映射到您的实际功能的用途。我的观点是,测试应该完全验证本次迭代中代码的行为。如果此迭代要生成sine()
仅适用于 0 和 PI 的函数,那很好。但在我看来,这将是对迭代的严重浪费。
您的函数可能非常复杂,以至于必须经过多次迭代才能完成。那么你的方法二是正确的,测试应该在你添加额外功能的下一次迭代中更新。否则,想办法快速添加本次迭代的所有测试,就不用担心在真实代码和测试代码之间频繁切换。