最小化的测试套件minimal_test

test库提供一个最小化的测试套件minimal_test, 类似lightweight_test适合入门级测试.

需要包含文件文#include <boost/test/minimal_test.hpp>

minimal_test内部实现了main(), 因此无需自己编写main()函数, 只要实现test_main()即可, 它是minimal_test的真正功能函数. 注意test_main()必须返回一个整数.

minimal_test提供四个测试断言宏

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; // 必须返回值
}

运行输出

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区别:

  • 测试断言有CHECK/REQUIRE/ERROR/FAIL级别
  • 不支持捕获异常的测试
  • 必须实现test_main()函数作为测试入口
  • 自动输出测试报告

单元测试框架UTF

Boost test库提供了一个用于单元测试的基于命令行界面的测试套件UTF: Unit Test Framework,具有单元测试、检测内存泄露、监控程序运行的功能。

UTF测试断言

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() // 测试套件结束

输出结果

Running 2 test cases...

*** No errors detected

测试夹具: 测试安装和测试清理好比c++中的构造函数和析构函数,“测试夹具”实现了自动的测试安装和测试清理。基本形式为:

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() // 测试套件结束

输出结果为:

global setup
Running 2 test cases...
suit setup
suit teardown
suit setup
suit teardown
global teardown *** No errors detected

[boost] : test库的更多相关文章

  1. 如何在WINDOWS下编译BOOST C++库 .

    如何在WINDOWS下编译BOOST C++库 cheungmine 2008-6-25   写出来,怕自己以后忘记了,也为初学者参考.使用VC8.0和boost1.35.0.   1)下载boost ...

  2. Windows下如何使用BOOST C++库 .

    Windows下如何使用BOOST C++库 我采用的是VC8.0和boost_1_35_0.自己重新编译boost当然可以,但是我使用了 http://www.boostpro.com/produc ...

  3. Boost线程库学习笔记

    一.创建一个线程 创建线程 boost::thread myThread(threadFun); 需要注意的是:参数可以是函数对象或者函数指针.并且这个函数无参数,并返回void类型. 当一个thre ...

  4. Boost正则表达式库regex常用search和match示例 - 编程语言 - 开发者第2241727个问答

    Boost正则表达式库regex常用search和match示例 - 编程语言 - 开发者第2241727个问答 Boost正则表达式库regex常用search和match示例 发表回复   Boo ...

  5. Boost::thread库的使用

    阅读对象 本文假设读者有几下Skills [1]在C++中至少使用过一种多线程开发库,有Mutex和Lock的概念. [2]熟悉C++开发,在开发工具中,能够编译.设置boost::thread库. ...

  6. 一起学习Boost标准库--Boost.StringAlgorithms库

    概述 在未使用Boost库时,使用STL的std::string处理一些字符串时,总是不顺手,特别是当用了C#/Python等语言后trim/split总要封装一个方法来处理.如果没有形成自己的com ...

  7. 一起学习Boost标准库--Boost.texical_cast&format库

    今天接续介绍有关字符串表示相关的两个boost库: lexical_cast 将数值转换成字符串 format 字符串输出格式化 首先,介绍下lexical_cast ,闻其名,知其意.类似C中的at ...

  8. Boost C++ 库 中文教程(全)

    Boost C++ 库 目录 第 1 章 简介 第 2 章 智能指针 第 3 章 函数对象 第 4 章 事件处理 第 5 章 字符串处理 第 6 章 多线程 第 7 章 异步输入输出 第 8 章 进程 ...

  9. UDF——处理二维网格的利器:Boost.Geometry库

    本文编译工具:VC++ UDF Studio 该插件可以直接在Visual Studio中一键编译.加载.调试UDF源码,极大提高编写排错效率,且支持C++,MFC,Windows API和第三方库, ...

随机推荐

  1. javascript---不可靠的“undefined”

    undefined 在 JavaScript 中,假设我们想判断一个是否是 undefined,那么我们通常会这样写: if(a === undefined){//code} 但是,JavaScrip ...

  2. vue input框数字后保留两位小数正则

    <el-input type="text" v-model.trim="ruleForm2.marketPrice" maxlength="10 ...

  3. 快速切题 sgu102.Coprimes 欧拉函数 模板程度 难度:0

    102. Coprimes time limit per test: 0.25 sec. memory limit per test: 4096 KB For given integer N (1&l ...

  4. hdu4800 Josephina and RPG 解题报告

    Josephina and RPG Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  5. hdu4348

    题解: 因为卡空间,所以直接到spoj上面去做了 区间修改的线段树 但是加lazy会把之前的操作修改 正确的解法是lazy不下传,只是在当前计算 但是听说可以记录时间的下传,我弱弱不会 代码: #in ...

  6. struts2返回json字符串

    参考链接:http://www.cnblogs.com/starsli/p/4733669.html 1.通过使用struts2-json-plugin 插件来实现 2.通过收到使用json-lib提 ...

  7. CUDA ---- Memory Access

    Memory Access Patterns 大部分device一开始从global Memory获取数据,而且,大部分GPU应用表现会被带宽限制.因此最大化应用对global Memory带宽的使用 ...

  8. koa 框架 介绍 -- 待续

    对比 express  更小  更健壮 解决繁琐的回调函数嵌套, 并极大地提升错误处理的效率 Koa 的核心设计思路是为中间件层 提供高级语法糖封装, (其实就是用了 ES6的生成器, 能中断函数的执 ...

  9. VM VirtualBox虚拟机与物理主机之间的复制

    物理主机: 系统:Ubuntu 11.04 X86_64 虚拟机: 系统:Windows XP Pack3 点击虚拟机的 设备->安装增强功能即可 安装后两系统之间的复制,粘贴可正常使用,如同一 ...

  10. iOS 序列化和反序列化

    摘自:http://hi.baidu.com/popln/blog/item/c3dd9302bb37e994d43f7ccb.html 开篇 1到底这个序列化有啥作用? 面向对象的程序在运行的时候会 ...