test庫提供一個最小化的測試套件minimal_test, 相似lightweight_test適合入門級測試.
須要包含文件文#include <boost/test/minimal_test.hpp>
minimal_test內部實現了main(), 所以無需本身編寫main()函數, 只要實現test_main()便可, 它是minimal_test的真正功能函數. 注意test_main()必須返回一個整數.
minimal_test提供四個測試斷言宏ios
BOOST_CHECK(e) | 斷言測試經過, 如不經過不影響程序執行 |
BOOST_REQUIRE(e) | 要求斷言必須經過, 不然程序中止執行 |
BOOST_ERROR(e1, e2) | 給出錯誤信息, 程序繼續執行 |
BOOST_FAIL(e1, e2) | 給出錯誤信息, 程序運行中止 |
// Copyright (c) 2015 // Author: Chrono Law #include <iostream> using namespace std; #include <boost/format.hpp> #include <boost/test/minimal.hpp> // 最小化測試頭文件 int test_main( int argc, char* argv[] ) { using namespace boost; format fmt("%d-%d"); BOOST_CHECK(fmt.size() != 0); // 斷言測試經過, 如不經過不影響程序執行 fmt % 12 % 34; BOOST_REQUIRE(fmt.str() == "12-34"); // 要求斷言必須經過, 不然程序中止執行 BOOST_ERROR("演示一條錯誤消息"); // 給出錯誤信息, 程序繼續執行 fmt.clear(); fmt % 12; try { std::cout << fmt; // 輸入參數不完整, 拋出異常 } catch (...) { BOOST_FAIL("致命錯誤,測試終止"); // 給出錯誤信息, 程序運行中止 } return 0; // 必須返回值 }
運行輸出c++
minimal_test.cpp(18): 演示一條錯誤消息 in function: 'int test_main(int, char**)' minimal_test.cpp(28): 致命錯誤,測試終止 in function: 'int test_main(int, char**)'
minimal_test與lightweight_test區別:框架
Boost test庫提供了一個用於單元測試的基於命令行界面的測試套件UTF: Unit Test Framework,具備單元測試、檢測內存泄露、監控程序運行的功能。函數
UTF中的測試斷言:BOOST_LEVEL_ITEM單元測試
LEVEL | WARN | 警告級,不增長錯誤數量,不影響程序運行 |
CHECK | 檢查級別,增長錯誤數量,不影響程序運行 | |
REQUIRE | 最高級別,增長錯誤數量,程序終止運行 | |
ITEM | EQUAL/CLOSE | 測試相等性 |
GE/GT/LT/LE/NE | 測試不等性 | |
(NO_)THROW | 是否拋出異常 | |
MESSAGE | 測試信息 |
test庫將測試程序定義爲一個測試模塊,由測試安裝,測試主體,測試清理和測試運行器四個部分組成。測試主體是測試模塊的實際運行部分,由測試用例和測試套件組織成測試樹的形式。
測試用例是一個包含多個測試斷言的函數, 是能夠被獨立執行測試的最小單元, 各個測試用例之間是無關的, 發生的錯誤不會影響其餘測試用例.
測試套件是測試用例的容器,能夠嵌套,包含一個或多個測試用例,將多個測試用例分組管理,共享安裝/清理代碼, 更好的組織測試用例。
主測試套件, 任何UTF單元測試程序必須存在惟一一個主測試套件, 它是整個測試樹的根節點, 其餘測試套件都是它的子節點. 主測試套件的定義可使用宏BOOST_TEST_MAIN或者
BOOST_TEST_MODULE, 它們必須出如今<boost/test/unit_test.hpp>
以前.測試
// Copyright (c) 2015 // Author: Chrono Law //#define BOOST_TEST_MAIN #define BOOST_TEST_MODULE // 主測試套件 #include <boost/test/unit_test.hpp> // test庫頭文件 #include <boost/smart_ptr.hpp> using namespace boost; BOOST_AUTO_TEST_SUITE(s_smart_ptr) // 測試套件開始 BOOST_AUTO_TEST_CASE(t_scoped_ptr) // 測試用例1 { scoped_ptr<int> p(new int(874)); BOOST_CHECK(p); BOOST_CHECK_EQUAL(*p , 874); p.reset(); BOOST_CHECK(p == 0); } BOOST_AUTO_TEST_CASE(t_shared_ptr) // 測試用例2 { shared_ptr<int> p(new int(100)); BOOST_CHECK(p); BOOST_CHECK_EQUAL(*p , 100); BOOST_CHECK_EQUAL(p.use_count(), 1); shared_ptr<int> p2 = p; BOOST_CHECK_EQUAL(p, p2); BOOST_CHECK_EQUAL(p2.use_count(), 2); *p2 = 255; BOOST_CHECK_EQUAL(*p, 255); BOOST_CHECK_GT(*p, 200); } BOOST_AUTO_TEST_SUITE_END() // 測試套件結束
輸出結果ui
Running 2 test cases... *** No errors detected
測試夾具: 測試安裝和測試清理比如c++中的構造函數和析構函數,「測試夾具」實現了自動的測試安裝和測試清理。基本形式爲:spa
struct test_fixture_name // 測試夾具類, 一般是struct, 將被UTF繼承 { test_fixture_name(){} // 測試安裝工做 ~test_fixture_name(){} // 測試清理工做 };
測試夾具類須要使用如下兩個宏指定測試用例和測試套件命令行
#define BOOST_FIXTURE_TEST_SUITE(suite_name, F) #define BOOST_FIXTURE_TEST_CASE(test_name, F)
// Copyright (c) 2015 // Author: Chrono Law #include <iostream> #include <vector> using namespace std; #define BOOST_TEST_MAIN #include <boost/test/unit_test.hpp> #include <boost/assign.hpp> using namespace boost; struct global_fixture // 全局測試夾具類 { global_fixture(){cout << ("global setup\n");} ~global_fixture(){cout << ("global teardown\n");} }; // 該宏定義的夾具類被應用於整個測試用例的全部測試套件, 包括主測試套件 BOOST_GLOBAL_FIXTURE(global_fixture); struct assign_fixture // 測試套件夾具類 { assign_fixture() {cout << ("suit setup\n");} ~assign_fixture() {cout << ("suit teardown\n");} vector<int> v; // 全部測試用例均可以用的成員變量 }; // 定義測試套件級別的夾具 BOOST_FIXTURE_TEST_SUITE(s_assign, assign_fixture) BOOST_AUTO_TEST_CASE(t_assign1) // 測試用例1, 測試+=操做符 { using namespace boost::assign; v += 1,2,3,4; BOOST_CHECK_EQUAL(v.size(), 4); BOOST_CHECK_EQUAL(v[2], 3); } BOOST_AUTO_TEST_CASE(t_assign2) // 測試用例2, 測試push_back函數 { using namespace boost::assign; push_back(v)(10)(20)(30); BOOST_CHECK_EQUAL(v.empty(), false); BOOST_CHECK_LT(v[0], v[1]); } BOOST_AUTO_TEST_SUITE_END() // 測試套件結束
輸出結果爲:code
global setup Running 2 test cases... suit setup suit teardown suit setup suit teardown global teardown *** No errors detected