Visual Studio 使用教程:如何編寫C ++ DLL的單元測試(上)
Visual Studio是功能完備的 IDE,可用于編碼、調(diào)試、測試和部署到任何平臺(tái),Visual Studio使用 .NET 開發(fā) iOS、Android 和 Web 應(yīng)用和游戲。
本演練介紹如何使用測試優(yōu)先方法開發(fā)本機(jī)C ++ DLL。(點(diǎn)擊此處到達(dá)下部分內(nèi)容)?;静襟E如下:
- 創(chuàng)建一個(gè)本機(jī)測試項(xiàng)目。測試項(xiàng)目與DLL項(xiàng)目位于同一解決方案中。
- 創(chuàng)建一個(gè)DLL項(xiàng)目。本演練將創(chuàng)建一個(gè)新的DLL,但是測試現(xiàn)有DLL的過程是相似的。
- 使DLL函數(shù)對測試可見。
- 迭代地?cái)U(kuò)充測試。建議一個(gè)“紅色-綠色-重構(gòu)”循環(huán),其中代碼的開發(fā)由測試主導(dǎo)。
- 調(diào)試失敗的測試。您可以在調(diào)試模式下運(yùn)行測試。
- 重構(gòu),同時(shí)保持測試不變。重構(gòu)意味著在不更改其外部行為的情況下改進(jìn)代碼的結(jié)構(gòu)。您可以這樣做以提高代碼的性能,可擴(kuò)展性或可讀性。因?yàn)槟康牟皇且男袨?,所以在對代碼進(jìn)行重構(gòu)更改時(shí),請勿更改測試。這些測試有助于確保重構(gòu)時(shí)不會(huì)引入錯(cuò)誤。
- 檢查覆蓋范圍。當(dāng)單元測試使用更多的代碼時(shí),它們會(huì)更加有用。您可以發(fā)現(xiàn)測試已使用了代碼的哪些部分。
- 將單元與外部資源隔離。通常,DLL依賴于您正在開發(fā)的系統(tǒng)的其他組件,例如其他DLL,數(shù)據(jù)庫或遠(yuǎn)程子系統(tǒng)。將每個(gè)單元與其依賴項(xiàng)隔離開來測試很有用。外部組件會(huì)使測試運(yùn)行緩慢,在開發(fā)過程中,其他組件可能不完整。
創(chuàng)建一個(gè)本機(jī)單元測試項(xiàng)目
- 在“文件”菜單上,選擇“新建”>“項(xiàng)目”。
- Visual Studio 2017及更早版本:展開已安裝>模板> Visual C ++>測試。Visual Studio 2019:將語言設(shè)置為C ++,然后在搜索框中鍵入"測試''。
- 選擇本機(jī)單元測試項(xiàng)目模板,或您喜歡的任何已安裝框架。如果您選擇其他模板(例如Google Test或Boost.Test),則基本原理相同,盡管某些細(xì)節(jié)有所不同。
- 在本演練中,測試項(xiàng)目名為NativeRooterTest。
- 在新項(xiàng)目中,檢查unittest1.cpp。
注意:
- 通過使用TEST_METHOD(YourTestName){...}定義每個(gè)測試。 您不必編寫常規(guī)的函數(shù)簽名,簽名是由宏TEST_METHOD創(chuàng)建的。宏生成一個(gè)實(shí)例函數(shù),該函數(shù)返回void。它還生成一個(gè)靜態(tài)函數(shù),該函數(shù)返回有關(guān)測試方法的信息。該信息使測試瀏覽器可以找到該方法。
- 使用TEST_CLASS(YourClassName){...}將測試方法分組為類。 運(yùn)行測試時(shí),將創(chuàng)建每個(gè)測試類的實(shí)例。測試方法的調(diào)用順序不確定。您可以定義在每個(gè)模塊,類或方法之前和之后調(diào)用的特殊方法。
- 驗(yàn)證測試是否在“測試資源管理器”中運(yùn)行:
- 插入一些測試代碼:
TEST_METHOD(TestMethod1) { Assert::AreEqual(1,1); }
請注意,Assert類提供了幾種靜態(tài)方法,可用于驗(yàn)證測試方法中的結(jié)果。
-
在“測試”菜單上,選擇“運(yùn)行”>“所有測試”,測試生成并運(yùn)行,出現(xiàn)“測試資源管理器”,該測試將顯示在“通過的測試”下。
創(chuàng)建一個(gè)DLL項(xiàng)目
以下步驟顯示如何在Visual Studio 2019中創(chuàng)建DLL項(xiàng)目。
- 使用Windows桌面向?qū)?chuàng)建C ++項(xiàng)目:在解決方案資源管理器中右鍵單擊解決方案名稱,然后選擇“添加”>“新建項(xiàng)目”。 將語言設(shè)置為C ++,然后在搜索框中鍵入“ windows”。 從結(jié)果列表中選擇Windows桌面向?qū)А?/span> 在本演練中,該項(xiàng)目名為RootFinder。
-
按創(chuàng)建。在下一個(gè)對話框的“應(yīng)用程序類型”下,選擇“動(dòng)態(tài)鏈接庫(dll)”,然后選中“導(dǎo)出符號(hào)”。
導(dǎo)出符號(hào)選項(xiàng)會(huì)生成一個(gè)方便的宏,可用于聲明導(dǎo)出的方法。
- 在主體.h文件中聲明一個(gè)導(dǎo)出的函數(shù):
聲明符__declspec(dllexport)使該類的公共成員和受保護(hù)成員在DLL外部可見。
- 在主體.cpp文件中,為該函數(shù)添加一個(gè)最小主體:
// Find the square root of a number. double CRootFinder::SquareRoot(double v) { return 0.0; }
將測試項(xiàng)目耦合到DLL項(xiàng)目
- 將DLL項(xiàng)目添加到測試項(xiàng)目的項(xiàng)目引用中:
- 在解決方案資源管理器中右鍵單擊測試項(xiàng)目節(jié)點(diǎn),然后選擇“添加”>“引用”。
- 在“添加引用”對話框中,選擇DLL項(xiàng)目,然后選擇“添加”。
- 在主體單元測試.cpp文件中,包括DLL代碼的.h文件:
#include "..\RootFinder\RootFinder.h"
- 添加使用導(dǎo)出功能的基本測試:
TEST_METHOD(BasicTest) { CRootFinder rooter; Assert::AreEqual( // Expected value: 0.0, // Actual value: rooter.SquareRoot(0.0), // Tolerance: 0.01, // Message: L"Basic test failed", // Line number - used if there is no PDB file: LINE_INFO()); }
- 構(gòu)建解決方案。 新測試將出現(xiàn)在“測試資源管理器”中。
- 在測試資源管理器中,選擇“全部運(yùn)行”。
您已經(jīng)設(shè)置了測試和代碼項(xiàng)目,并確認(rèn)可以運(yùn)行在代碼項(xiàng)目中運(yùn)行功能的測試。現(xiàn)在您可以開始編寫實(shí)際的測試和代碼。
本文內(nèi)容較多,分為上下兩部分進(jìn)行介紹,(點(diǎn)擊此處到達(dá)下部分內(nèi)容)。
想要購買Visual Studio正版授權(quán),或了解更多產(chǎn)品信息請點(diǎn)擊【咨詢在線客服】