Linux 单元测试学习过程 (1)——gtest

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

软件开发完成后需要对代码进行测试,生成测试报告,因此开始学习单元测试。本文基于QT和Linux进行学习。学习目的就是生成测试报告。整个学习过程主要围绕“1.怎么进行单元测试”、“2.怎么生成测试过程的结果文件”、“3.怎么生成代码覆盖率报告”。
1.使用gtest进行单元测试
2.gtest有生成测试报告,但是可读性差
3.结合gcov和lcov生成可视化代码覆盖率报告
敏捷开发应该是测试驱动开发,应该先有测试才有功能函数。

gtest

使用gtest应该先看一下gtest官方文档,官方文档对如何使用gtest描述得挺清楚。
gtest资源下载链接。

gtest下载编译

//gtest依赖gcc 5.0+,查看本地gcc版本
gcc -v
//下载gtest资源后解压
unzip googletest-main
//解压后进入解压文件夹
mkdir build
cd build
cmake ..
make

编译成功后,在解压文件夹/bulid/lib/中生成了需要用到的库(文件后缀*.a,后面需要添加到工程中),在解压文件夹/googlemock/include/,解压文件夹/googletest/include/内的文件后面也需要添加到工程中。

gtest导入工程

gtest导入工程处理首先将上面提到的三个目录复制到工程目录下,然后需要将gtest所在的目录信息添加到CMakeLists.txt中。

# 第一,要添加这个GoogleTest requires at least C++14
set(CMAKE_CXX_STANDARD 14)
#第二,增加googletest/include/的绝对路径
include_directories(
    添加googletest/include/的目录绝对路径
)
#第三, 增加googletest/lib/的目录绝对路径
link_directories(
    添加googletest/lib/的目录绝对路径
)
#第四,增加库的名字
target_link_libraries (工程名
    gtest gtest_main
    -lpthread -lm ##pthread库(Google Test使用了这个库所以需要)
)

添加保存完后,在终端

#在build目录下
ccmake .. 或 cmake ..
#成功后就编译
make

编写测试单元用的宏(类似于函数)

断言

基本断言可以分为两类,一类是ASSERT系列,一类是EXPECT系列。

  • ASSERT_系列的断言(Fatal assertion):当检查点失败时,退出当前函数(注意:并非退出当前案例)。一个TEST代表一个案例或测试用例
  • EXPECT_系列的断言(Nonfatal assertion):当检查点失败时,继续执行下一个检查点(每一个断言表示一个检查点)。

通常情况应该首选使用EXPECT_*,因为ASSERT_*在报告完错误后不会进行清理工作,有可能导致内存泄露问题。
其中"<<"输出错误时自定义的log信息。例:

EXPECT_EQ(/*希望被测试函数返回的结果*/,/*被测试函数实际返回的结果*/)<<"测试不通过时才输出";//

更多常用的断言描述可参考gtest单元测试框架介绍及简单使用

不常用但重要的断言 断言名 参数意义
*_PRED* EXPECT_PRED1(pred,val1) pred:返回值为bool的函数,此函数参数只有一个,写函数名就好。 val1:此函数传的参数
*_PRED*断言与*_TRUE断言相似,但在失败时*_PRED*断言能打印更详细的信息 EXPECT_PRED2(pred,val1,val2) pred:返回值为bool的函数,此函数参数为两个,写函数名就好。 val1:此函数传的参数1,val2:此函数传的参数2
ASSERT_PRED1(pred,val1) 规则同上
ASSERT_PRED2(pred,val1,val2) 规则同上
后续将继续补充其他断言…

测试宏

测试宏分三类:TEST宏、TEST_F宏、TEST_P宏
TEST宏:
TEST(自定义命名,自定义命名),第一个参数testsuit名,相同的命名代表 同一个testsuit;第二个参数testcase名,测试案例名。这两个参数根据实际设计的测试用例进行命名。
TEST_F宏:
TEST_F(测试类的名字,自定义命名),第一个参数代表testsuit名,相同的命名代表同一个testsuit;第二个参数testcase名,测试案例名。结合测试类使用。
TEST_P宏:
TEST_P(测试类的名字,自定义命名),第一个参数代表testsuit名,相同的命名代表同一个testsuit;第二个参数testcase名,测试案例名。结合测试类和参数生成。
注:TEST与TEST_F的区别是,当需要测试案例之间共享参数时,需要定义一个继承testing::Test的类,TEST不能调用类,但TEST_F可以
例如:

class myTesting: public testing::TestWithParam<int>
{
public:
	static void SetUpTestCase()//testsuit
	{
		cout<<"SetUpTestCase"<<endl;
	}
	static void TearDownTestCase()//testsuit
	{
		cout<<"TearDownTestCase"<<endl;
	}
	virtual void SetUp()//testcase
	{
		cout<<"SetUp"<<endl;
	}
	virtual void TearDown()
	{
		cout<<"TearDown"<<endl;
	}
}
//生成参数
INSTANTIATE_TEST_SUITE_P(Param,myTesting,testing::Values(1,3,5,7));
/*测试参数:
* Range(begin,end,step)
* ValuesIn(begin,end)
* Bool()
* combine(,,,)排列组合
*/
TEST_P(myTesting,test)
{
	int n = GetParam();
	EXPECT_EQ(n,3)<<"inequal num "<<n;
}

事件机制

