C++ 测试框架 GoogleTest 初学者入门篇 甲

c++,测试,框架,googletest,初学者,入门篇 · 浏览次数 : 246

小编点评

**Googletest 测试框架简介** Googletest 是由测试技术团队根据 Google 的特定要求和约束开发的测试框架。它可以用于任何类型的测试,支持任何类型的测试,而不仅仅是单元测试。 **主要特点:** * 测试应该是相互独立而且是可重复的。 * 当其中一个或多个测试失败时,测试框架允许测试者继续单独运行测试用例以达到快速调试。 * 测试应该组织良好,并反映测试代码的结构。 * 提供了测试套件的概念,可以共享数据和子例程的测试。 **技术特点:** * 基于 xUnit 架构。 **使用教程:** * 了解 GoogleTest 测试框架的基本概念。 * 使用 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八戒

学习可以等,时间不等人!

关注我,带你学习编程领域更多核心技能!

搜索框传播样式-标准色版.png

与C++ 测试框架 GoogleTest 初学者入门篇 甲相似的内容:

C++ 测试框架 GoogleTest 初学者入门篇 甲

经常会听到开发者提起单元测试的话题,那么今天我就带大伙一起来看看大名鼎鼎的谷歌 C++ 测试框架 GoogleTest.

C++ 测试框架 GoogleTest 初学者入门篇 乙

经常会听到开发者提起单元测试的话题,那么今天我就带大伙一起来看看大名鼎鼎的谷歌 C++ 测试框架 GoogleTest。这是系列文章的第二篇。

C++ 测试框架 GoogleTest 初学者入门篇 丙

本文上接 C++ 测试框架 GoogleTest 初学者入门篇 系列第三篇,也是最后一篇了,源码解读级别!

gtest学习

学习gtest测试 了解 单元测试 单元:函数、类等 gtest gtest是一个跨平台的(Liunx、Mac OS X、Windows、Cygwin、Windows CE and Symbian)C++单元测试框架,由google公司发布。gtest是为在不同平台上为编写C++测试而生成的。它提供

使用C#/.NET解析Wiki百科数据实现获取历史上的今天

创建一个webapi项目做测试使用。 创建新控制器,搭建一个基础框架,包括获取当天日期、wiki的请求地址等 创建一个Http请求帮助类以及方法,用于获取指定URL的信息 使用http请求访问指定url,先运行一下,看看返回的内容。内容如图右边所示,实际上是一个Json数据。我们主要解析 大事记 部

在 Net7.0环境下测试了 Assembly.Load、Assmebly.LoadFile和Assembly.LoadFrom的区别

一、简介 很长时间没有关注一些C#技术细节了,主要在研究微服务、容器、云原生、容器编排等高大上的主题了,最近在写一些框架的时候,遇到了一些和在 Net Framework 框架下不一样的情况,当然了,我今天主要测试的是,在通过【添加项目引用】和【手动拷贝DLL】的情况下,这三个方法加载程序集:Ass

[转帖]tidb 如何对 TiDB 进行 TPC-C 测试

https://docs.pingcap.com/zh/tidb/stable/benchmark-tidb-using-tpcc TPC-C 是一个对 OLTP(联机交易处理)系统进行测试的规范,使用一个商品销售模型对 OLTP 系统进行测试,其中包含五类事务: NewOrder – 新订单的生成

[转帖]CPU的IPC调优:通过优化代码,提高每个时钟的指令数

目录 代码目录结构 compile-sx.sh compile.sh s1.c s2.c s3.c s4.c alu.c nop.c alu8.c 性能测试 s1.c s2.c s3.c s4.c alu.c nop.c alu8.c 参考 IPC,英文全称“Instruction Per Cloc

iOS 单元测试

作用一名合格的程序员,得能文能武。写的了代码,也要写的了单元测试。 单元测试步骤 1.File -> New -> Target, 选择单元测试Target,创建成功 如果项目是老项目,那需要手动创建一下UnitTest Target,如果项目里已经有了就忽略。 2.创建一个swift工具的测试类C

Nginx与Tomcat作为前端服务器的性能比较

Nginx与Tomcat作为前端服务器的性能比较 摘要 最近总遇到使用tomcat还是使用nginx进行前端文件访问的争论 想着出差周末在酒店, 可以自己进行一下简单的测试. 希望能够对未来的工作进行一些指导. 测试脚本 30KB 文件测试 ab -c 1000 -n 50000 -k http:/