1. 程式人生 > >使用 Visual Studio 2015 對 C++ 程式碼執行單元測試

使用 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就會越來越少了!