2011-09-12 62 views
3

我正在接管通過ATL公開組件的項目。我在哪裏放置單元測試源並暴露內部組件?

我看到兩個主要區域爲單位測試,以覆蓋與此設置:

  • 測試內部部件(可以或可以不被經由COM曝光)
  • 測試的外部暴露的部件(又名測試暴露的接口)

當前該項目的所有內部組件都在解決方案內進行單元測試。它們由預編譯標誌啓用,該標誌將其編譯並在運行時執行。

從我一直在做的研究,看來該「規範」是將單元測試在不同的子項目,並有單元測試的主要解決方案供應鉤來訪問內部組件。通過這種設置,單元測試解決方案將設置對正在測試的解決方案的依賴性。這是真正的「規範」,還是有很多人在那裏被測試的解決方案裏面那個地方他們的單元測試框架(又名單元測試子項目,而是寬鬆CPPS是#ifdef「如果沒有提供預處理標誌,那麼退出)?

看來,目前正在使用的單元測試框架是cppunit,我正在考慮將它切換到gtest,並試圖將所有東西都移到不同的子項目中,但我想確保這些努力值得長跑。我想到的

一個辦法是__declspec類進行測試,當預處理器定義指定他們才暴露。然後,單獨的單元測試子項目將使預處理器能夠告訴主要解決方案來揭示內部信息。我不確定這是否是最佳路線。

所以我的問題是:

  1. 是把單元測試在一個單獨的(子)項目,並揭露一個將要測試的源組件(或者通過掛鉤,露出類定義規範,等等)?
  2. 從COM DLL公開內部組件的最佳方式是什麼?
  3. 預處理器標誌是否會使內部組件的__declspec被測試爲壞主意?是否有其他人在單元測試中完成了這項測試,在正常操作期間被測試的項目通常不會暴露?

感謝您的意見!

+0

UnitTest ++也是一個非常令人愉快的選項。 –

回答

4

另一個團隊中的某個人表示他們的團隊將所有的單元測試放在單獨的項目中,並且能夠通過靜態庫暴露內部。這對我來說很有意義,因爲它有助於模塊化並提供很多其他好處。因此,每個代碼的主要耦合將是一個靜態庫(不會太過分;)),並且對於每個靜態庫,您將擁有一個單獨的單元測試解決方案。然後你的主DLL變成一個薄包裝,暴露出必要的項目。

因此,解決辦法是這樣的:

MainSolution

  • ProjCommonLib
  • ProjExportsLib
  • ProjImportsLib
  • ProjOtherStuffLib
  • COMDLL-PROJ
  • UnitTestsFolder
    • ProjCommonLibTests
    • ProjExportsLibTests
    • ProjImportsLibTests
    • ProjOtherStuffLibTests
    • COMDLL-ProjTests

這種類型的設置允許單元測試上設置的依賴關係靜態李b並且可以完全訪問內部,而無需處理__declspec。這似乎更清晰,因爲DLL沒有任何性能影響的模塊化,因爲其他庫只是,靜態庫。

我把這個作爲一個「答案」,看看它是否得到任何最後票(又名,「這個答案是一個很好的方法,也是我所做的」)。如果這是一個不好的解決方案,請發佈您的答案。

+4

好的方法,這也是我所做的。當我不使用靜態庫來包含代碼時,在單元測試項目中,我將$(SolutionDir)$(ProjectName)Debug \ obj文件夾添加到鏈接器的其他庫目錄中。 –

+0

這很聰明。我也必須嘗試。 – BabelFish

0

使用#ifdef塊可能不會觸發重新編譯,對於這個原因,我相信把單元測試的另一個項目是一個更好的選擇。

1

我會說你有過是否嵌入現有項目中測試或創建一個新的自由選擇權。我選擇了使用cppunit測試的前一種方法,因爲這意味着您不需要創建新項目,但是對於C#項目,我使用Visual Studio的單元測試框架來完成創建和維護單獨項目的繁重工作。

我從未有過任何問題,我#ifdef「版塊不重新編譯 - 依賴檢查認爲到(如果你在一個單獨的DLL曝光他們,那麼使用出口那麼這將是一個問題

我很多年來我一直在使用cppunit,而且我最近只使用了gtest。我會說雖然gtest的特性非常豐富,但是存在相當多的結構性差異,這將使其成爲端口很大的工作。如果現有的測試是在cppunit,那麼我建議繼續這一點。

有一件事我喜歡關於cppunit哪些(據我一直能找)在GTEST不支持的是一個固定裝置內的第一次失敗會導致燈具出現故障,那麼你可以這樣做:

CPPUNIT_ASSERT(pointer!=NULL); 
CPPUNIT_ASSERT(pointer->deferenceIt()); // if the pointer was null it would have returned above 

GTEST將繼續在這種情況下和崩潰在第二行中運行。如果cppunit測試依賴於這種行爲,那麼這將使它更難以移植。

+0

我知道gtests「在接下來的錯誤恢復」,但從來沒有想過的弊端。你說的對。 – BabelFish

+0

另外,我公司另一個團隊的成員提到,切換到gtest可能比它更值得工作,並且還建議我只留在cppunit中。很高興聽到其他人同意。 – BabelFish

+0

我同意。我喜歡gtest,我會考慮將它用於新項目,但如果有現有的cppunit測試套件,那麼我會堅持。 –

相關問題