Boost库学习(1)log和unittest

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

Boost的log库
先看一下log库的整体设计。
Boost库学习(1)log和unittest_第1张图片

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目录中。

你可能感兴趣的:(C++,boost)