2011-05-11 85 views
20

這個問題剛剛出現在我的腦海裏,我想問這裏。如何對一些輸入進行無限循環的單元測試?

這種情況是故意的,我只是寫一個無限循環的循環。我如何去做單元測試呢?

我問這是因爲,這種情況可能發生在代碼的任何地方。說我的方法委託給其他幾種方法,我想知道

  • 它是如何跑進一個無限循環
  • 什麼組輸入導致它
  • 調用哪個方法(此方法)造成這

我沒有代碼爲此編寫。這個問題純粹是爲了知識的緣故,如果將來出現這種情況該怎麼辦。請回復。

+1

是無限循環故意嗎?此外,谷歌「停止問題」。 – dlev 2011-05-11 04:41:58

+0

我可以知道提問者關閉的原因,以及爲什麼要關閉它? – Shankar 2011-05-11 04:42:30

+0

@dlev,這是故意的。當我想到可能發生這種情況時,這只是我想到的 – Shankar 2011-05-11 04:43:17

回答

11

如何對某些輸入進行無限循環的單元測試?

您可以測試幾乎相反:「如何單元測試的方法,這樣的方法將不超過XXXX毫秒運行的時間更長一些輸入」。如果這個測試失敗了,你可能會發現一個無限循環的候選人。

NUnit 2.5有一個TimeoutAttribute,如果測試花費的時間超過給定的毫秒數,測試就會失敗。

7

我希望你的意思是某種消息泵/事件處理循環。 (大多數無限循環都不好)。

我會確保循環委託給一些處理輸入的類。徹底測試此課程。

循環構造失敗的概率很小..所以我會通過驗收測試或手動測試。

這有點類似於測試可執行文件的Main函數。這裏的訣竅還是確保Main代表一個可測試的類。

3

unitesting的目的是測試程序中每個最簡單的單元。

最簡單的單位通常是執行單一任務的函數,所以爲了統一你的無限循環,你必須提取這個循環可以在一個獨立調用的獨立函數中完成的每個任務你將能夠調用這些函數給予他們所有可能的參數,以便測試你的函數應該能夠處理的不同szenarios。作爲一個函數的無限循環不必被單元化,而是它內部的更小的任務。

7

有循環委託迴路檢測到注入依賴的功能:

interface IShouldLoop 
{ 
    bool ShouldLoop(); 
} 

class ClassToTest 
{ 
    private final IShouldLoop shouldLoop; 

    public ClassToTest(IShouldLoop shouldLoop) 
    { 
     this.shouldLoop = shouldLoop; 
    } 

    public void MethodToTest() 
    { 
     while(shouldLoop.ShouldLoop()) 
     { 
      // do whatever 
     } 
    } 
} 

您可以測試它代表迴路檢測到IShouldLoop依賴每一次,你可以控制你的測試循環,所以它只循環你想要的次數。在生產環境中,使用始終返回true的IShouldLoop實例對其進行實例化。

+0

+1。非常好的方法。 – 2011-05-14 21:33:10

+0

我喜歡這種方法。我認爲'LoopCondition'和'isTrue()'的名字更有意義。 – byxor 2017-04-02 22:31:05

+0

另一種選擇是將該方法標記爲虛擬並覆蓋它以進行測試\ – Mohsen 2017-06-19 10:52:46