文档章节

Boost库学习(1)log和unittest

f4f
 f4f
发布于 2014/08/27 20:43
字数 811
阅读 176
收藏 1

工欲善其事必先利其器,log和unittest是程序员的必备工具,所以一开始就来介绍这两个东西。(工作原因,我很少用unittest,而是用其它的方法做的测试。)
学习的目的是为了使用,所有后面介绍到的Boost库我都会进行简单的封装或者举例。
代码都会更新到http://git.oschina.net/f4f/BoostStudy上。

Boost的log库
先看一下log库的整体设计。

Logging::core中可以挂载多个Sink,每个Sink分别设置自己的过滤规则,输出格式和输出位置(文件或者stdout)。
所有的log输出都由Logging::core传给所有的Sink,然后每个Sink各自处理。
输出一个log还要想清楚输出到哪个Sink的话,实在是给自己找麻烦。我觉得输出到文件之后用python写个脚本来分到不同的文件中,反而更灵活。所以我使用最简单的BOOST_LOG_TRIVIAL来输出log。
对于封装而言,还不能影响写代码。因为正常情况下,开发时是要输出log的(文件和stdout),而发行时是不应该输出log的。C语言中一般是加编译选项,但是如果每次输出log的代码前后还要用「#ifdef...#endif」的话就太麻烦了。
封装后的使用方法:
用编译选项DEBUGLOG作为log输出的总开关,只需要在makefile文件里定义,完全不用在代码里出现。
在main()函数里调用loginit()函数进行设置(包括输出的log级别,输出文件名,是否同时输出到stdout),然后在任何地方用LOG(log级别)进行输出。(LOG(log级别)相当于std::cout,用「<<」来输出。)

#include "log.hpp"

int main(int argc, char **argv)
{
    loginit(LEVEL_TRACE); // 不指定输出文件名,则只输出到stdout
    LOG(trace)<< "trace message";
    LOG(debug)<< "debug message";
    LOG(info)<< "info message";
    LOG(warning)<< "warning message";
    LOG(error)<< "error message";
    LOG(fatal)<< "fatal message";
    return 0;
}

Boost的unittest库
因为我没有用单元测试的习惯,所以这个库我没有封装。我只说明一下怎么用。

#define BOOST_TEST_MODULE TestSuitName /* 设置测试模块的名字 */
#include <boost/test/unit_test.hpp>

struct FixStruct
{
  FixStruct();
  ~FixStruct();
  Type member; // member可以直接在测试用例是使用
};
BOOST_FIXTURE_TEST_SUITE(test_suite_name, DefaultFixStruct) /* 设置测试集的名字 */
/* 不需要DefaultFixStruct的话,可以用BOOST_AUTO_TEST_SUITE(test_suite_name) */
BOOST_GLOBAL_FIXTURE( GlobalFixStruct );/* 可以设置多个BOOST_GLOBAL_FIXTURE */
BOOST_AUTO_TEST_CASE(test_case_name_1) /* 测试用例test_case_name_1 */
{
  BOOST_CHECK( bool-exp ); // 检查bool-exp是否为true
  BOOST_REQUIRE( bool-exp ); // 与上一行一样,只是为false时会退出测试
  BOOST_ERROR( failure-msg ); // 输出failure-msg
  BOOST_FAIL( failure-msg ); // 输出failure-msg,并且退出测试
  BOOST_CHECK_MESSAGE( bool-exp, failure-msg ); // 检查bool-exp是否为true,false时输出failure-msg
  BOOST_CHECK_EQUAL( first-value, second-value ); // 检查两个变量是否相等
}
BOOST_FIXTURE_TEST_CASE(test_case_name_2, LocalFixStruct) /* 测试用例test_case_name_2 */
{
}
BOOST_AUTO_TEST_SUITE_END() /* 测试集结束 */

解释一下FixStruct,它相当于一般单元测试的setup和teardown。上面的代码,实际的测试过程如下:

GlobalFixStruct() // 调用GlobalFixStruct的构造函数(测试集结束为止,只生成一次)
DefaultFixStruct() // test_case_name_1没有设置LocalFixStruct,使用DefaultFixStruct的构造函数
test_case_name_1 // 测试test_case_name_1
~DefaultFixStruct()
LocalFixStruct() // test_case_name_2设置了LocalFixStruct,使用LocalFixStruct的构造函数
test_case_name_2 // 测试test_case_name_2
~LocalFixStruct() // 
~GlobalFixStruct()

以上两部分代码在template目录中。

© 著作权归作者所有

f4f

f4f

粉丝 1
博文 10
码字总数 8952
作品 0
武汉
项目经理
私信 提问
muduo arm 移植

修改最上层的CMakeLists.txt 1) 在CXX_FLAGS里,加上-DVALGRIND,这样SocketsOps.cc就不会报错了。 2) 在CXX_FLAGS里,修改-march=native为-march=armv4 3) set(CMAKEFINDROOT_PATH "交叉工具......

石头哥哥
2016/02/17
228
0
Hunt 1.4.0 正式版,不仅仅是 I/O 性能优秀还很实用

Hunt 是一个D语言标准库扩展库,相当于 C++ 中的 boost,核心主要实现事件驱动的网络IO基础库,支持 epoll、iocp、kqueue,拥有优秀的IO性能和友好的API。 此外,它还提供了纯 DLang 实现的 ...

冰力
10/14
2.9K
8
selenium2-python28-引入unittest单元测试框架-批量执行测试用例

通过对前面对 unittest 框架的学习我们了解到,可以在一个.py 文件里编写多个测试用例,然后执行文件里的所有用例,这显然是一个不错的做法,我们可以将一些相关的用例放到一个文件里,unittest 支...

丰_申
2016/03/23
24
0
GTest初体验 -- 遇到运行库libCMT冲突问题

gtest是Google开源的C++单元测试框架,以前稍接触过boost::unittest和cmockery,这些框架的使用基本上是大同小异。由于项目涉及到gtest,那我就借此机会学习一下。 首先是从网站上下载最新的...

涩女郎
2015/09/10
75
0
将boost log 库源代码嵌入到工程中,需要添加哪些预定义宏?

我想将boost log 库源代码嵌入到我的工程中,需要添加哪些预定义宏? 之前我将boost date_time 库源代码嵌入到工程中,添加了BOOST_DATE_TIME_SOURCE 和BOOST_DATE_TIME_NO_LIB 两个宏 将boo...

su_yh
2016/05/25
455
1

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL 11.3 locking

rudi
今天
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
11
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
9
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
81
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部