如何在VS2013中進行Boost單元測試


  對於如何在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 };
tested.h
 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 }
tested.cpp

  在這里,我們並不需要新建一個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 };
tested.h
 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 }
tested.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 
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()
BoostUnitTest.cpp

  很顯示,程序的運行結果如下:

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++的測試驅動開發”。

  連載“單元測試實踐的主要問題與解決”。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM