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