【发布时间】:2008-10-04 13:00:43
【问题描述】:
将我当前的代码项目转换为 TDD,我注意到了一些事情。
class Foo {
public event EventHandler Test;
public void SomeFunction() {
//snip...
Test(this, new EventArgs());
}
}
在测试此代码并依靠代码覆盖工具来确定您是否有足够的测试时,我可以看到两种危险。
- 您应该测试
Test事件是否被触发。如果您忘记了这一点,仅代码覆盖工具不会告诉您。 - 我马上就到另一个。
为此,我在启动函数中添加了一个事件处理程序,使其看起来像这样:
Foo test;
int eventCount;
[Startup] public void Init() {
test = new Foo();
// snip...
eventCount = 0;
test.Test += MyHandler;
}
void MyHandler(object sender, EventArgs e) { eventCount++; }
现在我可以简单地检查eventCount 来查看我的事件被调用了多少次(如果它被调用了)。漂亮整齐。直到现在,我们才发现了一个永远不会被任何测试发现的阴险小错误:也就是说,SomeFunction() 在尝试调用它之前不会检查事件是否有任何处理程序。这将导致 null 取消引用,这将永远不会被我们的任何测试捕获,因为它们都默认附加了一个事件处理程序。但同样,代码覆盖率工具仍会报告完全覆盖率。
这只是我手头的“现实世界示例”,但我突然想到,即使 100% 的代码“覆盖”了更多此类错误,这仍然不能转化为100% 测试。在编写测试时,我们是否应该对这种工具报告的覆盖率持保留态度?是否有其他类型的工具可以捕捉这些漏洞?
【问题讨论】:
标签: tdd code-coverage