使用gtest做单元测试

这篇具有很好参考价值的文章主要介绍了使用gtest做单元测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用gtest做单元测试


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

1.用gtest写测试工程的大致流程

配置gtest头文件及库

下载gtest源码:

Releases · google/googletest (github.com)

一般选择最新版应该就没啥问题

放到本地编译,这里假设下载的是1.8.0版本

tar -zxvf googletest-release-1.8.0.tar.gz 
cd googletest-release-1.8.0/ 
mkdir build 
cd build 
cmake .. 
# 编译 
make 
# 安装 
make install

编译完之后,把googletest/include下的gtest头文件拷贝放到自己测试工程的include目录下。

使用gtest做单元测试

然后把编译出来的静态库(在build/googlemock/gtest下,分别叫libgtest.a和libgtest_main.a),放到自己测试工程下的lib文件夹下。我本地的lib目录如下,其中gmock是用来打桩的,打桩的意思是测试中一个函数还没有实现,然后在需要调用该函数的地方设置一个返回规则,这个加不加都无所谓。

使用gtest做单元测试

然后在CMakeLists.txt加入相应的配置信息

# 包含头文件的路径 
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
# 设置库文件的生成路径
set(LIBRARY_PATH "${CMAKE_CURRENT_SOURCE_DIR}/lib")

# 链接依赖的库: gtest库,pthread库 
target_link_libraries(Test目标文件 ${LIBRARY_PATH}/gtest/libgtest.a) 
target_link_libraries(Test目标文件 ${LIBRARY_PATH}/gtest/libgtest_main.a) 
target_link_libraries(Test目标文件 pthread)

然后在测试工程源文件中添加对gtest头文件,就可以使用gtest的一系列宏定义来写单元测试函数了

// Test.cpp 
#include <gtest/gtest.h> 
#include "待测试代码头文件.h" /* 待测试的业务代码头文件 */ 

/* 使用TEST宏定义测试名、用例名 */ 
TEST(Module1, function1) 
{ 
    int res = function1(...); /* 调用待测试函数 */ 
    ... 
    EXPECT_EQ(res, 1); 
    /* 比较返回和期望值 */ 
}

最后写上运行所有测试用例,就可以跑测试了。

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

以上都写得很简单,但大概流程就是,拉取gtest源码进行编译,生成gtest静态库,然后把gtest的头文件和库文件加入测试工程中,这样就可以调用gtest了。在自己测试工程中使用TEST或者TEST_F宏定义结合断言来写单元测试函数,最后运行RUN_ALL_TESTS()来运行所有测试用例。当然,CMakeLists.txt中也是必须添加相关路径引用设置的。

gtest的相关概念

TEST与TEST_F

  • TEST(test_case_name, test_name)

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

  • TEST_F(test_fixture,test_name)

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

断言

gtest中断言的宏可以分为两类:一类是ASSERT宏,另一类就是EXPECT宏了。

1、ASSERT_系列:如果当前点检测失败则退出当前函数

2、EXPECT_系列:如果当前点检测失败则继续往下执行

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

比如:

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

这样在判断不通过时会有后面打印"Abs(1)=1"。

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)

EXPECT_系列,也是具有类似的宏结构的

事件机制

我理解的事件机制是,每个TestSuite事件是某个TestSuite下的所有测试可能需要有一些相同条件,那么在每个TestSuite前运行一遍的函数或者设置,会在这个TestSuite里的所有TestCase里都是一样的,然后每个TestCase运行前可能也有些需要预先运行的函数或者设置,这个需要在TestCase事件里设置。详细解释如下:

“事件” 本质是框架给你提供了一个机会, 让你能在这样的几个机会来执行你自己定制的代码, 来给测试用例准备/清理数据。gtest提供了多种事件机制,总结一下gtest的事件一共有三种:

1、TestSuite事件

需要写一个类,继承testing::Test,然后实现两个静态方法:SetUpTestCase 方法在第一个TestCase之前执行;TearDownTestCase方法在最后一个TestCase之后执行。

2、TestCase事件

是挂在每个案例执行前后的,需要实现的是SetUp方法和TearDown方法。SetUp方法在每个TestCase之前执行;TearDown方法在每个TestCase之后执行。

3、全局事件

要实现全局事件,必须写一个类,继承testing::Environment类,实现里面的SetUp和TearDown方法。SetUp方法在所有案例执行前执行;TearDown方法在所有案例执行后执行。

例如全局事件可以按照下列方式来使用:

除了要继承testing::Environment类,还要定义一个该全局环境的一个对象并将该对象添加到全局环境测试中去。

TetsSuite事件和TestCase事件如下设置:

class TestMap:public testing::Test
{
public:
//TestSuite级别的,在某一批案例中第一个案例前,最后一个案例执行后。
static void SetUpTestCase()
{
cout<<"SetUpTestCase"<<endl;
}
static void TearDownTestCase()
{
cout<<"TearDownTestCase"<<endl;
}
/*TestCase级别的,每个TestCase前后*/
virtual void SetUp() //TEST跑之前会执行SetUp
{
cout<<"SetUp"<<endl;
}
virtual void TearDown() //TEST跑完之后会执行TearDown
{
cout<<"TearDown"<<endl;
}
};
TEST_F(TestMap,Find) //此时使用的是TEST_F宏
{
map<int,int>::iterator it=test_map.find(1);
ASSERT_NE(it,test_map.end());
}
TEST_F(TestMap,Size)
{
ASSERT_EQ(test_map.size(),5);
}
int main(int argc,char *argv[])
{
testing::InitGoogleTest(&argc, argv);//将命令行参数传递给gtest
return RUN_ALL_TESTS(); //RUN_ALL_TESTS()运行所有测试案例
}

