對於如何在VS2013中進行Boost單元測試,這方面資料太少。自己也因此走了不少彎路。下文將會闡述一下如何在VS2013中進行Boost單元測試。
在開始Boost單元測試之前,我們需要先安裝VS2013插件Boost Unit Test Adapter (Update 3) 以及編譯Boost庫。Boost Unit Test Adapte可以在VS2013中的“工具->擴展與更新”中找到並安裝。對於Boost Unit Test Adapter所支持的Boost庫版本請參考網頁。我選擇的是版本號為1.55.0的Boost庫(可以在其官網下載得到)。在編譯Boost庫的時候,可以參考教程及博文。我選擇的是完全編譯(bjam --toolset=msvc-12.0 --build-type=complete)。
下文以幾個步驟來闡述:
1. 新建解決方案及工程
接下來,我們新建一個BoostUnitTest解決方案,然后在該方案下添加(鼠標右擊解決方案新建項目)兩個項目。第一個項目是空的“WIN32”項目“Tested”,另一個是“Boost Unit Test Project”項目(新建項目->模板->Visual C++->Test下)“BoostUnitTest”。如下圖:

2. 在被測試工程中添加文件
在Tested工程中添加一個頭文件tested.h及源文件tested.cpp. 具體代碼如下
1 #include <iostream> 2 3 using namespace std; 4 5 class Tested 6 { 7 public: 8 9 Tested(); 10 virtual ~Tested(); 11 int add(const int a, const int b); 12 13 private: 14 15 };
1 #include "tested.h" 2 3 Tested::Tested() 4 { 5 6 } 7 8 Tested::~Tested() 9 { 10 11 } 12 13 int Tested::add(const int a, const int b) 14 { 15 return a + b; 16 }
在這里,我們並不需要新建一個main函數對這個類tested進行測試(因為我們已經有單元測試了),但一個程序默認是需要main函數的,所以在需要在Tested項目屬性中進行這樣的設置(“配置類型”改為“動態庫(.dll)”見下圖):

接着,“生成”該工程,產生tested.obj文件。
3. 配置Boost單元測試工程
新建的Boost單元測試工程中有兩個源文件“BoostUnitTestSample.cpp”及“BoostUnitTest.cpp”(還有stdafx.h、stdafx.cpp、targetver.h),前一個文件是樣例,可以不要,后一個文件可以當作我們的單元測試源文件。
先對該工程進行配置:
1)添加“平台工具集”為"Visual Studio 2013 (v120)",見下圖:

2)添加包含Boost庫的根目錄(在我電腦上是D:\boots_1_55_0),見下圖:

3)添加Boost庫目錄及待測試工程的.obj文件所在目錄,見下圖:

4)添加“附加依賴項”“tested.obj”,見下圖:

4. 進行Boost單元測試
注:我們在這時只進行簡單的單元測試,更加復雜的測試請參考文章最后給出的鏈接。
在BoostUnitTest工程中的文件“BoostUnitTest.cpp”(也可新建)添加如下代碼:
1 #define BOOST_TEST_MODULE Tested_Module // 主測試套件,一個測試項目中只能有一個主測試套件 2 3 #include "stdafx.h" 4 #include "D:\VSProject\BoostUnitTest\BoostUnitTest\Tested\tested.h" // 待測工程頭文件 5 6 struct Tested_Fixture // 測試夾具 7 { 8 Tested_Fixture() 9 { 10 BOOST_TEST_MESSAGE("setup fixture"); 11 tmpTested = new Tested(); 12 } 13 ~Tested_Fixture() 14 { 15 BOOST_TEST_MESSAGE("teardown fixture"); 16 delete tmpTested; 17 } 18 Tested * tmpTested; 19 }; 20 21 BOOST_FIXTURE_TEST_SUITE(Tested_test, Tested_Fixture) // 測試套件 22 23 BOOST_AUTO_TEST_CASE( Tested_Method_add_Test) // 測試用例 24 { 25 // TODO: Your test code here 26 BOOST_WARN(tmpTested->add(2, 2) == 4); // WARN型預言檢測 27 BOOST_CHECK(tmpTested->add(2, 2) == 4); // CHECK型預言檢測 28 BOOST_REQUIRE(tmpTested->add(2, 2) == 4); // REQUIRE型預言檢測 29 } 30 31 BOOST_AUTO_TEST_SUITE_END()
點擊“生成->生成解決方案”(預先打開“測試->窗口->測試資源管理器”)可以看到在“測試資源管理器”中出現了“BoostUnitTest”這個單元測試用例,如下圖:
注:如果電腦安裝有殺毒軟件(如360),“生成解決方案”的時候可能會提示:error LNK1104: 無法打開文件“...\BoostUnitTest\Debug\Tested.dll"。這是因為殺毒軟件攔截了單元測試工程對被測試工程.dll文件的訪問。比較簡單的方法是將殺毒軟件關閉就OK了。

