我是新手單元測試和nUnit(2.48)。我想編寫一個測試方法,其中的失敗案例是死鎖。這可能嗎?顯然,nUnit默認不知道方法需要執行多長時間,所以我必須編寫代碼在單獨的線程上完成這項工作,然後中止它並拋出異常,如果花費的時間比我定義的時間還要長,有一個更好的方法嗎?使用nUnit測試死鎖
謝謝
我是新手單元測試和nUnit(2.48)。我想編寫一個測試方法,其中的失敗案例是死鎖。這可能嗎?顯然,nUnit默認不知道方法需要執行多長時間,所以我必須編寫代碼在單獨的線程上完成這項工作,然後中止它並拋出異常,如果花費的時間比我定義的時間還要長,有一個更好的方法嗎?使用nUnit測試死鎖
謝謝
這是可能的,但它可能不是最好的事情。單元測試並不適合測試併發行爲,不幸的是沒有很多適合的測試方法。
NUnit不會對線程做任何事情。你可以編寫測試,開始幾個線程,然後測試它們的交互。但是這些開始看起來更像集成測試,而不是單元測試。
另一個問題是死鎖行爲通常取決於線程調度的順序。因此,很難編寫一個確定的測試來測試某個死鎖問題,因爲您沒有任何對線程調度的控制權限,由操作系統完成。您最終可能會遇到在多核處理器上有時會失敗的測試,但在單核處理器上通常會成功。
那麼它當然可以通過運行你在另一個線程代碼,並看它是否及時返回測試死鎖。下面是一些(很基本的)示例代碼:
[TestFixture]
public class DeadlockTests
{
[Test]
public void TestForDeadlock()
{
Thread thread = new Thread(ThreadFunction);
thread.Start();
if (!thread.Join(5000))
{
Assert.Fail("Deadlock detected");
}
}
private void ThreadFunction()
{
// do something that causes a deadlock here
Thread.Sleep(10000);
}
}
我不想說這是「最好的辦法」,但它是一個我發現有用的場合。
看看名爲「國際象棋」的Microsoft Project。 它旨在發現併發錯誤http://research.microsoft.com/en-us/projects/chess/
死鎖檢測相當於halting problem,因此目前在一般情況下不可解決。
如果您有一個特殊的問題需要防範,那麼可能會有特定的黑客來獲得至少一點安全性。但請注意,這隻能是黑客攻擊,絕不會100%。例如,這樣的測試可能總是在開發機器上傳遞,但從不在生產機器上傳遞。
要測試死鎖,您必須在單元測試中實現狀態圖並檢查當前狀態圖中的週期。狀態圖由作爲節點的資源和作爲邊的依賴性組成。 我不知道這樣的事情的實施,但那是理論。
單元測試測試數據輸入和輸出的正確性(主要是針對以後的點),而不是測試應用程序執行流的正確性。
馬克希思的想法似乎是合理的,但在學術上是錯誤的。
http://en.wikipedia.org/wiki/Halting_problem – bl4ckb0l7 2009-01-23 12:39:37