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長時間只是斷言之前),如果測試停止失敗,這是比賽狀況的良好指示。
好主意.. 以及我如何得到這個線程的參考? 我正在測試封裝這個東西的代碼.. – 2009-11-23 19:27:17
「配方」是爲了可測試性而設計它,它需要一些工作。您可以使回調/線程/工作對測試可見(使用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