将我当前的代码项目转换为 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% 测试. 在编写测试时,我们是否应该对这种工具报告的覆盖率持保留态度?是否有其他类型的工具可以捕捉这些漏洞?