清单 22. 同时包含装备和非装备测试的 Boost 测试套件
#define BOOST_TEST_MODULE example #include <boost/test/included/unit_test.hpp> #include <iostream> struct F { F() : i( 0 ) { std::cout << "setup" << std::endl; } ~F() { std::cout << "teardown" << std::endl; } int i; }; BOOST_AUTO_TEST_SUITE( test ) BOOST_FIXTURE_TEST_CASE( test_case1, F ) { BOOST_CHECK( i == 1 ); ++i; } BOOST_AUTO_TEST_CASE( test_case2 ) { BOOST_REQUIRE( 2 > 1 ); } BOOST_AUTO_TEST_CASE( test_case3 ) { int i = 1; BOOST_CHECK_EQUAL( i, 1 ); ++i; } BOOST_AUTO_TEST_SUITE_END() |
在 清单 22 中,在一个测试用例上定义和使用了装备。Boost 还允许用户通过 BOOST_GLOBAL_FIXTURE (<Fixture Name>) 宏定义和使用全局装备。可以定义任意数量的全局装备,因此可以把初始化代码分割为多个部分。清单 23 使用一个全局装备。
清单 23. 使用全局装备进行回归测试初始化
#define BOOST_TEST_MODULE example #include <boost/test/included/unit_test.hpp> #include <iostream> struct F { F() { std::cout << "setup" << std::endl; } ~F() { std::cout << "teardown" << std::endl; } }; BOOST_AUTO_TEST_SUITE( test ) BOOST_GLOBAL_FIXTURE( F ); BOOST_AUTO_TEST_CASE( test_case1 ) { BOOST_CHECK( true ); } BOOST_AUTO_TEST_SUITE_END() |
对于多个装备,它们的设置和清除按照声明的次序执行。在 清单 24 中,先调用 F 的构造函数,然后是 F2 的;对于销毁函数也是这样。
清单 24. 在回归测试中使用多个全局装备
#define BOOST_TEST_MODULE example #include <boost/test/included/unit_test.hpp> #include <iostream> struct F { F() { std::cout << "setup" << std::endl; } ~F() { std::cout << "teardown" << std::endl; } }; struct F2 { F2() { std::cout << "setup 2" << std::endl; } ~F2() { std::cout << "teardown 2" << std::endl; } }; BOOST_AUTO_TEST_SUITE( test ) BOOST_GLOBAL_FIXTURE( F ); BOOST_GLOBAL_FIXTURE( F2 ); BOOST_AUTO_TEST_CASE( test_case1 ) { BOOST_CHECK( true ); } BOOST_AUTO_TEST_SUITE_END() |
注意,不能将全局装备作为对象用在单个测试中。也不能在测试中直接访问它们的公共/受保护的非静态方法或变量。
结束语
本文介绍了最强大的开放源码回归测试框架之一:Boost。讨论了基本的 Boost 检查、模式匹配、浮点比较、定制检查、测试套件的组织(包括手工和自动)和装备。请通过 Boost 文档了解更多信息。本系列的后续文章将介绍 cppUnit 等开放源码回归测试框架。