1

可以說我有一個後臺工作者在後臺線程中執行數據庫查詢的類。用犀牛模擬測試一個後臺工作者

我想測試這個類

,所以我嘲笑我的數據庫,並返回一些收集到目前爲止好, 確保我的背景工人稱做工作 ,比我想請確保完成也發生了。

我注意到,測試通過和失敗隨機(我認爲這是與線程)

任何建議

回答

1

你可能有後臺線程之間的競爭條件和斷言/驗證。

例如:

[Test] 
public void TestWithRaceCondition() 
{ 
    bool called = false; 
    new Thread(() => called = true).Start(); 
    Assert.IsTrue(called); 
} 

線程不一定結束之前斷言,有時它會,有時不會。解決的辦法的情況是加入了後臺線程:

[Test] 
public void TestWithoutRaceCondition() 
{ 
    bool called = false; 
    var thread = new Thread(() => called = true); 
    thread.Start(); 
    thread.Join() 
    Assert.IsTrue(called); 
} 

一種方法來檢查它是否是一個競爭條件是延遲測試線程(調用了Thread.Sleep長時間只是斷言之前),如果測試停止失敗,這是比賽狀況的良好指示。

+0

好主意.. 以及我如何得到這個線程的參考? 我正在測試封裝這個東西的代碼.. – 2009-11-23 19:27:17

+1

「配方」是爲了可測試性而設計它,它需要一些工作。您可以使回調/線程/工作對測試可見(使用InternalsVisibleTo或使其成爲虛擬並在繼承類上測試它)。你可以看看一個例子:http://stackoverflow.com/questions/1770830/c-how-to-test-a-basic-threaded-worker-class/1770886#1770886。 其他我喜歡的選項是通過在Assert調用之前將測試線程休眠來添加一些「緩衝區」。 – Elisha 2009-11-23 21:06:22