2012-01-10 43 views
5

我有一個程序,可以將工作項目從阻塞隊列中取出,並同時對它們進行處理。我意識到這是一個非常鬆散的描述,但任何人都可以提出一個單元測試策略/想要測試什麼?Java - 併發/阻塞隊列單元測試策略

+1

你想要測試什麼,BlockingQueue或併發處理對返回值的有效性? – 2012-01-10 23:11:02

+0

我已經測試了阻塞隊列處理程序工作的實際工作的有效性,但我想測試圍繞它的操作的代碼。 – 2012-01-10 23:32:58

+0

對併發的測試非常棘手:您可以擁有一個非常糟糕的多線程程序,它可以在某些平臺(例如單核CPU)上完美地通過所有測試,但在其他平臺上失敗。即使您的測試在多核CPU上成功,線程調度也會因不同的操作系統而有所不同,並且可能會在別處失敗。 – toto2 2012-01-11 00:24:25

回答

2

在java.util.concurrent中使用工作隊列機制並依賴它們來測試它們的代碼。然後,測試你的工作人員,確保它做到了正確的事情。如果它獨立於其他應該足夠的線程。否則,您可能需要在符合您的生產環境的hardware/os/jvm配置上提出集成測試策略。

2

您需要設計它進行測試。

所以具體的建議:

  • 確保您可以將測試類或嘲笑到隊列
  • 代碼的一些早期的模擬,需要更長的時間,並確保他們是不是完成了第一批(演示併發性)
  • 確保您的結果集大小與所有測試相同。
  • 確保您的結果在分配給最長測試的時間後才完成。

嗯,這一切都源於能夠將嘲笑/測試類注入到隊列中。

+0

謝謝,這些都是好主意。 – 2012-01-10 23:34:04

2

這種類型取決於您的課程進行的處理類型,以及取消的項目。例如,假設他們將項目寫入數據庫。你可能想要這樣的測試。

  • 單線程可以從隊列中拉出一個項目並將其保存到數據庫中。
  • 兩個線程可以同時從隊列中取出項目,並且如果第一個線程先嚐試保存,則會保存數據。
  • 兩個線程可以同時從隊列中取出項目,並且如果第二個線程先嚐試保存,則會保存數據。
  • 五十個線程(或任何限制適用於您的程序)可以同時從隊列中拉出項目,並正確保存數據。

如果您正在使用某個JDK阻塞隊列實現或來自第三方的實現,請確保您不要嘗試測試阻塞隊列類本身的行爲。當然,如果你編寫了自己的代碼,那麼你需要編寫更多的測試。

希望這會有所幫助。

+0

謝謝,這些都很棒。 – 2012-01-10 23:35:15