即一般在一个头文件里引用gtest和待测试的代码头文件,然后写一个类继承testing::Test,实现里面的SetUp和

TearDown等函数,最后在测试cpp文件里使用TEST_F()来写单元测试,这时TestCase必须是刚才写的类名。

参考

gtest的介绍和使用-测试 (uml.org.cn)文章来源地址https://www.toymoban.com/news/detail-411500.html

到了这里,关于使用gtest做单元测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • gtest--单元测试

    gtest是Google的一套用于编写C++测试的框架,可以运行在很多平台上(包括Linux、Mac OS X、Windows、Cygwin等等)。基于xUnit架构。支持很多好用的特性,包括自动识别测试、丰富的断言、断言自定义、死亡测试、非终止的失败、生成XML报告等等。 好的测试应该有下面的这些特点,我

    2024年02月13日
    浏览(34)
  • gtest单元测试

    gtest是 Google 的一套用于 编写C++测试的框架 ,可以运行在很多平台上(包括Linux、Mac OS X、Windows、Cygwin等等)。基于xUnit架构。支持很多好用的特性,包括自动识别测试、丰富的断言、断言自定义、死亡测试、非终止的失败、生成XML报告等等。 测试应该是 独立的、可重复 的。

    2024年02月08日
    浏览(74)
  • 玩转单元测试之gtest

    程序开发的时候,往往需要编写一些测试样例来完成功能测试,以保证自己的代码在功能上符合预期,能考虑到一些异常边界问题等等。 1.引入gtest 2.编写第一个单测 2.1 待测试文件 2.2 单测文件 2.3 makefile文件 make ./hello_unit_test 编译并执行单测程序,执行结果如下: 1. 各种断

    2024年02月12日
    浏览(34)
  • cmake应用:集成gtest进行单元测试

    编写代码有bug是很正常的,通过编写完备的单元测试,可以及时发现问题,并且在后续的代码改进中持续观测是否引入了新的bug。对于追求质量的程序员,为自己的代码编写全面的单元测试是必备的基础技能,在编写单元测试的时候也能复盘自己的代码设计,是提高代码质量

    2024年02月13日
    浏览(40)
  • C++单元测试Gtest+Stub攻略

    笔者环境为linux环境(deepin),以下均在此环境进行 Gtest源码链接 Stub源码链接 StubExt源码链接 Stub的使用方法在cpp-stub/README_zh.md中有讲解 StubExt的使用方法在 cpp-stub-ext/ README.md中有讲解 StubExt可支持Lambda表达式进行打桩写Gtest时如果想获取一个固定的返回值或者出参十分好用 搭建环

    2024年02月10日
    浏览(52)
  • Linux 单元测试学习过程 (1)——gtest

    软件开发完成后需要对代码进行测试,生成测试报告,因此开始学习单元测试。本文基于QT和Linux进行学习。学习目的就是生成测试报告。整个学习过程主要围绕“1.怎么进行单元测试”、“2.怎么生成测试过程的结果文件”、“3.怎么生成代码覆盖率报告”。 1.使用gtest进行单

    2024年02月05日
    浏览(77)
  • 基于gtest/gmock/mockcpp的单元测试探索

    本文整体内容参考https://www.cnblogs.com/heimianshusheng/p/13530672.html(后面统一称为\\\"引文\\\"),在实际调试中发现了一些问题并予以解决,记录一下方便自己和同道中人查阅。 通过实例演练学习使用gtest对C语言编写的程序进行单元测试 学习如何用mockcpp对C语言的函数进行mock *GitHub上的

    2023年04月21日
    浏览(37)
  • C++中的断言机制与gtest单元测试

       这部分内容网上已经有很多人讲了,我就不做重复性工作,制造垃圾了,大家看看下面两个链接就可以了,因为我的专栏除了分享自己学习的知识,主要想为大家提供完整学习路线,让大家的知识体系更加完善! (1)参考:https://www.cnblogs.com/lvchaoshun/p/7816288.html (1)参考:

    2023年04月08日
    浏览(97)
  • 玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest

    目录 一、前言 二、从TEST宏开始 三、回过头看看TEST宏的定义 四、再来了解RUN_ALL_TESTS宏 四、总结 “深入解析”对我来说的确有些难度,所以我尽量将我学习到和观察到的gtest内部实现介绍给大家。本文算是抛砖引玉吧,只能是对gtest的整体结构的一些介绍,想要了解更多细节

    2024年02月11日
    浏览(51)
  • C++单元测试GoogleTest和GoogleMock十分钟快速上手(gtest&gmock)

    下载 安装 重要文件 googletest gtest/gtest.h libgtest.a libgtest_main.a 当不想写 main 函数的时候,可以直接引入 libgtest_main.a; 否则 googlemock gmock/gmock.h libgmock.a libgmock_main.a 一 .断言 gtest 中的断言分成两大类: ASSERT_* 系列:如果检测失败就直接退出 当前函数 EXPECT_* 系列:如果检测失败

    2024年02月06日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包