C++ googletest的使用

概念介绍

什么是gtest


gtest是一个跨平台的(Liunx、Mac OS X、Windows、Cygwin、Windows CE and Symbian)C++单元测试框架,由google公司发布。gtest是为在不同平台上为编写C++测试而生成的。它提供了丰富的断言、致命和非致命判断、参数化、”死亡测试”等等。

TEST宏

TEST(test_case_name, test_name)
TEST_F(test_fixture,test_name)  //多个测试场景需要相同数据配置的情况,用TEST_F。TEST_F  test fixture,测试夹具,测试套,承担了一个注册的功能。

EST宏的作用是创建一个简单测试,它定义了一个测试函数,在这个函数里可以使用任何C++代码并使用提供的断言来进行检查。

断言

要测试一个类或函数,我们需要对其行为做出断言。当一个断言失败时,Google Test会在屏幕上输出该代码所在的源文件及其所在的位置行号,以及错误信息。也可以在编写断言时,提供一个自定义的错误信息,这个信息在失败时会被附加在Google Test的错误信息之后。

GoogleTest的断言是一种类似于函数调用的断言机制。我们可以在GoogleTest本身的断言消息后面定义自己的测试失败信息。下面说明几种不同断言方式:

ASSERT_*产生fatal failures,直接终止当前函数的运行
EXPECT_*: 产生nonfatal failures,不会终止当前函数运行
EXPECT_*: 最常用的一种方式,可以允许报告产生一个或者多个failer

即,ASSERT_*版本的断言失败时会产生致命失败,并结束当前函数。EXPECT_*版本的断言产生非致命失败,而不会中止当前函数。通常更推荐使用EXPECT_*断言,因为它们运行一个测试中可以有不止一个的错误被报告出来。但如果在编写断言如果失败,就没有必要继续往下执行的测试时,你应该使用ASSERT_*断言。 因为失败的ASSERT_*断言会立刻从当前的函数返回,可能会跳过其后的一些的清洁代码,这样也许会导致空间泄漏。

常用的断言类型

bool值检查
1>、 ASSERT_TRUE(参数),期待结果是true
2>、ASSERT_FALSE(参数),期待结果是false
数值型数据检查
3>、ASSERT_EQ(参数1,参数2),传入的是需要比较的两个数  equal
4>、ASSERT_NE(参数1,参数2),not equal,不等于才返回true
5>、ASSERT_LT(参数1,参数2),less than,小于才返回true
6>、ASSERT_GT(参数1,参数2),greater than,大于才返回true
7>、ASSERT_LE(参数1,参数2),less equal,小于等于才返回true
8>、ASSERT_GE(参数1,参数2),greater equal,大于等于才返回true
字符串检查
9>、ASSERT_STREQ(expected_str, actual_str),两个C风格的字符串相等才正确返回
10>、ASSERT_STRNE(str1, str2),两个C风格的字符串不相等时才正确返回
11>、ASSERT_STRCASEEQ(expected_str, actual_str)
12>、ASSERT_STRCASENE(str1, str2)

注:以上ASSERT_关键字替换为EXPECT_即为EXPECT_系列宏,同样可以使用。

断言补充日志

如果你对自动输出的错误信息不满意的话,也是可以通过operator<<能够在失败的时候打印日志,将一些自定义的信息输出。如下:

ASSERT_EQ(x.size(), y.size()) << "Vectors x and y are of unequal length";

for (int i = 0; i < x.size(); ++i) {
  EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i;
}

注意,任何可以写入流ostream的,都可被写入断言宏,比如C的字符串、string对象,甚至可以是广义上的字符(流):Windows的Unicode下的wchar_t*、 TCHAR*或者C++的std::string。所有流的输入都会转化成UTF-8的格式。

断言使用实例

以下测试,实现一个求绝对值的函数,并在TEST宏里面使用ASSERT来进行测试不同类型的数据。

#include <iostream>
#include <gtest/gtest.h>

using namespace std;

int Abs(int x)
{
    return x > 0 ? x : -x;
}

TEST(IsAbsTest, HandlerTrueReturn)
{
    ASSERT_TRUE(Abs(1) == 1) << "Abs(1)=1"; //添加自定义输出信息
    ASSERT_TRUE(Abs(-1) == 1) << "Abs(-1)=1";
    ASSERT_FALSE(Abs(-2) == -2); //期待结果是false
    ASSERT_EQ(Abs(1), Abs(-1));
    ASSERT_NE(Abs(-1), 0);
    ASSERT_GT(Abs(-1), 0);
    ASSERT_LE(Abs(-1), 2);
    ASSERT_GE(Abs(-1), 0);
}

int main(int argc, char *argv[])
{
    testing::InitGoogleTest(&argc, argv);

    return RUN_ALL_TESTS();
}

1、测试一切正确

编译上面demo

g++ -o gtest_assert_demo gtest_assert_demo.cpp -std=c++11 -lgtest -lpthread

执行

2、测试出现失败用例

将上面代码中第一行的ASSERT_TRUE修改为ASSERT_FALSE。即:

ASSERT_FALSE(Abs(1) == 1) << "Abs(1)=1";

 重新编译

g++

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值