一、TestCase的介绍

Gtest提供了若干个case方法进行测试不同的用例。主要常见的有TEST/TEST_F及TEST_P宏的使用。
在每个TestCase中可以通过断言(Assert)提供的方法,检查程序的走向是否符合期望的结果,从而以此来判定程序的正确性。
在同一份TestCase中不能同时出现TEST和TEST_F两者进行混用;

二、断言

Google Test采用一系列的断言(assertion)来进行代码测试,这些宏有点类似于函数调用。
当断言失败时Google Test将会打印出assertion时的源文件和出错行的位置,以及附加的失败信息,
用户可以直接通过“<<”在这些断言宏后面跟上自己希望在断言命中时的输出信息。
测试宏可以分为两大类:ASSERT_*和EXPECT_*,这些成对的断言功能相同,但效果不同。其中ASSERT_*将会在失败时产生致命错误并中止当前调用它的函数执行。EXPECT_*版本的会生成非致命错误,不会中止当前函数,而是继续执行当前函数。通常情况应该首选使用EXPECT_*,因为ASSERT_*在报告完错误后不会进行清理工作,有可能导致内容泄露问题。

基本断言
Fatal assertion    Nonfatal assertion    Verifies
ASSERT_TRUE(condition);    EXPECT_TRUE(condition);    condition is true
ASSERT_FALSE(condition);    EXPECT_FALSE(condition);    condition is false

二值比较
Fatal assertion    Nonfatal assertion    Verifies
ASSERT_EQ(val1,val2);    EXPECT_EQ(val1,val2);    val1 == val2
ASSERT_NE(val1,val2);    EXPECT_NE(val1,val2);    val1 != val2
ASSERT_LT(val1,val2);    EXPECT_LT(val1,val2);    val1 < val2
ASSERT_LE(val1,val2);    EXPECT_LE(val1,val2);    val1 <= val2
ASSERT_GT(val1,val2);    EXPECT_GT(val1,val2);    val1 > val2
ASSERT_GE(val1,val2);    EXPECT_GE(val1,val2);    val1 >= val2

字符串比较
Fatal assertion    Nonfatal assertion    Verifies
ASSERT_STREQ(str1,str2);    EXPECT_STREQ(str1,str2);    the two C strings have the same content
ASSERT_STRNE(str1,str2);    EXPECT_STRNE(str1,str2);    the two C strings have different content
ASSERT_STRCASEEQ(str1,str2);    EXPECT_STRCASEEQ(str1,str2);    the two C strings have the same content, ignoring case
ASSERT_STRCASENE(str1,str2);    EXPECT_STRCASENE(str1,str2);    the two C strings have different content, ignoring case

三、TEST宏

TEST宏的作用是创建一个简单的测试用例,它定义了一个测试函数,在这个函数里可以使用任何C++代码并使用提供的断言([断言类型介绍])来进行检查。

TEST语法定义:

TEST(test_case_name, test_name)

test_case_name第一个参数是测试用例名,通常是取测试函数名或者测试类名
test_name 第二个参数是测试名这个随便取,但最好取有意义的名称
当测试完成后显示的测试结果将以"测试用例名.测试名"的形式给出

#include <gtest/gtest.h>inline int Add(int i, int j) { return i + j; }TEST(Add, 负数) {EXPECT_EQ(Add(-1, -2), -3);EXPECT_GT(Add(-4, -5), -6); // 故意的
}TEST(Add, 正数) {EXPECT_EQ(Add(1, 2), 3);EXPECT_GT(Add(4, 5), 6);
}int main(int argc, char **argv) {std::cout << "Running main() from gtest_main.cc\n";testing::InitGoogleTest(&argc, argv);RUN_ALL_TESTS();system("pause");return 0;
}

打印

四、TEST_F宏(Test Fixture)

很多时候,我们想在不同的测试执行前,创建相同的配置环境,在测试执行结束后执行相应的清理工作。测试固件(Test Fixture)为这种需求提供了方便。“Fixture”是一个汉语中不易直接对应的词,《美国传统词典》对它的解释是“(作为附属物的)固定装置;被固定的状态”。

在单元测试中,Fixture的作用是为测试创建辅助性的上下文环境,实现测试的初始化和终结与测试过程本身的分离,便于不同测试使用相同代码来搭建固定的配置环境。测试固件体现了对一系列测试(在开始和结束时)的规定动作。

TEST_F主要是进行多样测试,在多种不同情况的测试TestCase中都会使用相同一份的测试数据的时候将会才用它。即相同的数据测试不同的行为,如果采用TEST宏进行测试那么将会为不同的测试case创建多份数据。TEST_F宏将会共用一份避免重复拷贝共具灵活性。
TEST_F语法定义:

TEST_F(test_case_name, test_name);

test_case_name第一个参数是测试用例名,必须取类名。这个和TEST宏不同
test_name 第二个参数是测试名这个随便取,但最好取有意义的名称
使用TEST_F时必须继承::testing::Test类。并且该类提供了两个接口void SetUp(); void TearDown();

用TES_F比单纯调用 TEST宏稍微麻烦一些:

1、从gtest的 testing::Test类派生一个类,用 public或 protected定义以下所有成员。

2、建立环境:使用默认构造函数,或定义一个虚成员函数 virtual void SetUp()。

3、销毁环境:使用析构函数,或定义一个虚成员函数 virtual void TearDown()。

4、用 TEST_F定义测试,写法与 TEST相同,但测试用例名必须为上面定义的类名。

每个带固件的测试的执行顺序是:

1、调用默认构造函数创建一个新的带固件对象。

2、立即调用 SetUp()。

3、运行 TEST_F体。

4、立即调用 TearDown()。

5、调用析构函数销毁类对象。

inline int Add(int i, int j) { return i + j; }class AddTest : public testing::Test
{
public:virtual void SetUp() { puts("SetUp()"); }virtual void TearDown() { puts("TearDown()"); }
};TEST_F(AddTest, 正数) {ASSERT_GT(Add(1, 2), 3); // 故意的  ASSERT_EQ(Add(4, 5), 6); // 也是故意的
}TEST_F(AddTest, 复数) {ASSERT_GT(Add(2, 2), 3); // 故意的  ASSERT_EQ(Add(8, 5), 6); // 也是故意的
}int main(int argc, char **argv) {std::cout << "Running main() from gtest_main.cc\n";testing::InitGoogleTest(&argc, argv);RUN_ALL_TESTS();system("pause");return 0;
}

五、TEST_P

当待测试方法的行为取决于传入的参数时,而且这些参数的不同组合有多种, 而你又不想为此写多个相类似的test case时,可以用value-parameterized Test

value-parameterized Test 允许你可以使用不同的参数测试代码, 而无需编写同一测试的多个副本

enum class CalculateType : int
{add = 1,minus = 2,plus = 3,divide = 4
};class MyClass
{
public:int calculate(int a, int b, CalculateType type){int c = 0;switch (type){case CalculateType::add:c = a + b;break;case CalculateType::minus:c = a - b;break;case CalculateType::plus:c = a * b;break;case CalculateType::divide:c = a / b;break;}return c;}
};
struct MyTestData
{int a;int b;CalculateType type;
};class TestMyClass : public ::testing::Test,public ::testing::WithParamInterface<MyTestData>
{
public:MyClass myclass;
};TEST_P(TestMyClass, norml)
{int a = GetParam().a;int b = GetParam().b;int re = myclass.calculate(a, b, GetParam().type);switch (GetParam().type){case CalculateType::add:EXPECT_EQ(a + b, re);break;case CalculateType::minus:EXPECT_EQ(a - b, re);break;case CalculateType::plus:EXPECT_EQ(a * b, re);break;case CalculateType::divide:EXPECT_EQ(a / b, re);break;}
}INSTANTIATE_TEST_SUITE_P(TestMyClassParams,TestMyClass, ::testing::Values(MyTestData{ 1, 2, CalculateType::add },MyTestData{ 4, 3, CalculateType::minus },MyTestData{ 5, 6, CalculateType::plus },MyTestData{ 8, 2, CalculateType::divide }
));

参考:

Gtest入门2 Gtest之TEST宏的用法_sevencheng798的博客-CSDN博客_gtest test宏

GTest源码剖析(四)——TEST_P宏_沐寒握冰的博客-CSDN博客

gtest和gmock入门_放牛娃不吃草的博客-CSDN博客

Gtest之TEST宏的用法相关推荐

  1. assert宏的用法

    assert宏的用法 assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:  #include <assert.h>  v ...

  2. BOOST_CONSTANTS_GENERATE宏相关用法的测试程序

    BOOST_CONSTANTS_GENERATE宏相关用法的测试程序 实现功能 C++实现代码 实现功能 BOOST_CONSTANTS_GENERATE宏相关用法的测试程序 C++实现代码 #ifd ...

  3. 宏BOOST_CHECK_EXCEPTION用法的测试程序

    宏BOOST_CHECK_EXCEPTION用法的测试程序 实现功能 C++实现代码 实现功能 宏BOOST_CHECK_EXCEPTION用法的测试程序 C++实现代码 #include <g ...

  4. 宏FUSION_MAKE用法的测试程序

    宏FUSION_MAKE用法的测试程序 实现功能 C++实现代码 实现功能 宏FUSION_MAKE用法的测试程序 C++实现代码 #include <boost/detail/lightwei ...

  5. gtest之断言宏的使用以及三种事件机制

    前面简单的介绍了一下gtest以及在Windows下如何安装gtest,今天再介绍一下在Linux下该如何安装. 本文重点: 在Linux下如何安装gtest: gtest下断言宏的介绍: gtest ...

  6. C语言宏定义用法总结

    前言 最近在看源代码与开发项目的时候经常会遇到一些特殊的宏用户,接接触时感觉有点奇怪,其实是自己没有全面的熟悉宏的用法.在查阅完相关的材料后,写下这一篇总结,以期待以后忘记的时候可以重新打开回忆起里面 ...

  7. c 宏定义用法#define

    转自:https://blog.csdn.net/boring_wednesday/article/details/78756696 宏定义 语法     #define name Stuff #de ...

  8. makefile使用宏及用法$(宏标识符) $(cc)_宏编程的艺术

    微信限制:不能放置链接,代码样式比较奇怪,发布后不能更新... 推荐 阅读原文: 写在前面 之前写过几篇关于 C/C++ 宏 (macro) 和 C++ 元编程 (metaprogramming) 的 ...

  9. 最全面的gtest的TEST宏源码解析及自动调度机制

    GTEST的TEST原理分析及自动调度解析 介绍 Gtest是google开发的一个开源的C++测试框架,可在Linux, Windows,Mac多个平台上对C++源码进行测试,它提供了丰富的断言.可 ...

  10. 转:linux内核驱动中_IO, _IOR, _IOW, _IOWR 宏的用法与解析

    在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值.cmd除了可区别数字外,还包含有助于处理的几种相应信息. cmd的大小为 32位,共分 4 个 ...

最新文章

  1. 做为程序员对sql进行的性能优化
  2. js如何改变HTML属性,javascript – 如何动态设置HTML lang属性?
  3. ubuntu下磁道坏区的检测与修复
  4. Codeforces Round #Pi (Div. 2) D. One-Dimensional Battle Ships set区间分解
  5. Oracle 用子查询创建表
  6. ThoughtWorks代码挑战——FizzBuzzWhizz
  7. 【渝粤题库】国家开放大学2021春1376机械制造装备及设计题目
  8. 加载文件流_jvm类加载的过程
  9. java urlrewrite_Java|urlrewrite|URL重写|多个参数
  10. vnc安装linux教程,Centos7安装配置vncserver详细教程
  11. 阶段3 2.Spring_04.Spring的常用注解_1 今日课程内容介绍
  12. 故事到此为止了,谢谢遇见,让我成长。
  13. 如何使用SqlLoader导入数据
  14. C# 设置PPT的表格样式
  15. 计算机中年级排名怎么操作,智学网年级排名查看方法规则介绍
  16. 智能硬件不止树莓派,八款优秀智能硬件开源项目推荐
  17. Tera Term (串口工具)永久保存设置的字体和框体大小
  18. 云运维拓扑图_云运维的核心是什么?
  19. 解决 Matlab 命令行窗口,画图中图例中文乱码的情况
  20. Java接口回调的概念和作用

热门文章

  1. [Mac] OSX 快捷键组合 (完整版)
  2. 【点云配准算法】【NDT】
  3. PHPstudy实战安装帝国CMS
  4. 群晖 DLNA 设置
  5. 生成对抗网络训练_生成对抗网络
  6. opencv十字瞄准线 在图像上长按左键画矩形单击右键清除
  7. 【C语言】实现简易网络聊天室
  8. git的使用简介 常用命令
  9. 反应器(Reactor)模式
  10. 自定义词库 android,[Android]从头到尾教你制作发音且字体显示正常的Ankidroid(Anki)词库 | 古意人...