2012-07-06 109 views
3

我正在爲消息傳遞系統編寫集成測試。大多數測試在流程的各個階段收集messgaes及其各種代碼路徑端到端的計數。我目前的測試已經變得非常干擾,因爲我在這些消息傳遞組件中有許多public static AtomicInteger - 我在處理消息時增加它們 - 然後測試對這些計數作出斷言。非侵入式集成測試

最糟糕的部分是,我將不得不在刪除這些計數器時將其部署到易於增加錯誤的產品中。

我該如何設計自己的測試,以便通過這些組件傳遞消息的計數,而不需要在我的課程中實際填充計數器?我正在考慮對實際組件進行子分類並覆蓋方法,並將子計數器移到子類方法中 - 並在我的測試中使用這些子類 - 關於更好設計的任何其他想法?

+0

整套集成測試真的是最好的解決方案嗎?如果你想測試內部,請在單元測試中進行。集成測試只能用於測試外部公開的功能。 – 2012-07-06 17:31:23

+0

考慮到使用情況的數量,覆蓋所有代碼路徑組合所需的單元測試數量變得過高 - 幾乎會導致單元測試疲勞。端到端測試是強制性的。 – Bhaskar 2012-07-06 17:38:19

+0

我不會刪除跟蹤系統執行統計信息的代碼。您可以使用JMX公開這些信息,並設置監控以關注生產中的系統。我會嘗試使用他人已經提供的建議來設計它。 – 2012-07-06 17:46:22

回答

1

用靜態散射代碼AtomicInteger只用於測試當然是一個壞主意。這裏有一些方法,我建議:可閱讀信息的非侵入性的方式

  • 增加的可能性在所有組件安裝聽衆數

    • 使用或其他監控機制的中間件。在生產環境中使用null或空對象模式,而在測試中安裝一些簡單的偵聽器來計數調用/消息。 會幫助你。

    • 使用或其他儀器技術,類似於上述。

    • 測試副作用和輸出!不要對流程中的確切消息做出假設,只是看整體結果是否正確。這樣你的測試更加靈活,並且專注於正在測試的內容。不幸的是,當某些事情中斷時,調試需要更多時間

  • 1

    我不得不在前一段時間處理完全相似的情況。我有幾個組件處理一些消息,然後將它們傳遞給其他組件。我想出了這個設計:

    • 每個組件實現已使用notify方法來通知,並通過接收到的消息給其他組件
    • 每個組件都認爲需要的其他組件列表的接口時通知一收到消息
    • 在您的測試中,您所要做的就是創建一個虛擬處理器,實現上述定義的接口並註冊所有組件。這樣,只要系統中有新消息流入,虛擬處理器就會收到通知。在生產過程中,不會有虛擬處理器,這應該使您的代碼適用於測試和產品發佈。
    +0

    不採用任何這樣的接口的組件將被迫實現這個接口 - 這是同樣侵入性的,雖然我認爲這是一個比我目前使用的更清潔的方法。 – Bhaskar 2012-07-07 09:22:44