这是 Google 提供的一个跨平台的测试、Mock 框架,很简单几乎没有依赖,但是提供了丰富的断言机制,尤其是提供了大部分其它语言测试框架没有的死亡测试。
这里就详细介绍如何使用这一单元测试工具。
使用时通过 宏定义一个测试用例 (函数),在定义的用例中可以通过断言测试具体的功能点,每个测试用例分成了 和 两级,输出结果时会通过 将两者连接起来做为一个测试用例的名字。
之所以这么划分,主要是为了方便管理,例如后面的添加预处理和清理函数时。
部分平台可能会包含 GTest 的软件包,那么可以直接通过相关工具安装,例如 YUM ,不过有些是不支持的,可以通过源码进行安装,也很简单,如下介绍。
目前 GTest 和 GMock 已经合并到了一起,可以直接从 Github 下载对应的代码,然后通过如下命令编译安装。
然后会在 目录下生成四个静态库,分别为 ,默认安装到 目录下,也可以在编译阶段通过指定,也就是。
因为 CMake 没有提供卸载命令,所以就只能通过 命令执行卸载。
另外,因为依赖少,可以手动安装,有两种方式:A) 将头文件、静态库添加到系统目录下;B) 编译应用时指定 GTest 和 GMock 的安装目录。如下简单介绍这两种使用方式。
不同的操作系统或者发行版本的系统目录有所不同,以 CentOS 为例,对应的库以及头文件目录分别为 和 。
其它发行版本目录略有区别,自行调整。另外,需要注意访问权限,否则可能会出现即使目录正确,编译时仍然报错。
然后通过如下命令编译。
建议同样复制到一个固定的目录下,例如可以将所有的三方库保存在 目录下,例如新增 以及 目录,类似上面操作,将所需文件复制到对应的目录下。
编译时通过 以及 参数指定头文件和库文件的路径。
在源码中有个 目录,包含了很多参考示例,如下是一个很简单的 GTest 示例。
然后编译运行,输出内容如下。
如上所示,创建一个测试用例的步骤为:
- 引入关键的头文件 ;
- 通过 宏定义测试用例;
- 测试使用断言进行判断。
所以,使用方法基本类似,只是项目可能会比较复杂。
断言分成两类:A) 当前点检测失败则退出当前函数;B) 当前点检测失败会继续往下执行。两者对应的参数相似,只是断言的前缀不同。
当断言失败时会将源码所在的源文件以及行号输出,包括了错误信息,当然,也可以自定义一个错误信息。
有时候在真正执行测试之前需要构造一部分测试用的数据或者多个测试用例需要使用相同的数据,一般是在测试用例执行前创建,执行结束后清理,GTest 提供了相关的接口,不过需要依赖类的实现。
总共分成三种级别。
需要创建一个继承自 的类,并实现其中的 和 两个方法,最后需要在 函数中通过 进行注册。
需要创建一个与 名称相同的类,同时需要继承 类,并实现其中的两个静态方法 以及 ,分别会在第一个用例前以及最后一个用例后执行。
与 TestSuite 级别使用相同的类,但是需要实现的方法不同,需要实现 以及 两个函数,分别在每个测试用例的前后执行。注意,在两个测试用例中执行的内容是不会相互影响的。
所以,感觉像是每次执行 TestSuite 的测试用例时都会新建一个对象,这样看起来每次都是最新的数据,不会保留上个测试用例的遗留数据。
如下包含了上述三种场景。
几乎是独有的特性,而所谓的死亡测试是指可能会导致程序崩溃。
在设计测试用例时,经常会遇到写一个测试函数,测试用例中传入不同的参数。
例如有个奇数的判断,测试的时候需要构建多个入参,当有少量的时候手动复制即可,即使后面修改,成本也不是很高,但是当有几十个的时候,处理起来就比较复杂了。
GTest 实际上针对这一场景有一个响应的解决方案。
简单来说分成三步:1) 定义一个类;2) 如何进行测试;3) 传入需要测试的参数。
首先,同样需要定义一个类,此时需要继承 模板类,其中的 就是需要参数化的参数类型,如上对应了 类型。
然后,通过 宏定义测试用例,其中的 P 是 Parameter 的缩写,在函数中可以通过 获取当前实际传入的参数。
最后,通过 宏定义实际传入的测试用例,包含了三个入参:
- 测试用例名称,可以随意填写一个有意义的名字。
- 需要与上面定义的类保持一致,例如IsEvenTest。
- 构建参数的参数生成器。
对于最后一个参数,常用的有: 等等。
输出如下。
另外还有针对参数的模板。
对于 GTest 生成的二进制文件,可以通过一些简单的参数定制化,传参方式有几种:A) 环境变量;B) 命令行参数;C) 代码中指定。
之所以可以通过命令行传参,主要是因为代码中使用了 ,所以,可以直接通过生成的测试二进制文件加 参数查看具体支持的参数。
在代码中可以使用 宏设置,例如对于命令行参数 可以使用 来设置,注意,这里是不需要 前缀的。
另外,设置环境变量时,需要将参数转换为大写,例如上述的 对应的环境变量为 。
一般来说,环境变量的优先级是最低的,而至于后两者的优先级,关键要看具体在代码里是如何设置的,建议将 宏放置在 函数之前,这样在命令行中可以通过参数修改。
注意, 参数是只能在命令行参数中使用的。
可以将上述的 文件重命名为 ,然后添加如下的 CMakeLists.txt 文件。
源码维护在 Github 上,也同时包括了很多有用的 Wiki信息,例如 README.md
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/10909.html