將我當前的代碼項目轉換爲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