2013-04-02 101 views
7

我目前正在調查我們應該如何在即將推出的項目中執行測試。爲了在開發過程早期發現錯誤,開發人員將在實際代碼(TDDish)之前編寫單元測試。單元測試將集中在單元上(這種情況下的一種方法),因此依賴性會被嘲弄等等。從單元測試到集成測試的有效轉換

現在,我還想在與其他單元交互時測試這些單元因爲單元測試已經寫好了,所以我認爲應該有一個有效的最佳做法來做到這一點。我的想法是,單元測試將被重用,但被嘲弄的對象將被刪除並替換爲真實的對象。我現在不同的想法是:

  • 在每個測試類中使用全局標誌來決定是否應該使用模擬對象。此方法將需要幾個if語句
  • 使用工廠類創建「instanceWithMocks」或「instanceWithoutMocks」。這種方法對於新開發人員來說可能會很麻煩並且需要一些額外的類
  • 將集成測試與單元測試分開在不同的類中。然而,這將需要大量的冗餘代碼和維護測試用例將是工作的兩倍

我看到這些方法的所有方法都有優點和缺點。哪些是首選的,爲什麼?是否有更好的方式從單元測試有效地轉換到集成測試?或者這通常以其他方式完成?

回答

1

我同意絕大多數其他答案,即unittesting應單獨從集成測試(選項3)

但我不同意你的禁忌參數:

[...]這(從分隔條件集成測試單元),但是將 需要大量的冗餘代碼和維護測試案例會工作的兩倍

生成測試數據的對象可以是一個大量的工作,但這是可以重構測試輔助clases又名ObjectMother可以從 單元測試和集成測試中使用,所以沒有必要冗餘有

在單元測試中,您可以檢查受測試的類的不同條件。

對於集成測試,不需要重新檢查這些特殊情況。 而是檢查組件是否一起工作。

您可能有單元測試對於其中將引發異常4種不同的情況。 對於集成,不需要重新測試所有4個條件 一個與異常相關的集成測試足以驗證集成系統可以處理異常。

1

像Ninject/Autofac/StructureMap這樣的IoC容器可能對您有用。單元測試可以通過容器來解析被測系統,註冊是否有嘲笑或真實對象只是註冊的問題。與您的工廠方法類似,但IoC容器是工廠。新開發人員需要一點培訓才能理解,但任何複雜系統都是如此。這樣做的缺點是註冊情況可能會變得相當複雜,但是對於任何給定的系統來說,難以說是否而沒有嘗試它。我懷疑這是你沒有找到任何似乎確定的答案的原因。

5

我會去的第三個選項

  • 單獨從不同 類的單元測試的集成測試。然而這將需要大量的冗餘代碼,並且保持測試用例將是工作的兩倍。

這是因爲單元測試和集成測試有不同的目的。單元測試表明單獨的一項功能是孤立的。集成測試表明,不同的功能塊在彼此交互時仍然有效。

因此,對於單元測試,您希望嘲笑事物,以便您只測試一項功能。

對於儘可能少的集成測試模擬。

我會讓他們在單獨的項目中。在我的地方運行良好的是使用NUnit和Moq進行單元測試項目。這是寫入代碼時寫入的TDD。集成測試是Specflow/Selenium,功能文件是在產品負責人的幫助下編寫的,因此我們可以驗證我們是否提供了所有者想要的東西。

這確實會在短期內創造額外的工作量,但會導致更少的錯誤,更輕鬆的維護和交付匹配要求。

1

集成測試應該與您的單元測試不同的類,因爲您正在測試不同的行爲。我認爲集成測試的方式是,它們是您在確保一切協同工作時執行的方法。他們會將輸入用於應用程序的某些部分,並確保返回預期的輸出。

1

我認爲你搞亂了單元測試和集成測試的目的。 單元測試用於測試單個類 - 這是低級API。集成測試正在測試班級如何合作。這是另一個更高級別的API。 通常,您不能在集成測試中重用單元測試,因爲它們表示不同級別的系統視圖。 使用spring context可能有助於設置集成測試的環境。

1

我不確定重複使用單元測試與真實對象而不是嘲笑是實施集成測試的正確方法。

單元測試的目的是驗證從外部世界隔離的對象的基本正確性。嘲笑在那裏確保隔離。如果你用真正的實現替代它們,你實際上最終會測試完全不同的東西 - 大部分同一鏈對象的正確性,並且你多次重複測試它。

通過使集成測試不同於單元測試,您將能夠選擇要驗證的系統部分 - 通常,測試意味着配置,I/O,與第三方的交互的部分是個好主意第三方系統,用戶界面或其他任何單元測試都很難涵蓋的內容。

相關問題