TestCase事件
  • 在每个案例执行前后
  • 需要多次对类初始时使用
  • string有多个方法
  • 适用情况:一个类,有多个行为。执行先后顺序相关的
  • 需要继承testing::Test
  • 代表一个测试用例
  • TestCase事件是挂在每个案例执行前后的,实现方式和Test’Suites的几乎一样,不过需要实现的是SetUp方法和TearDown方法:
    1. SetUp()方法在每个TestCase之前执行。
    2. TearDown()方法在每个TestCase之后执行。
TestSuit事件
  • 在某一批案例中,第一个执行前到最后一个执行后

  • 一般用于类行为测试或者其他有联系的多个方法测试

  • 适用情况:多个类,多个函数,有多种组合,用一个变量保存整个过程

  • 继承testing::Test

  • 在某一批测试用例中生命周期中唯一

    需要写一个类,继承testing::Test,然后实现两个静态方法
    1. SetUpTestCase() 方法在第一个TestCase之前执行。
    2. TearDownTestCase() 方法在最后一个TestCase之后执行。
    
全局事件
所有案例执行前后
可用于组合类行为测试
需要有main函数:testing::AddGlobalTestEnvironment(new 全局测试类名)
             testing::InitGoogleTest(&argc, argv);
继承testing::Environment
整个所有测试用例中有效

测试结果文件

  • 终端输出测试结果
...
[----------] 1 test from FooTest
[ RUN      ] FooTest.DoesAbc
[       OK ] FooTest.DoesAbc
[----------] 2 tests from BarTest
[ RUN      ] BarTest.HasXyzProperty
[       OK ] BarTest.HasXyzProperty
[ RUN      ] BarTest.ReturnsTrueOnSuccess
... some error messages ...
[   FAILED ] BarTest.ReturnsTrueOnSuccess
...
[==========] 30 tests from 14 test suites ran.
[   PASSED ] 28 tests.
[   FAILED ] 2 tests, listed below:
[   FAILED ] BarTest.ReturnsTrueOnSuccess
[   FAILED ] AnotherTest.DoesXyz

 2 FAILED TESTS
  • 生成xml报告
//在main中增加下面代码,会生成 项目名.xml
testing::GTEST_FLAG(output)="xml:";

xml内容如下

<?xml version="1.0" encoding="UTF-8"?>
<testsuites tests="3" failures="1" errors="0" time="0.035" timestamp="2011-10-31T18:52:42" name="AllTests">
  <testsuite name="MathTest" tests="2" failures="1" errors="0" time="0.015">
    <testcase name="Addition" file="test.cpp" line="1" status="run" time="0.007" classname="">
      <failure message="Value of: add(1, 1)&#x0A;  Actual: 3&#x0A;Expected: 2" type="">...</failure>
      <failure message="Value of: add(1, -1)&#x0A;  Actual: 1&#x0A;Expected: 0" type="">...</failure>
    </testcase>
    <testcase name="Subtraction" file="test.cpp" line="2" status="run" time="0.005" classname="">
    </testcase>
  </testsuite>
  <testsuite name="LogicTest" tests="1" failures="0" errors="0" time="0.005">
    <testcase name="NonContradiction" file="test.cpp" line="3" status="run" time="0.005" classname="">
    </testcase>
  </testsuite>
</testsuites>

下一篇学习内容是“怎么生成代码覆盖率报告”和“测试代码和功能代码隔离开”文章来源地址https://www.toymoban.com/news/detail-451028.html

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

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

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

相关文章

  • 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日
    浏览(51)
  • cmake应用:集成gtest进行单元测试

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

    2024年02月13日
    浏览(40)
  • CMake项目使用ctest+gtest进行单元测试

    随着CMake工具越来越强大便捷,越来越多的C/C++项目转而使用CMake来进行编译管理,它还提供了用于测试的ctest命令来执行项目中编写的单元测试。 本文就以一个实例来介绍如何使用ctest来进行单元测试。 本文实例环境VSCode+MinGW64+CMake+gtest。 需要在MinGW中安装gtest,如果没有安装

    2024年02月05日
    浏览(40)
  • C++中的断言机制与gtest单元测试

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

    2023年04月08日
    浏览(96)
  • 基于gtest/gmock/mockcpp的单元测试探索

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

    2023年04月21日
    浏览(37)
  • 手把手教你使用gtest写单元测试

    开源框架:gtest,它主要用于写单元测试,检查真自己的程序是否符合预期行为。这不是QA(测试工程师)才学的,也是每个优秀后端开发codoer的必备技能。 本期博文内容及使用的demo,参考: Googletest Basic Guide[1] Googletest Samples [2] 构建依赖环境 按照惯例,先介绍下怎么基于

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

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

    2024年02月11日
    浏览(51)
  • 单元测试gtest的安装与使用方法【结合官网的sample】

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

    2024年02月10日
    浏览(37)
  • gtest教程(记录小白从0学习gtest的过程)

    1 简介 之前对gtest一无所知,最近,找了些相关的资料,学习了下.这里主要记录了学习过程和相关知识点. 什么是gtest: gtest测试框架是在不同平台上(Linux,Mac OS X,Windows,Cygwin,Windows CE和Symbian)为编写C++测试而生成的。它是基于xUnit架构的测试框架,支持自动发现测试,丰富的

    2023年04月23日
    浏览(32)
  • cmake + gtest安装使用 C++单元测试 gcov locv代码覆盖率

    CMakeLists.txt速查简单编写 打开–g3 选项,去掉-O2以上级别的代码优化选项;否则编译器会对代码做一些优化,例如行合并,从而影响行覆盖率结果; 这里我比较懒就没有加 加到test目录下的CMakeLists.txt即可 , 其中代码编译完之后会在test/CMakeFiles/test.dir/ 生成test.cpp.gcno文件, 在运

    2024年02月05日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包