引言

本文将先介绍单元测试的相关概念,然后引入Google的开源C++单元测试框架Gtest,最后通过编译、运行Gtest自带的一个测试样例,介绍如何在Unix/Linux下使用Gtest。

单元测试

说到单元测试,大家应该不会陌生。作为软件开发过程中最低级别的测试环节,单元测试一般由编码人员自己完成,它的目的是隔离程序部件,并证明这些单个部件满足预期的功能。在静态程序分析、代码检视之后进行单元测试,可以帮助我们在开发过程的早期发现问题。好的测试具备以下特点:

1.独立。一个测试用例应该是独立的,所谓“独立”,即该测试用例的测试结果不受其他测试的影响,下面的例子简单地说明了单元测试的独立性:

 1 #include <assert.h>
 2 int glob[3] = {1, 2, 3};
 3 int* g_p = glob;
 4 int alloc(void)
 5 {
 6     return *g_p++;
 7 }
 8 int release(void)
 9 {
10     return *g_p--;
11 }
12 void test_1(void)
13 {
14     assert(1 == alloc());
15     //release();
16 }
17 void test_2(void)
18 {
19     assert(1 == alloc());
20     //release();
21 }
22 int main()
23 {
24     test_1();
25     test_2();
26     return 0;
27 }

在上面的例子中,test_2的断言会被抛出,显然它的运行受到了test_1的影响,test_1中进行了申请(alloc),理应进行释放(release),以保证该用例在运行前后程序的状态一致。

2.有效的组织架构,清晰的命名。各个测试用例针对不同的测试对象,而对单个测试对象而言,又可能有多个测试用例对应该对象的多个功能。好的习惯是把这些用例以层次结构的形式组织起来,并使用清晰的命名,使得我们通过阅读用例名称即可明了该用例的功能。

3.可移植、可复用。像我们对程序平台性无关的苛刻要求一样,对于优秀的测试,我们也期望做到在不同的操作系统、编译器间进行方便地移植。

4.当用例失败时,提供尽可能多的有效信息。毋庸置疑,提示信息越是清晰和全面,越方便我们定位问题、高效地找出程序中的bug。

如今有不少测试框架帮助我们完成单元测试,像针对C++的有Google Test、CppUnit,针对C的有CUnit,针对Java的有JUnit,这些测试框架为我们实现独立、可移植、可复用、有组织的测试提供了条件,使我们能够专注于编写程序功能相关的测试代码。下面介绍Gtest的使用方法。

Google C++单元测试框架

Google C++单元测试框架(简称Gtest),可在多个平台上使用(包括Linux, Mac OS X, Windows, Cygwin和Symbian),它提供了丰富的断言、致命和非致命失败判断,能进行值参数化测试、类型参数化测试、“死亡测试”。Gtest是一个开源的项目,其源码可以从这里下载,目前的代码发行版是1.6.0。

编译

源码包中的README文件说明了如何编译Gtest源码,目录msvc、xcode中分别包含了Windows、Mac OS X平台相关的项目文件,cmake目录下是使用CMake进行Makefiles和项目生成的相关文件,如果你在Unix/Linux下,直接在源码目录下执行make命令即可编译。

如果执行make的过程中遇到如下出错提示:

./src/gtest-death-test.cc:970:73: error: ‘clone’ was not declared in this scope
make: *** [src/gtest-all.lo] Error 1

在/src/gtest-death-test.cc文件中,将第970行的代码:

970     child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);

改成:

970     child_pid = fork();

使用make编译过后并不需要执行make install命令安装Gtest相关的头文件和库文件,对自己的测试代码进行编译时,从当前目录引用头文件和库文件即可。

执行用例

源码文件的samples目录下为我们提供了多个用例,从sample1到sample9,Gtest作者由浅入深为我们讲解了Gtest的用法,怎么执行这些用例呢?

首先进入源码目录下的make目录,其中包含了一个Makefile文件,执行make命令,make命令执行过后可以看到该目录下增加了几个文件,其中sample1_unittest就是sample1的可执行文件了。执行./sample1_unittest即可看到测试的运行结果:

为编译生成其他用例的可执行文件,我们可以参照make目录下的Makefile文件,或者执行以下步骤:

将gtest-main.a动态库文件拷贝到samples目录下,执行以下命令:

$ g++ -I ../include/ -c sample2_unittest.cc  

以及:

$ g++ -I ../include/ sample2.o sample2_unittest.o gtest_main.a -lpthread -o test2

最后我们得到了sample2的可执行文件test2,经过这几步,相信大家也懂得了如何生成自己的Gtest测试执行文件。

小结

本文介绍了良好的测试代码所具备的一些特点,对Gtest作了简要介绍,说明了如何编译Gtest测试代码、生成Gtest测试可执行文件。接下来的文章将详细介绍Gtest的使用方法,包括断言、函数测试、测试固件、参数化、“死亡测试”等内容。

Reference: googletest project

