簡體   English   中英

使用線程,事件和私有方法測試類

[英]Testing classes with threads, events, and private methods

普遍共識

我已經做了很多關於測試復雜類和私有方法的主題的閱讀。

普遍的共識似乎是:

  • “如果你需要測試私有方法那么你的課程設計很糟糕”
  • “如果你的課很復雜,那么你需要把它分開”

所以,我需要你的幫助。

問題類

所以我有一個相對簡單的類,它的長期工作是:

  • 輪詢數據源
  • 做一些非常簡單的數據映射
  • 將數據發送到其他地方

的方法,另外:

  • 它必須能夠通過在某些錯誤的情況下重試各種任務而具有很強的容錯能力。

測試問題

該類的重點是抽象出許多容錯和線程...基本上通過使用一個簡單的Timer類和一些內部列表來跟蹤錯誤等。

由於Timer,某些方法在異步上被調用在不同的線程上...另外一堆方法依賴於全局私有字段。

我應該如何測試這個類...特別是因為有很多方法是私有的?

歡呼的家伙

我將提取代碼以將數據輪詢到可以模擬的單獨類中,並且還提取出於相同原因發送該數據的代碼。 您可能希望提取數據映射代碼,具體取決於它的簡單程度。

我絕對會在單元測試中使用模擬計時器,否則你的測試很難設置並且運行緩慢。 您可以在構造函數中傳入計時器,也可以公開可以設置的屬性。 我經常在構造函數中創建一個常規計時器,然后從我的單元測試中覆蓋它。

您也可以提取重試邏輯,以便可以與其他代碼分開測試。 傳遞代碼的代理以嘗試重試可能是將數據代碼與重試邏輯分離的一種方法。 您還可以使用IEnumerableyield語句生成數據並將其提供給重試代碼。 本質上,我正在尋找方法來使重試代碼不直接調用它應該嘗試重試的目標代碼。 這樣可以更容易地測試並生成所有可能的錯誤,盡管只需模擬目標代碼就可以獲得一些相同的好處。

如果您確實需要測試多線程方案,那么可以使用一些工具來協調測試中的線程。 其中一個是我創建的Java MultithreadedTC名為TickingTest的端口。

你可以嘗試使用像JMock這樣的東西。 這將讓你用你可以控制的模擬計時器替換真正的計時器。 然后,您可以設置以定義的順序觸發方法調用的測試用例,還可以通過創建模擬數據源來設置錯誤條件。

編輯:哎呀! 沒看到C#標簽。 也許有一個C#等同於JMock。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM