了解 Boost 单元测试框架
作者:网络转载 发布时间:[ 2013/9/3 10:07:46 ] 推荐标签:
使用 BOOST_TEST_CASE 宏创建的单元测试以函数指针作为输入参数。在 清单 17 中,test_case1、test_case2 等是 void 函数,用户可以按自己喜欢的方式编写代码。但是注意,Boost 测试设置会使用一些堆内存;每个对 BOOST_TEST_SUITE 的调用都会产生一个新的 boost::unit_test::test_suite(<test suite name>)。
装备
从概念上讲,测试装备(test fixture)是指在执行测试之前设置一个环境,在测试完成时清除它。清单 19 提供了一个简单的示例。
清单 19. 基本的 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_SUITE_END()
清单 20 给出了输出。
清单 20. Boost 装备的输出
[arpan@tintin] ./a.out
Running 1 test case...
setup
fix.cpp(16): error in "test_case1": check i == 1 failed
teardown
*** 1 failure detected in test suite "example"
这段代码没有使用 BOOST_AUTO_TEST_CASE 宏,而是使用 BOOST_FIXTURE_TEST_CASE,它需要另一个输入参数。这个对象的 constructor 和 destructor 方法执行必需的设置和清除工作。看一下 Boost 头文件 unit_test_suite.hpp 可以确认这一点(见 清单 21)。
清单 21. 头文件 unit_test_suite.hpp 中的 Boost 装备定义
#define BOOST_FIXTURE_TEST_CASE( test_name, F ) /
struct test_name : public F { void test_method(); }; /
/
static void BOOST_AUTO_TC_INVOKER( test_name )() /
{ /
test_name t; /
t.test_method(); /
} /
/
struct BOOST_AUTO_TC_UNIQUE_ID( test_name ) {}; /
/
BOOST_AUTO_TU_REGISTRAR( test_name )( /
boost::unit_test::make_test_case( /
&BOOST_AUTO_TC_INVOKER( test_name ), #test_name ), /
boost::unit_test::ut_detail::auto_tc_exp_fail< /
BOOST_AUTO_TC_UNIQUE_ID( test_name )>::instance()->value() ); /
/
void test_name::test_method() /
在内部,Boost 从 struct F 公共地派生一个类(见 清单 19),然后从这个类创建对象。按照 C++ 的公共继承规则,在函数中可以直接访问 struct 类的所有受保护变量和公共变量。注意,在 清单 19 中修改的变量 i 属于类型为 F 的内部对象 t(见 清单 20)。在回归测试套件中可能只有几个测试需要某种显式的初始化,因此可以只对它们使用装备特性。在 清单 22 给出的测试套件中,三个测试中只有一个使用装备。

sales@spasvo.com