将我当前的代码项目转换为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()
在尝试调用它之前不检查事件是否有任何处理程序。这将导致一个空的解除引用,它将永远不会被我们的任何测试所捕获,因为它们都默认附加了一个事件处理程序。但是,代码覆盖工具仍然会报道全面覆盖。
这只是我手边的“真实世界的例子”,但即使对代码有100%的“覆盖率”,我也会发现有更多的这类错误可能会漏过,但这仍然不能解释到100%测试。在编写测试时,我们是否应该用这样一种工具报告覆盖率?是否还有其他种类的工具可以抓住这些漏洞?
好帖子其实,感谢分享。 – 2008-10-04 13:23:56