了解 Boost 单元测试框架

发表于:2013-9-02 11:13

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:nodeathphoenix    来源:51Testing软件测试网采编

  模式匹配

  经常需要根据 “黄金日志” 测试函数生成的输出。BOOST_CHECK 也适合执行这种测试,这还需要用到 Boost 库的 output_test_stream 类。用黄金日志文件(以下示例中的 run.log)初始化 output_test_stream。C/C++ 函数的输出被提供给这个 output_test_stream 对象,然后调用这个对象的 match_pattern 例程。清单 7 提供了详细代码。

  清单 7. 根据黄金日志文件执行模式匹配

#define BOOST_TEST_MODULE example
#include <boost/test/included/unit_test.hpp>
#include <boost/test/output_test_stream.hpp>
using boost::test_tools::output_test_stream;
BOOST_AUTO_TEST_SUITE ( test )
BOOST_AUTO_TEST_CASE( test )
{
output_test_stream output( "run.log", true );
output << predefined_user_func( );
BOOST_CHECK( output.match_pattern() );
}
BOOST_AUTO_TEST_SUITE_END( )

  浮点比较

  回归测试中最棘手的检查之一是浮点比较。请看一下 清单 8,看起来没什么问题 — 至少从表面看是这样。

  清单 8. 无效的浮点比较

#define BOOST_TEST_MODULE floatingTest
#include <boost/test/included/unit_test.hpp>
#include <cmath>
BOOST_AUTO_TEST_SUITE ( test )
BOOST_AUTO_TEST_CASE( test )
{
float f1 = 567.0102;
float result = sqrt(f1); // this could be my_sqrt; faster implementation
// for some specific DSP like hardware
BOOST_CHECK(f1 == result * result);
}
BOOST_AUTO_TEST_SUITE_END( )

  运行这个测试时,尽管使用的是作为标准库一部分提供的 sqrt 函数,BOOST_CHECK 宏仍然会失败。什么地方出错了?浮点比较的问题在于精度 — f1 和 result*result 在小数点后面的几位不一致。为了解决这个问题,Boost 测试实用程序提供了 BOOST_WARN_CLOSE_FRACTION、BOOST_CHECK_CLOSE_FRACTION 和 BOOST_REQUIRE_CLOSE_FRACTION 宏。要想使用这三个宏,必须包含预定义的 Boost 头文件 floating_point_comparison.hpp。这三个宏的语法是相同的,所以本文只讨论 check 变体(见 清单 9)。

  清单 9. BOOST_CHECK_CLOSE_FRACTION 宏的语法

  BOOST_CHECK_CLOSE_FRACTION (left-value, right-value, tolerance-limit);

  清单 9 中没有使用 BOOST_CHECK,而是使用 BOOST_CHECK_CLOSE_FRACTION 并指定公差限制为 0.0001。清单 10 给出了代码现在的样子。 

  清单 10. 有效的浮点比较

#define BOOST_TEST_MODULE floatingTest
#include <boost/test/included/unit_test.hpp>
#include <boost/test/floating_point_comparison.hpp>
#include <cmath>
BOOST_AUTO_TEST_SUITE ( test )
BOOST_AUTO_TEST_CASE( test )
{
float f1 = 567.01012;
float result = sqrt(f1); // this could be my_sqrt; faster implementation
// for some specific DSP like hardware
BOOST_CHECK_CLOSE_FRACTION (f1, result * result, 0.0001);
}
BOOST_AUTO_TEST_SUITE_END( )

  这段代码运行正常。现在,把 清单 10 中的公差限制改为 0.0000001。清单 11 给出了输出。

53/5<12345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号