使用 Visual Studio 2015 對 C++ 程式碼執行單元測試
程式碼寫多了,往往規模會越來越大,這時候就有必要保證程式碼的穩定性了;不過我從網上看到的單元測試貌似大多都是用的 JUnit, 難道 C++ 就沒有了嗎?我從網上找了一些方法試了下其實挺簡單的。下面我以一個示例作說明。(如果你有準備好的待測程式碼可直接看建立單元測試專案那裡。)
建立一個 Win32 空專案“stg”並新增下面的程式碼用作測試。這裡我建立了一個結構體用來表示一個物體,有X,Y,半徑這些變數,還有一個用來表示另一個物體是否在它的半徑內的函式,是則返回1,否則為0。
【stg.h】
#pragma once struct SpriteType { SpriteType(); void SetValue(float, float, float, float); int IsShotBy(SpriteType*); private: float posX, posY, shotRadius, sensedRadius; float _temp0; };
【stg.cpp】
#include<cmath> #include"stg.h" SpriteType::SpriteType() :posX(0.0f), posY(0.0f), shotRadius(0.0f), sensedRadius(0.0f) { } void SpriteType::SetValue(float x, float y, float rshot, float rsensor) { posX = x, posY = y, shotRadius = rshot, sensedRadius = rsensor; } int SpriteType::IsShotBy(SpriteType *pOtherSprite) { _temp0 = sqrtf((pOtherSprite->posX - posX)*(pOtherSprite->posX - posX) + (pOtherSprite->posY - posY)*(pOtherSprite->posY - posY)); return (int)(_temp0 < shotRadius); }
(為了簡單我把 main 函式省略了。)
然後是建立單元測試專案。在這個解決方案中建立一個名為 stgTest 的單元測試工程(命名規則是“專案名”+Test),
建立好後在引用中新增待測專案的引用(右鍵引用選擇“新增引用專案”),
點確定,它應該會出現在單元測試工程的引用中。
然後在“stg”專案上右鍵選擇屬性,將其配置型別改為靜態庫(你可以在測試完後改回為應用程式)
接下來找到單元測試的程式碼,其檔名預設為“unittest1.cpp”,最好也改為“stgTest.cpp”以便區分;在這個程式碼中有一個預設的方法“TestMethod1”,它是由巨集“TEST_METHOD”定義的一個函式,這個函式就是用來作測試的,執行測試時它裡面的程式碼會執行,測試結果由 Assert 中的一系列函式決定。另外兩個巨集“TEST_METHOD_INITIALIZE”,“TEST_METHOD_CLEANUP”分別用於定義測試開始前與結束後執行的函式,通常將函式名定義為“SetUp”和“TearDown”(或許是因為 JUnit 中就是這樣的?)。這裡我將預設的“TestMethod1”改為“TestShot”(命名規則為 Test+“函式名”),然後包含標頭檔案 #include“..\stg\stg.h”,加入測試程式碼後形成下面這個樣子:
【stgTest.cpp 中的部分程式碼】
namespace AmIShotTest
{
TEST_CLASS(UnitTest1)
{
private:
SpriteType *s1, *s2;
public:
TEST_METHOD_INITIALIZE(SetUp)
{
s1 = new SpriteType();
s2 = new SpriteType();
Logger::WriteMessage("Test initialized.\n"); //用於輸出資訊
}
TEST_METHOD_CLEANUP(TearDown)
{
delete s1;
delete s2;
Logger::WriteMessage("Test completed.\n");
}
TEST_METHOD(TestShot)
{
s1->SetValue(2.0f, 3.0f, 1.2f, 1.5f);
s2->SetValue(2.2f, 3.1f, 0.0f, 0.0f);
Assert::AreEqual<int>(1, s1->IsShotBy(s2));
Logger::WriteMessage("Shot tested.\n");
}
};
}
上面 AreEqual 那句中,模板填入待測值的型別,第一個引數為預測值,第二個為實際執行的結果,若相等則測試成功,否則為失敗。寫好程式碼後選擇生成 stgTest 專案,然後在測試,視窗中開啟測試資源管理器,如果生成沒有問題就可以在這裡看到測試項了,選擇執行即可。
既然學會了如何使用單元測試,那麼以後寫程式碼就不要忘了用哦!這樣你的程式碼中的BUG就會越來越少了!