2014-03-12 95 views
0

我正在研究一個已存在10多年的Visual C++項目。我們剛剛決定開始添加單元測試。 Out小組正在討論兩種基本的方法,以允許單元測試針對給定的類進行編寫。要麼我們可以派生一個類並在派生類中添加我們需要的單元測試,或者我們可以創建一個基類並將我們需要的僅移動到基類,從中派生出我們現有的類。將單元測試添加到現有的Visual C++項目

選項1:
類CExistingClass
類CDerivedClass:CExistingClass

選項2:
類CBaseClass
類CExistingClass:CBaseClass

選項1的優點是,它不需要任何對現有類的更改 - 單元測試所需的任何內容都將嚴格添加到單元類項目中,並且不會向我們現有的庫添加任何內容。不足之處在於,當它嘗試鏈接時,這是一場完全災難。爲了讓它適用於我們的一個庫,我們必須添加一個單獨的後期構建步驟來執行庫的靜態鏈接版本以及將各個OBJ文件添加到其他依賴項。

選項2的優點是鏈接不是一個問題 - 您只能拾取基類並測試其中的項目。不足之處在於這意味着修改現有的代碼,並且通常會降低軟件的可讀性(在10年以上的版本中,這已經太低了)。它也打開了多重繼承問題的大門,我很想避免這些問題。

我一直無法找到其他任何人通過這個決策過程的討論,並且有興趣看看其他地方已經決定了什麼,並且獲得任何經驗教訓,或者更好,然後聽到一個選項3,考慮。

回答

3

我會建議您的應用程序分爲具有明確定義的接口靜態庫。清晰的界面邊界是關鍵。您可以將靜態庫直接鏈接到測試DLL中。考慮每個庫有一個測試DLL。

您可以將導入庫直接鏈接到測試DLL中。這使得您可以輕鬆訪問您的測試功能。對於非導入庫,您仍然可以使用GetProcAddress FreeLibrary路由來獲取在測試中直接調用的DLL導出。

或者,如果你從EXE建設有OBJ文件,添加後生成作用的OBJ文件組合成一個靜態庫,你可能然後在您的測試項目。

如果事情是雜亂:拔出的最小片的可單獨測試代碼。

必須閱讀:與傳統代碼一起高效工作,也由Michael Feathers,Prentice Hall,2004提供。

1

也許我不完全理解你的問題,你會測試現有的代碼還是重構現有的代碼以用於測試目的?

從技術上講,你不必改變你的代碼,但只測試你的類的公共接口,如果問題是如何更好地解耦測試目的,我認爲第二選擇更好,新的基類將是抽象的,但也許我已經錯過了話題

相關問題