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