最小化的測試套件minimal_test
test庫提供一個最小化的測試套件minimal_test, 類似lightweight_test適合入門級測試.
需要包含文件文#include <boost/test/minimal_test.hpp>
minimal_test內部實現了main(), 因此無需自己編寫main()函數, 只要實現test_main()即可, 它是minimal_test的真正功能函數. 注意test_main()必須返回一個整數.
minimal_test提供四個測試斷言宏
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; // 必須返回值
}
運行輸出
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區別:
- 測試斷言有CHECK/REQUIRE/ERROR/FAIL級別
- 不支持捕獲異常的測試
- 必須實現test_main()函數作為測試入口
- 自動輸出測試報告
單元測試框架UTF
Boost test庫提供了一個用於單元測試的基於命令行界面的測試套件UTF: Unit Test Framework,具有單元測試、檢測內存泄露、監控程序運行的功能。
UTF測試斷言
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() // 測試套件結束
輸出結果
Running 2 test cases...
*** No errors detected
測試夾具: 測試安裝和測試清理好比c++中的構造函數和析構函數,“測試夾具”實現了自動的測試安裝和測試清理。基本形式為:
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() // 測試套件結束
輸出結果為:
global setup
Running 2 test cases...
suit setup
suit teardown
suit setup
suit teardown
global teardown
*** No errors detected