C++ 测试框架 GoogleTest 初学者入门篇 甲
*以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/BS_u9A4EY50y4vDDuxkCAQ

开发者虽然主要负责工程里的开发任务,但是每个开发完毕的功能都是需要开发者自测通过的,所以经常会听到开发者提起单元测试的话题。那么今天我就带大伙一起来看看大名鼎鼎的谷歌 C++ 测试框架 GoogleTest.
简单介绍
来看看谷歌官方是怎么介绍这个框架的:
Googletest 是由测试技术团队根据 Google 的特定要求和约束开发的测试框架。无论您是在 Linux,Windows 还是 Mac 上工作,如果您编写 C++ 代码,googletest 都可以为您提供帮助。它支持任何类型的测试,而不仅仅是单元测试。
虽然谷歌是根据特定的需求和限制条件来开发这个框架的,但是它自己也指明了这个框架还可以用于其它用途,比如作为模拟器使用,当然这就扯远了,暂且不提。
谷歌在开发这套框架的时候,是有一套基本的设计思路的。
他们认为测试应该是相互独立而且是可重复的。如果正在做的测试由于其他测试的成功或失败而受到影响,这无疑会令人感到痛苦。GoogleTest 通过在不同的对象上运行不同的测试来实现测试的相互隔离。当其中一个或多个测试失败时,测试框架还允许测试者继续单独运行测试用例以达到快速调试。测试应该组织良好,并反映测试代码的结构。有很多测试其实可以共享数据和子例程的,那么 Googletest 提供了测试套件的概念将相关测试分组,测试套件中的所有测试就可以共享数据和子例程了。这种模式其实很常见,并且使得测试易于维护,特别是当你需要切换到新的代码工程时,测试流程将极大简化。
像谷歌这种规模的科技企业,内部的 C++ 项目非常之多,还是跨平台的,那么就对测试框架有平台无关的要求了。GoogleTest 正是如此,无论你是用的是那款编译器,哪个平台,通吃。
当然,测试的过程中理应提供尽可能全面的信息帮助开发者理解执行软件过程,GoogleTest 也不例外。就算测试过程中,某个测试执行失败被停止了,测试框架也会继续其它测试。如果你不希望某个测试由于失败而停止,可以设置该测试为非致命报错(non-fatal)。像这样的测试过程,可以帮助开发者在单个运行-编辑-编译周期中找到尽可能多的问题 bug。这样的测试框架是不是很高效?
虽说问题 bug 出现就够令开发者讨厌的了,但是自测过程的繁琐事那就更糟心了(头发怎么掉得那么快),比如,开发者除了需要测试具体内容还得自己跟踪测试清单。Googletest 就可以帮助你从这里边脱身出来,做一枚潇洒的码农。
这里问一句,你用过 JUnit 或 PyUnit 吗?如果有的话,那么 Googletest 对你来说真的是易如反掌了。据说 Googletest 是基于 xUnit 架构开发而来。至于什么是 xUnit 架构,有机会我再聊聊吧。
测试框架在测试过程中,基本的测试操作就是使用断言(assert)来验证测试代码的行为,崩溃或者断言失败都表示被测试代码的行为不正确,否则正确。
初体验
来看一下简单的测试样例(环境配置安装会在后面有详细介绍)
#include <math.h>
#include <gtest/gtest.h>
int square(const int a)
{
    int b = a * a;
    if (b != b) {
        return -1;
    } else {
        return a * a;
    }
}
TEST(SquareTest, PositiveNos) {
    ASSERT_EQ(0, square(0));
    ASSERT_EQ(36, square(6));
    ASSERT_EQ(324, square(18));
}
int main(int argc, char **argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
这个测试样例是为了测试函数 int square(const int a) 的行为是否正确。
编译生成可执行文件之后,运行起来

可以看到,上面总共有一个测试套件和一个测试。首先启动一次全局测试环境,使用框架提供的宏 TEST() 创建了一个测试套件,命名为 SquareTest,和一个测试,命名为 PositiveNos。然后,运行测试套件内包含的所有测试,测试通过 OK。全部测试结束后,卸载全局测试环境。汇总全部测试结果 PASSED。测试流程结束。
由于篇幅受限,本系列教程还未完结,下一篇《C++ 测试框架 GoogleTest 初学者入门篇 乙》将在本公众号稍后推送,如果你想看了解更多精彩内容,欢迎关注我的微信公众号 ENG八戒
学习可以等,时间不等人!
关注我,带你学习编程领域更多核心技能!

C++ 测试框架 GoogleTest 初学者入门篇 甲的更多相关文章
- Google C++测试框架系列:入门
		Google C++测试框架系列:入门 原始链接:V1_6_Primer 注 GTest或者Google Test: Google的C++测试框架. Test Fixtures: 这个词实在找不到对应 ... 
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作
		导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射 下一篇:Farseer.net轻量级ORM开源 ... 
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程数据操作
		导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射 下一篇:Farseer.net轻量级ORM ... 
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射
		导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作 下一篇:Farseer.net轻量级ORM开源 ... 
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射
		导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作 下一篇:Farseer.net轻量级ORM开源框 ... 
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文
		导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件 下一篇:Farseer.net轻量级ORM开源 ... 
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作
		导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射 下一篇:Farseer.net轻量级ORM开源框 ... 
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射
		导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文 下一篇:Farseer.net轻量级ORM开源框 ... 
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件
		导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明 下一篇:Farseer.net轻量级ORM开源框架 ... 
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明
		导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:没有了 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置 前言 V1.x版本终于到来了.本次 ... 
随机推荐
- win10版本eclipse安装教程——
			第一步:下载jdk,配置环境 见我第二篇博客有说明:点击即可进入 第二步:下载eclipse 点击即可进入官网下载 点击 Download Packages,进入eclipse下载页面.从 Eclip ... 
- ES7-ES12总结篇
			脑图模式   插入 ES7-ES12  ES7  Array.prototype.includes() includes() 方法用来判断一个数组是否包含一个指定的值,如果包含则 ... 
- Monkey 用户指南(译)
			原址:https://developer.android.com/studio/test/monkey.html 帮助:google翻译:https://translate.google.cn/ 自己 ... 
- vm 16 player安装与网络配置
			1.密钥: FA1M0-89YE3-081TQ-AFNX9-NKUC0 2.安装步骤: xshell6,要先右键管理员运行绿化.bat,再双击.exe 3.一般的虚拟机,需要win上的v8适配器的ip ... 
- 二,使用axios
			1,下载https://unpkg.com/axios@1.3.2/dist/axios.min.js保存在js目录下,命名为axios.js 2,http.js let baseUrl = &quo ... 
- redis事务和锁机制、持久化操作RDB/AOF
			一.Redis事务介绍 Redis事务是一个单独的隔离操作 :事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断.Redis事务的主要作用就是串联多个 ... 
- Honeywell安卓版手持机设置广播方式
			设置>Honeywell设置>扫描设置>Internal Scanner>Default profile>Data Processing Settings>Data ... 
- java学习笔记(四)变量
			局部变量,必须声明和初始化值: 实列变量,从属于对象:如果不自行初始化,这个类型的默认值,数值类型,0,0.0 布尔值 默认为false 除了基本类型下,其余的默认值都是null 如 变量类型 ... 
- ASP.NET WEBAPI 获取微信Access token
			/// <summary> /// 获取Access token /// </summary> /// <param name="appid"> ... 
- Nginx常用经典配置|反向代理、HTTPS重定向、端口转发
			二级目录映射 目前前后端项目分离场景多了以后,一般是前端一个端口,后端一个端口. 如前端是https://example.com/index.html,调用的接口是https://example.co ... 
