2009-01-23 153 views
5

我是新手單元測試和nUnit(2.48)。我想編寫一個測試方法,其中的失敗案例是死鎖。這可能嗎?顯然,nUnit默認不知道方法需要執行多長時間,所以我必須編寫代碼在單獨的線程上完成這項工作,然後中止它並拋出異常,如果花費的時間比我定義的時間還要長,有一個更好的方法嗎?使用nUnit測試死鎖

謝謝

回答

5

這是可能的,但它可能不是最好的事情。單元測試並不適合測試併發行爲,不幸的是沒有很多適合的測試方法。

NUnit不會對線程做任何事情。你可以編寫測試,開始幾個線程,然後測試它們的交互。但是這些開始看起來更像集成測試,而不是單元測試。

另一個問題是死鎖行爲通常取決於線程調度的順序。因此,很難編寫一個確定的測試來測試某個死鎖問題,因爲您沒有任何對線程調度的控制權限,由操作系統完成。您最終可能會遇到在多核處理器上有時會失敗的測試,但在單核處理器上通常會成功。

7

那麼它當然可以通過運行你在另一個線程代碼,並看它是否及時返回測試死鎖。下面是一些(很基本的)示例代碼:

[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); 
    } 
} 

我不想說這是「最好的辦法」,但它是一個我發現有用的場合。

+0

http://en.wikipedia.org/wiki/Halting_problem – bl4ckb0l7 2009-01-23 12:39:37

5

死鎖檢測相當於halting problem,因此目前在一般情況下不可解決。

如果您有一個特殊的問題需要防範,那麼可能會有特定的黑客來獲得至少一點安全性。但請注意,這隻能是黑客攻擊,絕不會100%。例如,這樣的測試可能總是在開發機器上傳遞,但從不在生產機器上傳遞。

3

要測試死鎖,您必須在單元測試中實現狀態圖並檢查當前狀態圖中的週期。狀態圖由作爲節點的資源和作爲邊的依賴性組成。 我不知道這樣的事情的實施,但那是理論。

單元測試測試數據輸入和輸出的正確性(主要是針對以後的點),而不是測試應用程序執行流的正確性。

馬克希思的想法似乎是合理的,但在學術上是錯誤的。