[VC++][單元測試]使用VS2012內建的C++測試架構進行單元測試

  • 4324
  • 0

[VC++][單元測試]使用VS2012內建的C++測試架構進行單元測試

前言

在軟體開發的過程中,單元測試(Unit testing)是一個重要的coding步驟,可以讓你的程式碼品質大幅提升、協助你進行良好的程式架構設計,單元測試是針對程式單元(軟體設計的最小單位)來進行正確性檢驗的測試工作,在程序化編程中,一個單元就是單個程式、函式、過程等;對於物件導向編程,最小單元就是方法,包括基礎類別(超類)、抽象類、或者衍生類別(子類別)中的方法。

想要在VC++專案中,進行單元測試的Framework有很多選擇,例如: CPPUnit、Google GTest...等,自Visual Studio 2012開始,提供了內建的單元測試框架Microsoft.VisualStudio.TestTools.CppUnitTestFramework並且與VS高度整合。

 

建立Production Code專案

Step 1. 建立Production Code

首先,建立一個基本的Win32主控台應用程式專案:

b1_step1

在此以一個簡單的計算器為範例,請新增Calculator.h與Calculator.cpp,並撰寫以下程式碼:

Calculator.h


#ifndef _CALCULATOR_H_
#define _CALCULATOR_H_

namespace CalculatorProject
{
	class Calculator
	{
		public:
			int add(int x, int y);
			int minus(int x, int y);
			int multiply(int x, int y);
			int divide(int x, int y);
	};
}

#endif /* _CALCULATOR_H_ */

Calculator.cpp


#include "Calculator.h"
using namespace CalculatorProject;

int Calculator::add(int x, int y)
{
	return x+y;
}

int Calculator::minus(int x, int y)
{
	return x-y;
}

int Calculator::multiply(int x, int y)
{
	return x*y;
}

int Calculator::divide(int x, int y)
{
	return x/y;
}

撰寫完成後,專案應該如下圖所示:

b1_step1_2

 

 

Step 2. 設定Production Code組態

請在方案總管中,對CalculatorProject按右鍵,於專案屬性視窗中[組態屬性]->[一般]->[專案預設值]->[組態屬性]設定成"靜態程式庫 (.lib)"

b1_step2 

 

建立測試專案

Step 3. 建立測試專案

請在同一方案中,新增測試專案:

b1_step3

Step 4. 設定測試專案組態

請在方案總管中,對CalculatorProjectUnitTest按右鍵,於專案屬性視窗中進行以下設定:

1. 在[VC++目錄]->[Include目錄]設定參考Production Code的標頭檔

b1_step4_1

2. 在[VC++目錄]->[程式庫目錄]設定參考Production Code預設的lib輸出位置

b1_step4_2

3. 在[連結器]->[輸入]設定連結Production Code輸出的lib

b1_step4_3

Step 5. 撰寫測試程式碼

可以先將測試專案預設的"unittest1.cpp"更名為"CalculatorTest.cpp",建議命名規則如下:
TEST_CLASS命名原則: ClassName + "Test",其中ClassName 為對應測試Production Code裡頭的類別名稱
TEST_METHOD命名原則: "test" + MethodName,其中MethodName為對應測試Production Code裡頭的方法名稱

以下為幾點注意事項:

1. 記得引入欲測試的類別之標頭檔,如: 引入#include "Calculator.h"

2. TEST_METHOD_INITIALIZE(setUp) 、TEST_METHOD_CLEANUP(tearDown) 為執行每一個TEST_CASE前、後會執行的Code

3. 可以使用Logger::WriteMessage("")來記錄測試中需要輸出的資訊

CalculatorTest.cpp


#include "stdafx.h"
#include "CppUnitTest.h"
#include "Calculator.h"
#include <iostream>
using namespace std;
using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace CalculatorProject
{
  TEST_CLASS(CalculatorTest)
  {
	private:
		Calculator *calculator;
	public:
		TEST_METHOD_INITIALIZE(setUp) 
		{
			// method initialization code
			Logger::WriteMessage("CalculatorTest setUp()\n");
			calculator = new Calculator();
		}
	  
		TEST_METHOD_CLEANUP(tearDown) 
		{
			// test method cleanup  code
			Logger::WriteMessage("CalculatorTest tearDown()\n");
			delete calculator;
		}

		TEST_METHOD(testAdd)
		{
			Assert::AreEqual(9, calculator->add(6,3));
			Logger::WriteMessage("testAdd() finish testing!\n");
		}

		TEST_METHOD(testMinus)
		{
			Assert::AreEqual(3, calculator->minus(6,3));
			Logger::WriteMessage("testMinus() finish testing!\n");
		}

		TEST_METHOD(testMultiply)
		{
			Assert::AreEqual(18, calculator->multiply(6,3));
			Logger::WriteMessage("testMultiply() finish testing!\n");
		}

		TEST_METHOD(testDivide)
		{
			Assert::AreEqual(2, calculator->divide(6,3));
			Logger::WriteMessage("testDivide() finish testing!\n");
		}
  };
}

b1_step5

Step 6. 開啟測試總管進行測試

撰寫完成測試程式碼並且建置完成後,在工具列的[測試]->[視窗]->[測試總管]叫出測試總管畫面,可以看到我們剛剛撰寫的測試範例正等待我們去執行:

b1_step6_1

按下黃框處的[全部執行]即可開始執行單元測試啦!

執行完測試後,我們選取該測試單元,在下方會出現[輸出]的按鈕,可以叫出測試時使用Logger紀錄的資訊歐~

b1_step6_2

有可以針對測試結果進行Code Coverge分析:

b1_step6_3 

 

結論

相信透過上面這個簡單的小範例,讀者應該可以建立出屬於自己的Testing專案,VS 2012提供的測試專案與測試視窗,讓我們可以更方便的進行測試工作,讓我們一起建構強健、好用的應用程式吧!! ^_^

 

相關資源

MSDN - 使用 Microsoft.VisualStudio.TestTools.CppUnitTestFramework

http://msdn.microsoft.com/zh-tw/library/hh694604(v=vs.110).aspx