2010-07-15 25 views
15

我想知道是否有一些能夠輕鬆編寫多線程測試的單元測試框架?如何編寫多線程單元測試?

我想像這樣: 通過n個線程同時調用m次特殊的測試方法。在所有測試線程完成之後,將會調用應該驗證一些約束的斷言方法。

我目前的做法是在junit測試方法中創建Thread對象,手動循環每個run()方法中的真實測試用例,等待所有線程,然後驗證斷言。但是使用這個,我爲每個測試都有一個大的樣板代碼塊。

你有什麼經驗?

+1

我問了一個有關(不重複)的問題了一段時間回來,並得到了人們的一些很好的答案: http://stackoverflow.com/questions/537014/using-tdd -to-drive-out-thread-safe-code – 2010-07-15 13:56:39

+0

另請參見https://stackoverflow.com/questions/12159/how-should-i-unit-test-threaded-code – Raedwald 2017-11-12 10:44:06

回答

11

有​​,還有GroboUtils

很多年前我已經使用了GroboUtils,並且完成了這項工作。 ConTest更新,並且現在是我的首選起點,因爲它不僅僅依靠試驗和錯誤,儀器強制執行特定的線程交叉,提供確定性測試。相比之下,GroboUtils MultiThreadedTestRunner只是簡單地運行測試,並希望調度程序產生交錯,導致線程錯誤出現。

編輯:另見ConcuTest這也強制交錯和自由。

+0

ConTest看起來不錯,但似乎不是免費提供(我只能找到一個試用版)。 – MRalwasser 2010-07-15 14:16:10

+0

還有ConcuTest,我已添加爲編輯。 – mdma 2010-07-15 15:59:34

4

FindBugs fame的Bill Pugh還有MultithreadedTC

+0

+1:我以前使用過它,並且發現它非常適合生成特定的交織和斷言您實現的屬性。 – 2010-07-16 10:42:33

0

只使用併發庫會簡化你的代碼。你可以把你的鍋爐代碼轉換成一種方法。

喜歡的東西

public static void runAll(int times, Runnable... tests) { 

} 
+0

這不回答這個問題。是的,代碼會更簡單,並且可以消除一些風險,但仍然應該以某種方式進行測試。 – 2010-07-19 08:25:43