gtest -UT测试框架

  gtest是Google公司发布的一款非常优秀的开源C/C++单元测试框架。gtest测试框架是google开源的用于在不同平台上(Linux,Mac OS X,Windows,Cygwin,Windows CE和Symbian)为编写C/C++测试用例的项目。它是基于xUnit架构的测试框架,支持自动发现测试,丰富的断言集, 用户定义的断言,death测试,致命与非致命的失败,类型参数化测试,各类运行测试的选项和XML的测试报告。

  本文的测试环境Ubuntu,用gcc编译源码为静态库(被测试的源码接口),而测试程序用g++编译。

gtest 环境安装

  用命令直接安装gtest,可直接参考如下的命令操作即可:

~$ sudo apt-get install libgtest-dev
/*
 *若是老版本只有这一个目录:/usr/src/gtest
 * ~$ cp /usr/src/gtest ./ -r
 * ~$ cd gtest
 */
/* 这里下载的是最新版本:/usr/src/gtest->googletest 和 /usr/src/googletest
 * 可以用命令查看安装的目录:~$ ls /usr/src
 */
~$ cp /usr/src/googletest ./  -r
~$ cd googletest
~/googletest$ mkdir build
~/googletest$ cd build
~/googletest/build$ cmake ..
~/googletest/build$ make
/* make命令执行成功后,在build目录下:
 * build/googlemock/gtest 生成2个静态库文件libgtest_main.a和libgtest.a 
 * 再将库文件放到系统目录下,再使用libgtest_main.a和libgtest.a就像使用系统库文件一样
 * 这里的静态文件也可以不用系统目录下,存放的路径中Makefile能找到即可
 */
~/googletest/build$ sudo cp googlemock/gtest/libgtest* /usr/local/lib
~/googletest/build$ sudo cp –r ../googletest/include   /usr/include/    

gtest 断言

  gtest作为一个成熟的单元测试框架,gtest有一些用于判断值是否与期望一致的断言。在gtest中断言分为两大类:ASSERT_* 和 EXPECT_*。它们的区别在于:
  a. ASSERT_*类断言在失败时,会立即退出当前的测试用例(即其所在的函数,但不会结束整个测试)
  b. EXPECT_*类断言在失败时,会继续执行剩余代码,不会退出当前测试用例。
  在每一个大类中,有分为多个小类别,它们分别用于不同目的的测试,如布尔测试、数值测试、字符串测试等等,下面逐个介绍它们所定义的宏。

  • 布尔测试
    布尔测试用于测试给定的值为真还是假,它们包括:
    *_TRUE(condition):期望condition为true,若condition为false,则断言失败;
    *_FALSE(condition):期望condition为false,若condition为true,则断言失败;
    其中“*“为”ASSERT“或者”EXPECT“,后续所有的宏都将采用这种形式

  • 布数值比较测试
    数值比较测试即比较两个数值之间的大小关系,它们包括:
    *_EQ(expected, actual):expected == actual则成功,否则失败;
    *_NE(expected, actual):expedted != actual则成功,否则失败;
    *_LT(val1, val2):val1 < val2则成功,否则失败;
    *_LE(val1, val2):val1 <= val2 则成功,否则失败;
    *_GT(val1, val2):val1 > val2则成功,否则失败;
    *_GE(val1,val2): val1 >= val2则成功,否则失败;

  • 浮点数类型比较
    gtest针对浮点数是否相等专门定义了宏,它们包括:
    *_FLOAT_EQ(expected, actual):expected与actual相差很小时成功,否则失败;
    *_DOUBLE_EQ(expected, actual):expected与actual相差很小时成功,否则失败;
    *_NEAR(val1, val2, abs):|val1 - val2| <= abs时成功,否则失败;

  • 字符串类型比较
    对于字符串,gtest提供字符串相等及不等断言,但它们都只支持C类型的字符串,不支持C++中的std::string和std::wstring,它们包括:
    *_STREQ(expected, actual):同时支持char*和wchar_t*,expected和actual的字符串内容相同则成功,否则失败;
    *_STRNE(str1, str2):同时支持char*和wchar_t*,str1和str2字符串内容不同则成功,否则失败;
    *_STRCASEEQ(expected, actual):只支持char*, expected和actual的字符串内容相同则成功,否则失败;
    *_STRCASENE(str1, str2):只支持char*,str1和str2字符串内容不同则成功,否则失败;

  • 执行成功与失败标记
    在gtest中,测试通过与否有三种状态,它们对应于一个枚举:
    enum Type {
     kSuccess,      // Succeeded.
     kNonFatalFailure, // Failed but the test can continue.
     kFatalFailure    // Failed and the test should be terminated.
    };
    每一个枚举值都对应一个宏,通过这个宏我们可以返回相应的执行状态:
    kSuccess:成功,对应的宏为SUCCEED();
    kNonFatalFailure:虽然失败,但当前测试用例的后续测试仍然继续运行,对应ADD_FAIL();
    kFatalFailure:致命错误,当前测试用例后续测试不会执行,对应FAIL();

  • 异常检查
    gtest中提供检查代码是否抛出异常的方法,它们包括:
    *_THROW(statement, exception_type):statement如果抛出exception_type类型异常则成功,否则失败;
    *_ANY_THROW(statement):只要statement抛出任何异常则成功,否则失败;
    *_NO_THROW(statement):只要statement抛出任何异常则失败,否则成功;

  • 谓词检查
    在gtest中,有一系列的宏,它们第一个参数为运行的函数或可执行体(要求返回值能够转换为bool类型),后续为执行函数所需要的参数,然后这些宏会自动运行这个函数,如果函数返回true则断言成功,否则失败,它们包括:
    *_PRED1(pred, param1):pred位可执行体,它接收一个参数,当pred(param1)返回true则断言成功,否则失败;
    *_PRED2(pred, param1, param2):pred位可执行体,它接收两个参数,当pred(param1, param2)返回true则断言成功,否则失败;
    … …
    gtest中最多提供了对5个参数的支持,即从*_PRED1到*_PRED5。如下测试代码:

gtest 单元测试

  在使用gtest的项目中引入libgtest_main.a和libgtest.a这俩个静态库文件和gtest/gtest.h头文件即可。注:gtest使用了系统的线程库,所以在项目中还需要引入pthread库。
ts_test这个案例是将gtest的lib文件和头文件直接和待测试代码放在一起使用的,具体用法见 。

代码覆盖率测试工具gcov与lcov

注意事项

collect2: error: ld returned 1 exit status
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值