寫算法時大多依靠簡單輸入驗證,經常遇到小范圍輸入正常,大范圍或特殊情況輸入結果錯誤的問題。所以寫程序之前最好先想好幾個特殊用例來測試,以驗證算法是否正確。單元測試就是個不錯的工具,而VS 2012提供了很方便的單元測試功能。
首先創建需要測試的C++項目,如果已有項目,可以跳過這個步驟。然後新建兩個文件algs4.h和main.cpp,代碼如下:
algs4.h
[cpp]
int add(int a, int b)
{
return a+b;
}
int minus(int a, int b)
{
return a-b;
}
int add(int a, int b)
{
return a+b;
}
int minus(int a, int b)
{
return a-b;
}
main.cpp
[cpp]
#include "algs4.h"
int main()
{
return 0;
}
#include "algs4.h"
int main()
{
return 0;
}
待測試項目創建完成。接下來需要在當前解決方案中新建本機單元測試項目,如下圖:
完成項目創建之後,為了讓測試方法能夠訪問待測試的代碼,需要在測試項目中添加待測試項目的引用。右擊測試項目,在屬性對話框裡找到VC++目錄->包含目錄
編輯包含目錄項,在彈出的對話框中添加待測試項目的文件目錄:
完成後就可以在測試項目中引入待測試函數。簡單的測試代碼如下:
[cpp]
#include "stdafx.h"
#include "CppUnitTest.h"
#include "algs4.h"
using namespaceMicrosoft::VisualStudio::CppUnitTestFramework;
namespace UnitTestAlgs4
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
//TODO: 在此輸入測試代碼
Assert::AreEqual(20,add(10,10));
}
};
}
#include "stdafx.h"
#include "CppUnitTest.h"
#include "algs4.h"
using namespaceMicrosoft::VisualStudio::CppUnitTestFramework;
namespace UnitTestAlgs4
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
//TODO: 在此輸入測試代碼
Assert::AreEqual(20,add(10,10));
}
};
}
運行測試時,可以在菜單欄找到測試->運行->所有測試,或者直接右擊,選擇運行測試
測試結果可以在測試資源管理器中查看:
不過以上的配置只能測試頭文件中的代碼,而大多情況下頭文件中並不包括函數的實現,這時,測試項目僅包含待測試項目的文件目錄是不夠的,還需要添加對.obj文件的引用。
假設待測試項目的文件及代碼如下:
algs4.h
[cpp]
int add(int a, int b);
int minus(int a, int b);
int add(int a, int b);
int minus(int a, int b);
algs4.cpp
[cpp]
#include "algs4.h"
int add(int a, int b)
{
return a+b;
}
int minus(int a, int b)
{
return a-b;
}
#include "algs4.h"
int add(int a, int b)
{
return a+b;
}
int minus(int a, int b)
{
return a-b;
}
main.cpp與上面的一致。
打開測試項目的屬性對話框,修改鏈接器的常規->附加庫目錄和輸入->附加依賴項兩個屬性:
向附加庫目錄中添加待測試函數的.obj文件目錄
如E:\VS2012\Algorithms4\Algorithms4\Debug
向附加依賴項中僅添加待測試函數的.obj文件名,這裡是algs4.obj。
設置好後就能夠正常運行測試。
另外,在測試資源管理器中右擊測試名,可以分析測試代碼的覆蓋率。由於當前測試代碼沒有添加對minus的測試,所以它的已覆蓋率是0。覆蓋率測試還可以測試條件語句等分支語句的覆蓋情況。