我试图使用测试驱动开发实现我的信号处理库.但我有一点怀疑:假设我正在试图实现一个正确的方法(我不是):
编写测试(伪代码)
assertEqual(0,sine(0))
>写第一个实现
function sine(radians) return 0
>第二次测试
assertEqual(1,sine(pi))
在这一点上,我应该如何
>实现可以为pi和其他值工作的智能代码,或者
>实现最有效的代码,仅适用于0和pi?
如果选择第二个选项,我什么时候可以跳到第一个选项?我最终会做的…
在这一点上,我应该如何
>实现两个简单测试之外的实际代码?
>实现更为愚蠢的代码,这只能用于两个简单的测试?
都不是.我不知道你在哪里得到“一次只测试一次”的方法,但肯定是一个缓慢的方式.
关键是要写清楚的测试,并使用清晰的测试来设计你的程序.
所以,写足够的测试来实际验证一个正弦函数.两项测试显然不足.
在连续功能的情况下,您必须最终提供一个已知良好值的表.为什么要等?
然而,测试连续功能有一些问题.你不能遵循愚蠢的TDD程序.
您不能测试0和2 * pi之间的所有浮点值.您不能测试几个随机值.
在连续功能的情况下,“严格的,不可思议的TDD”不起作用.这里的问题是你知道你的正弦函数实现将基于一堆对称性.您必须根据您使用的对称性规则进行测试.虫藏在裂缝和角落里.边缘案例和角色案例是实现的一部分,如果您不能想像地遵循TDD,则无法测试.
但是,对于连续功能,您必须测试实现的边缘和角落的情况.
这并不意味着TDD被破坏或不足.它表示,如果没有想到你真正的目标是什么,那么对“测试第一”的奴隶主义就无法奏效.