Boost Test學習總結(C++)

iDotNetSpace發表於2009-05-19

show_progress 設定為 yes 將在執行測試時顯示當前的進度。

 

1.       常用的 C++ 單元測試框架

    測試驅動開發( TDD 已經是一種非常流行的開發方式了 Java.Net 中都提供了非常好的單元測試框架,#defin BOOST_TEST_MODULE example 或者 #defin BOOST_AUTO_TEST_MAIN 否則測試模組初始化函式需要手動實現;然後巨集 “ BOOST_AUTO_TEST_SUITE minimal_test 將建立一個名為 minimal_test 測試套件,    首先。並將其加入到測試模組中。巨集 “ BOOST_AUTO_TEST_CASE my_test 將建立一個名為 “ my_test 測試用例,並將其加入到測試套件 minimal_test 中。 #defin BOOST_TEST_MODULE example 最後將導致 “ multipl definit of init_unit_test_suit int, char** 錯誤。>BOOST_AUTO_TEST_CASE 不能滿足需求,    有時候需要對一個測試用例使用不同的引數執行測試。此時需要對測試用例進行手動註冊(來自 Boost 文件) free_test_function 然後定義 init_unit_test_suite 函式,    示例程式碼將會分別以引數 1 2 3 4 5 執行測試 free_test_function 五次。手動註冊需要定義測試函式。並在該函式中將測試用例加入到主測試套件中。 BOOST_PARAM_TEST_CASE 有三個引數:第一個引數為測試函式指標,第二個與第三個為輸入引數迭代器。 Boost Test 採用 RAII 技術來實現夾具:     如果在多個測試用例中需要使用資料庫連線。> 

1.       常用的 C++ 單元測試框架

<    測試驅動開發( TDD 已經是一種非常流行的開發方式了 Java.Net 中都提供了非常好的單元測試框架。最近研究 C++ 下面的單元測試,發現其實在 C++ 中還是有很多選擇:

 

  • CPPUnit 著名的 XUnit 系列產品之一,熟悉 JUnit NUnit 開發人員可以很快上手。
  • CXXTest 需要進行預處理,需要裝置 PerlPython
  • Boost Test 功能強大,提供了自動註冊和手動註冊兩種方式,更重要的來自千錘百煉的 Boost 庫。
  • Googl Test Google 去年開源的測試框架,據說其內部上千個專案均採用該框架進行單元測試。

2.       Boost Test 起步

    先來看一個簡單的 Boost Test 示例(來自 Boost 文件)

 

<!--

Code highlight produc by Actipro CodeHighlight freewar
http://www.CodeHighlighter.com/

--&gt 1#define BOOST_TEST_MODULE example 2 3#include <boost/test/unit_test.hpp> 4 5  6int j  7int add int i.; 8 9 1011BOOST_AUTO_TEST_SUITE minimal_test 1213 1415BOOST_AUTO_TEST_CASE my_test 1617{182  == 5 19    BOOST_CHECK add 2.;202  == 4 21    BOOST_REQUIRE add 2.;222  != 4 23    if add 2. 2425        BOOST_ERROR "oops!" ;262  != 4 27    if add 2. 2829        BOOST_FAIL "oops!" ;302  != 4 31    if add 2. 3233        throw "oops!";342  == 4,35    BOOST_CHECK_MESSAGE add 2"add ..  result: " << add 22 ;362 ,37    BOOST_CHECK_EQUAL add 24 ;3839}4041 4243BOOST_AUTO_TEST_SUITE_END 4445

需要定義

原因是一個測試順序中只允許存在一個定義一個測試模組。測試模組中存在一個主測試套件,所有未明確包含到測試套件中的測試用例將被包含到主測試套件中。     關於測試模組常犯的一個錯誤是不同的測試檔案中定義不同的

    下面是具體的測試過程了順序中展示了七種不同的方式來對函式 add 進行測試:

  • 丟擲異常方式:測試框架將捕獲該異常並列印出錯誤資訊;

3.       單引數測試用例

前面提到

 

<!--

Code highlight produc by Actipro CodeHighlight freewar
http://www.CodeHighlighter.com/

--&gt#include <boost/test/included/unit_test.hpp><boost/test/parameterized_test.hpp>using namespace boost::unit_test;void free_test_funct  int i  < 4 /* test assertion */  ;char* argv[]  test_suite* init_unit_test_suit  int argc. 2,    int params[] = { 1345 };params,    add  BOOST_PARAM_TEST_CASE  &free_test_function. params+5    ;return 0;

#include 

{

    BOOST_CHECK  i 

}

{

    framework::master_test_suit .

 

4.       夾具( Fixture

這時候要用到夾具來自動執行安裝、清理過程。

<!--

Code highlight produc by Actipro CodeHighlight freewar
http://www.CodeHighlighter.com/

--&gt1struct <fixture-name>{23   <fixture-name>//  裝置 45   ~<fixture-name>//  裝配 67};

 只需要定義一個類, 自定義一個夾具非常簡單。分別在類的建構函式和解構函式中進行裝置和拆卸。另外,類的公有成員在測試用例中可以直接引用而不需要加上物件名作為字首。例如:

<!--

Code highlight produc by Actipro CodeHighlight freewar
http://www.CodeHighlighter.com/

--&gt 1#define BOOST_TEST_MODULE example 2 3#include <boost/test/included/unit_test.hpp> 4 5  6 7struct F 8 9{1011    F  : i 0 1213    {1415        //std::cout <1617    }1819    ~F 2021    {2223        //std::cout <2425    }2627 2829    int i;3031};3233 3435BOOST_FIXTURE_TEST_SUITE const_string_test. 3637 3839BOOST_FIXTURE_TEST_CASE  test_case1. 4041{4243    BOOST_CHECK  i == 1  ;4445    ++i;4647}4849 5051BOOST_FIXTURE_TEST_CASE  test_case2  5253{541  55    BOOST_CHECK_EQUAL  i.;5657}5859 6061BOOST_AUTO_TEST_CASE  test_case3  6263{6465    BOOST_CHECK  true  ;6667}6869 7071BOOST_AUTO_TEST_SUITE_END 7273

夾具將在該測試套件的所有測試用例中可用。使用巨集 BOOST_FIXTURE_TEST_CASE 代替巨集 BOOST_AUTO_TEST_CASE 建立測試用例, 使用巨集 BOOST_FIXTURE_TEST_SUITE 第二個引數中指定夾具來代替巨集 BOOST_AUTO_TEST_SUITE 以建立測試套件。可以在該測試用例中使用夾具。需要注意的每一個測試用例中都將會執行夾具的裝置和解除安裝過程。 log_level 中設定,    以上級別以由低到高的級別排列。還可以使用引數 log_format 來制定輸出格式。 test.ex – build_info=y – log_level=all 下面是常用的測試引數:     可以向測試順序傳送引數來定製測試結果。>

5.       測試輸出

    Boost Test 中包括了十個級別的日誌資訊:

  • 勝利資訊
  • 測試樹往返移動通知
  • 通用資訊
  • 警告資訊
  •   非致命錯誤資訊
  • 未捕獲 C++ 異常
  • 致命系統錯誤
  • 所有資訊
  • 無資訊

可以在執行時引數

如 “

  • build_infoa 設定為 yes 將在開始執行測試前列印當前的作業系統版本、編譯器版本等資訊;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-600452/,如需轉載,請註明出處,否則將追究法律責任。