如果正确实施逻辑后,测试仍然失败(因为测试中有错误),则TDD中的最佳措施是什么?
例如,假设您要开发以下功能:
int add(int a, int b) {
return a + b;
}
假设我们按照以下步骤进行开发:
编写测试(尚无功能):
// test1 Assert.assertEquals(5, add(2, 3));
导致编译错误。
编写一个虚拟函数实现:
int add(int a, int b) { return 5; }
结果:
test1
通过。添加另一个测试用例:
// test2 -- notice the wrong expected value (should be 11)! Assert.assertEquals(12, add(5, 6));
结果:
test2
失败,test1
仍然通过。编写实际的实现:
int add(int a, int b) { return a + b; }
结果:
test1
仍然通过,test2
仍然失败(因为11 != 12
)。
在这种特定情况下:
- 更正
test2
,看看它现在通过了,或者 - 删除实现的新部分(即返回上面的步骤2),更正
test2
并使其失败,然后重新引入正确的实现(上面的步骤4)。
还是还有其他更聪明的方法?
虽然我知道示例问题相当琐碎,但我对通用情况下的操作很感兴趣,这可能比两个数的加法复杂。
编辑(响应@Thomas Junk的回答):
这个问题的重点是在这种情况下TDD提出的建议,而不是实现良好代码或测试(可能与TDD方式不同)的“通用最佳实践”。