點擊“全部運行”,可以看到該測試用例變綠,說明測試通過,如下圖:

如果我們將“BoostUnitTest.cpp”中的第13行改成:
BOOST_CHECK(tmpTested->add(2, 2) == 3);
單元測試運行結果是不通過,如下圖:

至此,如何進行一個簡單的Boost單元測試的過程就完成了。
// 添加於2014.10.18 ---------------------------------------------------------------------------
現在,我在之前程序的基礎上又添加了一點異常測試,相關的源代碼如下:
1 #include <iostream> 2 3 using namespace std; 4 5 class Tested 6 { 7 public: 8 9 Tested(); 10 virtual ~Tested(); 11 int add(const int a, const int b); 12 void testException(); 13 14 private: 15 16 };
1 #include "tested.h" 2 3 Tested::Tested() 4 { 5 6 } 7 8 Tested::~Tested() 9 { 10 11 } 12 13 int Tested::add(const int a, const int b) 14 { 15 return a + b; 16 } 17 18 void Tested::testException() 19 { 20 throw logic_error("my throw"); // 拋出一個邏輯錯誤異常 21 }
1 #define BOOST_TEST_MODULE Tested_Module // 主測試套件,一個測試項目中只能有一個主測試套件 2 3 #include "stdafx.h" 4 #include "D:\VSProject\BoostUnitTest\BoostUnitTest\Tested\tested.h" // 待測工程頭文件 5 6 struct Tested_Fixture // 測試夾具 7 { 8 Tested_Fixture() 9 { 10 BOOST_TEST_MESSAGE("setup fixture"); 11 tmpTested = new Tested(); 12 } 13 ~Tested_Fixture() 14 { 15 BOOST_TEST_MESSAGE("teardown fixture"); 16 delete tmpTested; 17 } 18 Tested * tmpTested; 19 }; 20 21 BOOST_FIXTURE_TEST_SUITE(Tested_test, Tested_Fixture) // 測試套件 22 23 BOOST_AUTO_TEST_CASE(Tested_Method_add_Test) // 測試用例 24 { 25 // TODO: Your test code here 26 BOOST_WARN(tmpTested->add(2, 2) == 4); // WARN型預言檢測 27 BOOST_CHECK(tmpTested->add(2, 2) == 4); // CHECK型預言檢測 28 BOOST_REQUIRE(tmpTested->add(2, 2) == 4); // REQUIRE型預言檢測 29 30 } 31 32 BOOST_AUTO_TEST_CASE(Tested_Method_testException_Test) // 測試用例 33 { 34 // TODO: Your test code here 35 BOOST_REQUIRE_NO_THROW(tmpTested->testException()); // 驗證是否無異常拋出,是則為真 36 BOOST_REQUIRE_THROW(tmpTested->testException(), logic_error); // 驗證拋出的是否是logic_error異常 37 BOOST_REQUIRE_THROW(tmpTested->testException(), runtime_error); // 驗證拋出的是否是runtime_error異常 38 39 } 40 41 BOOST_AUTO_TEST_SUITE_END()
很顯示,程序的運行結果如下:
35 BOOST_REQUIRE_NO_THROW(tmpTested->testException()); // 測試不通過 36 BOOST_REQUIRE_THROW(tmpTested->testException(), logic_error); // 測試通過 37 BOOST_REQUIRE_THROW(tmpTested->testException(), runtime_error); // 測試不通過
如果要進行更復雜的測試,可以參考官方文檔。
還有一些個人覺得比較好的參考資料:
Boost Test Library 中文手冊;
DeveloperWorks的“了解Boost單元測試框架”;
博文“單元測試分享”;
博文“Boost學習總結(C++)”;
博文“面向C++的測試驅動開發”。
連載“單元測試實踐的主要問題與解決”。
