2012-03-13 14 views
7

可測性我想了解設計在C++中,可測試的應用程序也許相比於C#的最佳方法(因爲它我的背景和偉大的用於測試)設計在C++

我已經習慣了編碼到接口,依賴注入,控制框架的反轉以及模擬對象。由於C#有很多不同的語言功能,我不確定有多少模式仍然適用。我也想象C++的獨特功能/侷限性可能適用於不同的測試策略。

我已經看過單元測試框架,我喜歡Google Test,但編寫我的新代碼以使其可測試也很重要。

  • 是否有任何開源項目可以推薦爲C++ 測試做得對嗎?
  • 任何有關此主題的更詳細的書籍或文章?
  • 建議額外的框架/庫

由於

回答

3

我現在處於完全相同的狀態。來自C#的背景,現在我正在編寫新的(並擴展傳統的)C++應用程序。

我想共享背景給我們留下了常見的問題。我很驚訝,遺留應用程序中的依賴關係與我們的類緊密耦合。

正如您似乎已經強調的那樣,擔心的可能是C#中的最佳實踐並不是C++中的最佳方法。經過大量研究,我自己的一些堆棧溢出問題以及一些原型,我最終得到了一個C++架構,這在很多方面反映了我在C#中最棒的工作方式。

下面是我使用的主要負責:

  • 依賴注入

    構造函數爲我們班採取接口,我們可能要嘲笑作爲參數的依賴關係。在某些情況下,這意味着爲依賴項編寫包裝,例如boost :: filesystem,這主要是在模板頭文件中實現的。在我看來,值得我們花費很小的努力,更鬆散地將我們從圖書館中耦合起來,這些圖書館可能會改變或者被我們調換,並允許我們用模擬實現進行單元測試。

  • 隨你行!

    這應該不言而喻,但在您編寫該類時編寫測試可讓您在可測試性方面對設計進行完整性檢查。我不在乎你先測試,做TDD,還是不管你怎麼稱呼它,我的理念就是在開始在你的代碼庫中使用這個類之前編寫你的測試。

  • 谷歌測試爲我們的單元測試框架

    到目前爲止,我已經使用Cxxtest(遺留應用程序)和谷歌測試。Google Test在執行時提供了很多靈活的選項來確定您運行的測試集。我們將我們的類命名約定分爲UnitTest_xxxx和IntegrationTest_xxxx。然後在命令行中,我可以告訴gtest只能用一個名稱,另一個或兩者來運行測試。然後我的構建服務器可以在每一個檢查執行,在整個測試套件在夜間長時間運行測試,但是單元測試。Cxxtest可以做同樣的事情,但有更多的工作,一般是笨重的原因有很多。

  • 模擬谷歌在測試時間

    依賴注入的明顯的好處是在測試過程中使用嘲笑的對象模仿對象。人們可以簡單地寫每個接口的假冒實現,但谷歌模擬允許快速旋轉起來假冒的對象,並提供您所期望的一樣起訂量或RhinoMock良好的.NET模擬框架典型的檢查。

1

在某些場合,我已經看到了你提到的(編碼成接口,依賴注入,控制框架反轉,模擬對象)的技術被濫用,並最終使事情變得更難。雖然這些技術可以得到很好的使用,但有時我會看到他們被傳播,就好像它們是通向質量的唯一途徑。我不同意。

從我的角度來看,爲保證C代碼質量++使用面向對象技術最重要的發展技術如模塊化,開放 - 關閉原則,自文件,命令查詢分離等

特別是,兩種技術,我覺得重要的是通過合同設計(見問題What is the best way of implementing assertion checking in C++?Design by Contract in C++?)和單元測試(請參閱相關的問題123)。對於他們兩個,你都有C++中的合理工具,如鏈接問題所示。

+0

接口依賴注入是主要的工具,使單元測試成爲可能。 – 2013-05-03 16:13:00

+0

@DanBryant嗯,C++沒有接口,但人們在它裏面進行單元測試。 – 2013-05-03 16:15:28

+1

良好的對應點。我不假裝只有一種方法來正確設計和測試。 +1提供新鮮的想法。 「合同設計」實際上是一種習慣,如果C#成功地使用了這種做法,那麼在我的新環境中就會忘記。部分原因在於.NET代碼合同使得它在C#中變得如此簡單。我已經習慣了我們的編碼對合同的接口 – Evan 2013-05-03 16:48:35

0

我可以推薦UnitTest++AMOP做測試驅動開發。兩者都非常簡單,並且非常強大。如果您不需要Google測試中的所有功能,這是一個不錯的選擇。

它可能看起來像他們,因爲他們沒有在一段時間更新過時,但我還沒有同他們進行了單一的問題。