跟我学c++中级篇工具应用——gtest的断言

一、gtest的断言

断言,其实就是一种“逻辑判断”。它从数学理论中导出来的,在数学中的英文描述是“A narrative communication which by virtue of its meaning is true or false. In a narrower sense, the term assertion in mathematical logic is understood to be a closed formula in a logico-mathematical language which by virtue of the semantics of the language can be classified as true or false.”
所以在程序中,断言结果就是一个bool值。用过c++的都知道assert。它可以对单一表达式或者二元表达式进行判断,在c++的通常应用中,它是一个宏。在gtest中它的表现形式也是一种宏,它主要有两大类:
1、ASSERT_:断言失败退出当前函数,不影响当前Case。
2、EXPECT_
:预期断言失败时,继续执行。

在gtest中有以下几种主要的断言形式:
1、布尔值断言
ASSERT_TRUE(condition);
EXPECT_TRUE(condition);
ASSERT_FALSE(condition);
EXPECT_FALSE(condition);
这个一看字面意思就明白,不作解释了。
2、数值断言
ASSERT_EQ(expected, actual);
EXPECT_EQ(expected, actual);
ASSERT_NE(val1, val2); EXPECT_NE(val1, val2);
ASSERT_LT(val1, val2); EXPECT_LT(val1, val2);
ASSERT_LE(val1, val2); EXPECT_LE(val1, val2);
ASSERT_GT(val1, val2); EXPECT_GT(val1, val2);
ASSERT_GE(val1, val2); EXPECT_GE(val1, val2);
这个如果学过汇编语言的可能一下子就明白了,其实后面的字符串就是比较的缩写,比如EQ是常见的等于;GT是大于,其它都类似。
3、字符串断言
ASSERT_STREQ(expected_str, actual_str);
EXPECT_STREQ(expected_str, actual_str);
ASSERT_STRNE(str1, str2);
EXPECT_STRNE(str1, str2);
ASSERT_STRCASEEQ(expected_str, actual_str);
EXPECT_STRCASEEQ(expected_str, actual_str);
ASSERT_STRCASENE(str1, str2);
EXPECT_STRCASENE(str1, str2);
其实和数值断言类似,只不过在字符串中可能存在大小写,所以要对这个进行处理一下。
4、结果断言
SUCCEED();FAIL(); ADD_FAILURE();
5、异常断言
ASSERT_THROW(statement, exception_type);
EXPECT_THROW(statement, exception_type);
ASSERT_ANY_THROW(statement);
EXPECT_ANY_THROW(statement);
ASSERT_NO_THROW(statement);
EXPECT_NO_THROW(statement);
6、谓词断言
ASSERT_PRED1(pred1, val1);
EXPECT_PRED1(pred1, val1);
ASSERT_PRED2(pred2, val1, val2);
EXPECT_PRED2(pred2, val1, val2);
ASSERT_PRED_FORMAT1(pred_format1, val1);
EXPECT_PRED_FORMAT1(pred_format1, val1);
ASSERT_PRED_FORMAT2(pred_format2, val1, val2);
EXPECT_PRED_FORMAT2(pred_format2, val1, val2);
这个要是搞过《离散数学》的可能就比较清楚,不过看过STL的源码的应该也好理解,其实就是有一个处理函数罢了。如果自己认为有更好的解决方式还可以自定义谓词。
7、浮点类型断言
ASSERT_FLOAT_EQ(expected, actual);
EXPECT_FLOAT_EQ(expected, actual);
ASSERT_DOUBLE_EQ(expected, actual);
EXPECT_DOUBLE_EQ(expected, actual);
ASSERT_NEAR(val1, val2, abs_error);
EXPECT_NEAR(val1, val2, abs_error);
这个没啥可更多解释的。
8、Windows平台的HRESULT断言
ASSERT_HRESULT_SUCCEEDED(expression);
EXPECT_HRESULT_SUCCEEDED(expression);
ASSERT_HRESULT_FAILED(expression);
EXPECT_HRESULT_FAILED(expression);
9、类型检查断言
这个有点类似于早期模板中的编译检查或者c++20后的概念Concepts,就是作一个类型的检测。

二、断言的例程

把gtest中的断言基本描述了一遍,下面看几个例子

//字符串断言
TEST(StringCmpTest, Demo)
{
    char* pStr = "mytest";
    wchar_t* wpStr = L"mytest";
    std::string str = "mystring";
    std::wstring wstr = L"mystring";

    EXPECT_STREQ("mytest", pStr );
    EXPECT_STREQ(L"mytest", wpStr );

    EXPECT_STRNE("notest", pStr );
    EXPECT_STRNE(L"notest", wpStr );

    EXPECT_STRCASEEQ("myTest",pStr);

    EXPECT_STREQ("mytest",str.c_str());
    EXPECT_STREQ(L"mytest",wstr.c_str());
}
//异常断言
int CheckData(int a, int b)
{
    if (a == 0 || b == 0)
    {
        throw "error zero";
    }
    int c = a % b;
    if (c == 0)
    {
       return b;
    }

    return CheckData(b, c);
}

TEST(CheckDataTest, HandleZeroInput)
{
    EXPECT_ANY_THROW(CheckData(1, 0));
    EXPECT_THROW(CheckData(0, 5), char*);
}
//库房断言
bool CompareV(int m, int n)
{
   if (m > n)
   {
     return true;
   }
   else
   {
     return false;
   }
}

TEST(PAssertionTest,MyTest)
{
    int m = 15, n = 3;
    EXPECT_PRED2(CompareV, m, n);
}

gtest中相关文档的例程有很多相关的例子,这个大家可以参考学习。
单元测试这个东西还是要好好的实际多用,才能够看到它的好处,国内确实是这个环境比较差,还是希望能自觉的开展单元测试。

三、总结

gtest中的路数不少,慢慢来,一个个的学。老曾不是说:“苟日新,日日新”。确实如此。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值