Boost Test学习总结(C++)

原创|其它|编辑:郝浩|2009-05-19 14:09:45.000|阅读 1899 次

概述:测试驱动开发(TDD)已经是一种非常流行的开发方式了,在Java和.Net中都提供了非常好的单元测试框架,最近研究C++下面的单元测试,发现其实在C++中还是有很多选择。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

show_progress 设置为 yes 将在运行测试时显示当前的进度。

 

1.       常用的 C++ 单元测试框架

    测试驱动开发( TDD 已经是一种非常流行的开发方式了 Java.Net 中都提供了非常好的单元测试框架,#defin BOOST_TEST_MODULE example 或者 #defin BOOST_AUTO_TEST_MAIN 否则测试模块初始化函数需要手动实现;然后宏 “ BOOST_AUTO_TEST_SUITE minimal_test 将创建一个名为 minimal_test 测试套件,    首先。并将其加入到测试模块中。宏 “ BOOST_AUTO_TEST_CASE my_test 将创建一个名为 “ my_test 测试用例,并将其加入到测试套件 minimal_test 中。 #defin BOOST_TEST_MODULE example 最后将导致 “ multipl definit of init_unit_test_suit int, char** 错误。>BOOST_AUTO_TEST_CASE 不能满足需求,    有时候需要对一个测试用例使用不同的参数运行测试。此时需要对测试用例进行手动注册(来自 Boost 文档) free_test_function 然后定义 init_unit_test_suite 函数,    示例代码将会分别以参数 1 2 3 4 5 运行测试 free_test_function 五次。手动注册需要定义测试函数。并在该函数中将测试用例加入到主测试套件中。 BOOST_PARAM_TEST_CASE 有三个参数:第一个参数为测试函数指针,第二个与第三个为输入参数迭代器。 Boost Test 采用 RAII 技术来实现夹具:     如果在多个测试用例中需要使用数据库连接。> 

1.       常用的 C++ 单元测试框架

<    测试驱动开发( TDD 已经是一种非常流行的开发方式了 Java.Net 中都提供了非常好的单元测试框架。最近研究 C++ 下面的单元测试,发现其实在 C++ 中还是有很多选择:

 

  • CPPUnit 著名的 XUnit 系列产品之一,熟悉 JUnit NUnit 开发人员可以很快上手。
  • CXXTest 需要进行预处理,需要装置 PerlPython
  • Boost Test 功能强大,提供了自动注册和手动注册两种方式,更重要的来自千锤百炼的 Boost 库。
  • Googl Test Google 去年开源的测试框架,据说其内部上千个项目均采用该框架进行单元测试。

2.       Boost Test 起步

    先来看一个简单的 Boost Test 示例(来自 Boost 文档)

 

 1#define BOOST_TEST_MODULE example 2 3#include <boost/test/unit_test.hpp> 4 5  6int j  7int add int i.; 8 9 1011BOOST_AUTO_TEST_SUITE minimal_test 1213 1415BOOST_AUTO_TEST_CASE my_test 1617{182  == 5 19    BOOST_CHECK add 2.;202  == 4 21    BOOST_REQUIRE add 2.;222  != 4 23    if add 2. 2425        BOOST_ERROR "oops!" ;262  != 4 27    if add 2. 2829        BOOST_FAIL "oops!" ;302  != 4 31    if add 2. 3233        throw "oops!";342  == 4,35    BOOST_CHECK_MESSAGE add 2"add ..  result: " << add 22 ;362 ,37    BOOST_CHECK_EQUAL add 24 ;3839}4041 4243BOOST_AUTO_TEST_SUITE_END 4445

需要定义

原因是一个测试顺序中只允许存在一个定义一个测试模块。测试模块中存在一个主测试套件,所有未明确包含到测试套件中的测试用例将被包含到主测试套件中。     关于测试模块常犯的一个错误是不同的测试文件中定义不同的

    下面是具体的测试过程了顺序中展示了七种不同的方式来对函数 add 进行测试:

  •  
  •  
  •  
  •  
  • 抛出异常方式:测试框架将捕获该异常并打印出错误信息;

  •  
  •  

3.       单参数测试用例

前面提到

 

#include <boost/test/included/unit_test.hpp><boost/test/parameterized_test.hpp>using namespace boost::unit_test;void free_test_funct  int i  < 4 /* test assertion */  ;char* argv[]  test_suite* init_unit_test_suit  int argc. 2,    int params[] = { 1345 };params,    add  BOOST_PARAM_TEST_CASE  &free_test_function. params+5    ;return 0;

#include 

{

    BOOST_CHECK  i 

}

{

    framework::master_test_suit .

 

4.       夹具( Fixture

这时候要用到夹具来自动执行安装、清理过程。

1struct <fixture-name>{23   <fixture-name>//  装置 45   ~<fixture-name>//  装配 67};

 只需要定义一个类, 自定义一个夹具非常简单。分别在类的构造函数和析构函数中进行装置和拆卸。另外,类的公有成员在测试用例中可以直接引用而不需要加上对象名作为前缀。例如:

 1#define BOOST_TEST_MODULE example 2 3#include <boost/test/included/unit_test.hpp> 4 5  6 7struct F 8 9{1011    F  : i 0 1213    {1415        //std::cout <<  " 创建夹具 "  << std::endl;1617    }1819    ~F 2021    {2223        //std::cout << " 销毁夹具 " << std::endl;2425    }2627 2829    int i;3031};3233 3435BOOST_FIXTURE_TEST_SUITE const_string_test. 3637 3839BOOST_FIXTURE_TEST_CASE  test_case1. 4041{4243    BOOST_CHECK  i == 1  ;4445    ++i;4647}4849 5051BOOST_FIXTURE_TEST_CASE  test_case2  5253{541  55    BOOST_CHECK_EQUAL  i.;5657}5859 6061BOOST_AUTO_TEST_CASE  test_case3  6263{6465    BOOST_CHECK  true  ;6667}6869 7071BOOST_AUTO_TEST_SUITE_END 7273

夹具将在该测试套件的所有测试用例中可用。使用宏 BOOST_FIXTURE_TEST_CASE 代替宏 BOOST_AUTO_TEST_CASE 建立测试用例, 使用宏 BOOST_FIXTURE_TEST_SUITE 第二个参数中指定夹具来代替宏 BOOST_AUTO_TEST_SUITE 以建立测试套件。可以在该测试用例中使用夹具。需要注意的每一个测试用例中都将会执行夹具的装置和卸载过程。 log_level 中设置,    以上级别以由低到高的级别排列。还可以使用参数 log_format 来制定输出格式。 test.ex – build_info=y – log_level=all 下面是常用的测试参数:     可以向测试顺序传送参数来定制测试结果。>

5.       测试输出

    Boost Test 中包括了十个级别的日志信息:

  • 胜利信息
  • 测试树往返移动通知
  • 通用信息
  • 警告信息
  •   非致命错误信息
  • 未捕获 C++ 异常
  • 致命系统错误
  • 所有信息
  • 无信息

可以在运行时参数

如 “

  • build_infoa 设置为 yes 将在开始运行测试前打印当前的操作系统版本、编译器版本等信息;

 


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP