GoogleTest–断言

随笔2个月前发布
41 0 0

一、概述

在程序中,断言结果就是一个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,就是作一个类型的检测。

三、举例 

1、字符串断言




//字符串断言


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());


}

2、异常断言




//异常断言


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*);


}

3、谓词断言




//谓词断言


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);


}

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...