《玩转Google开源C++单元测试框架Google Test系列(gtest)》by CoderZh

Google C++单元测试框架(Gtest)系列教程之一——入门相关推荐

  1. Google C++单元测试框架(Gtest)系列教程之六——FAQ节选

    这一节,我们来看Gtest的FAQ(Frequently-Asked Questions). 为什么测试用例和测试实例命名中不应包含下划线 在C++中,对于以下情况,相应的标识可能会被编译器或标准库使 ...

  2. C++单元测试框架Gtest的配置与使用过程

    转载地址:https://blog.csdn.net/clayanddev/article/details/53771248 "你的时间非常值钱,我是单元测试,我在编程世界等你. " ...

  3. Python框架Flask系列教程(1)——基础-黄勇-专题视频课程

    Python框架Flask系列教程(1)--基础-4431人已学习 课程介绍         从初级讲解Flask开发网站.涉及到的知识点包括:URL和视图.Jinja2模版.SQLAlchemy数据 ...

  4. 前端测试框架Jest系列教程 -- Expect(验证)

    写在前面 在编写测试时,我们通常需要检查值是否满足某些条件,Jest中提供的expect允许你访问很多"Matchers",这些"匹配器"允许您验证不同的东西. ...

  5. JUnit5单元测试框架的使用教程与简单实例

    1.JUnit5的使用教程 1.1 简介 JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最 ...

  6. Docker框架使用系列教程(七)Dockerfile镜像创建

    docker框架系列教程已经到第七期了,今天我们介绍一下Dockerfile镜像的创建,重点都在内部进行了标注,喜欢记得分享收藏. Dockerfile创建镜像 Dockerfile由一行行命令语句组 ...

  7. Docker框架使用系列教程(六)创建镜像

    到这里docker系列教程已经是第六期了,今天小千来给大家介绍一下docker镜像的创建方法,还是老规矩喜欢的话记得收藏起来. 创建镜像 当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求 ...

  8. 【全栈接口测试进阶系列教程】入门到入职的jmeter接口测试工具实战,接口测试步骤,正则表达式jsonpath,断言,接口加密,beanshell,jdbc,jmeter+ant+jenkins

    目录 [本文简介看之前请详细的看完介绍] 本文是全网首发的[全栈接口测试进阶系列教程]jmeter接口测试工具从入门到入职, 接口系列包含 接口测试系列包含所有的接口测试工具入门到入职,如果你喜欢的话 ...

  9. 报表 labview_【LabVIEW懒人系列教程小白入门】1.3LabVIEW数据类型

    上期作业解答: 如何对齐控件(动图) 第一种方法: 第二种方法: 第三种方法: 第四种方法: 大家尝试至少用第一种方法编写出该题. 作业讲解结束 labview中需要熟悉的控件类型有: 基本数据类型: ...

最新文章

  1. linux-文件权限与目录配置
  2. 图解Android Studio 2.0安装步骤
  3. gitlab定期备份_如何在一分钟内让GitLab为您做定期工作
  4. 流媒体技术笔记(协议相关)
  5. 2.6.29的一个节省内存的补丁
  6. 030-sysctl
  7. 企业级Web报表工具告诉你财务要做哪些数据分析
  8. axios报错Error: Request body larger than maxBodyLength limit
  9. Mac_IOS_报:The Xcode build system has crashed. Please close and reopen your workspace.
  10. 华为云搭建javaweb服务器
  11. android wifi是否可用,Android判断网络是否可用、区分WiFi和数据、是否被安全软件拦截...
  12. 全国计算机扥及考试c语言教程,【计算机】第1章 C语言绪论.ppt
  13. 9宫格解锁 android_9个点的所有解锁图_Android九宫格手势锁设定和解锁
  14. JavaScript计算两个日期之间相差的天数
  15. ###《High-level event recognition in unconstrained videos》
  16. 简单读!Mybatis源码(一)一条select的一生
  17. u盘无法linux,Linux 3.18U盘无法正确使用
  18. for循环输出素数探究【java】
  19. 如何将视频修改成html,如何利用h5将视频设置为背景
  20. 计算机网络提纲,计算机网络复习提纲学生版

热门文章

  1. go语音protobuf_golang 使用 protobuf 的教程
  2. java项目加减乘除验证码_课堂Java小程序(加减乘除与验证码)
  3. java比较equlse_java基础知识要点
  4. bp配置 sap_SAP转储订单之 STO without delivery
  5. Pcm设备2M通道,E1的基础知识介绍
  6. [渝粤教育] 四川农业大学 理论力学 参考 资料
  7. 【渝粤教育】国家开放大学2018年春季 0599-22T工程造价管理基础理论与相关法规 参考试题
  8. [渝粤教育] 西南科技大学 电器设备及维修 在线考试复习资料
  9. android过滤html标签,Android中处理TextView带超链接HTML标签的点击事件处理方法
  10. spss三次指数平滑_17 统计学:SPSS基础