介绍

学习如下gtest课程,总结主要的部分

1.玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest

2.玩转Google开源C++单元测试框架Google Test系列(gtest)之二 - 断言

3.玩转Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制

4.玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化

5.玩转Google开源C++单元测试框架Google Test系列(gtest)之五 - 死亡测试

6.玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数

7.玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest

8.玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架

其中:

初始gtest:讲了gtest环境搭建,及第一个demo (必会)

断言:是gtest结果判断,写测试用例必用(必会)

事件机制:是在用例前后执行的,减少公共代码(提高)

参数化: 构造一批参数多次执行测试用例(提高)

死亡测试:崩溃或退出断言(掌握,备查)

运行参数:介绍gtest执行时可以输入的系统参数(掌握,备查)

深入解析:通过展开gtest关键宏,看gtest源码,学习Gtest原理(高级,理解精髓)

Gtest通过很简单的原理实现了C++的单元测试,还是需要好好理解其中的设计思想。

打造自己…:学习原理后,自己实现一个简化的gtest(高级)

1      初识gtest

玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest

本篇将介绍一些gtest的基本使用,包括下载,安装,编译,建立我们第一个测试Demo工程,以及编写一个最简单的测试案例。

Gtest官网

http://code.google.com/p/googletest/

从官方的使用文档里,你几乎可以获得你想要的所有东西

http://code.google.com/p/googletest/wiki/GoogleTestPrimer

http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide

编译

用VS2017打开工程,直接编译即可。

可以修改CMakeLists.txt中的一些配置。

编译之后,在msvc里面的Debug或是Release目录里看到编译出来的gtestd.lib或是gtest.lib文件。

googletest\msvc\2010\gtest\Win32-Debug

2      断言

玩转Google开源C++单元测试框架Google Test系列(gtest)之二 - 断言

gtest中,断言的宏可以理解为分为两类,一类是ASSERT系列,一类是EXPECT系列。一个直观的解释就是:

1. ASSERT_* 系列的断言,当检查点失败时,退出当前函数(注意:并非退出当前案例)。

2. EXPECT_* 系列的断言,当检查点失败时,继续往下执行。

变量值检查,如整数,bool,字符串等

这种有很多,输入EXPECT_ 和 ASSERT_ 联想很容易认识

显式返回成功或失败

直接返回成功:SUCCEED();

返回失败:

Fatal assertion

Nonfatal assertion

FAIL();

ADD_FAILURE();

 异常检查

EXPECT_THROW

EXPECT_ANY_THROW

EXPECT_NO_THROW

类型检查

testing::StaticAssertTypeEq<int, T>();

3      事件机制

玩转Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制

gtest提供了多种事件机制,非常方便我们在案例之前或之后做一些操作,有如下三种。

全局事件

全局的,所有案例执行前后。

要实现全局事件,必须写一个类,继承testing::Environment类,实现里面的SetUp和TearDown方法。

1. SetUp()方法在所有案例执行前执行

2. TearDown()方法在所有案例执行后执行

当然,这样还不够,我们还需要告诉gtest添加这个全局事件,我们需要在main函数中通过testing::AddGlobalTestEnvironment方法将事件挂进来,也就是说,我们可以写很多个这样的类,然后将他们的事件都挂上去。

TestSuite事件

TestSuite级别的,在某一批案例中第一个案例前,最后一个案例执行后。

我们需要写一个类,继承testing::Test,然后实现两个静态方法

1. SetUpTestCase() 方法在第一个TestCase之前执行

2. TearDownTestCase() 方法在最后一个TestCase之后执行

在编写测试案例时,我们需要使用TEST_F这个宏,第一个参数必须是我们上面类的名字,代表一个TestSuite。

TestCase事件

TestCase级别的,每个TestCase前后。

TestCase事件是挂在每个案例执行前后的,实现方式和上面的几乎一样,不过需要实现的是SetUp方法和TearDown方法:

1. SetUp()方法在每个TestCase之前执行

2. TearDown()方法在每个TestCase之后执行

4      参数化

玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化

在设计测试案例时,经常需要考虑给被测函数传入不同的值的情况。我们之前的做法通常是写一个通用方法,然后编写在测试案例调用它。即使使用了通用方法,这样的工作也是有很多重复性的,程序员都懒,都希望能够少写代码,多复用代码。Google的程序员也一样,他们考虑到了这个问题,并且提供了一个灵活的参数化测试的方案。

就是如果需要测试一个参数为很多值的时候,可以一次写好。具体先不看了。

5      死亡测试

玩转Google开源C++单元测试框架Google Test系列(gtest)之五 - 死亡测试

“死亡测试”名字比较恐怖,这里的“死亡”指的的是程序的崩溃。通常在测试过程中,我们需要考虑各种各样的输入,有的输入可能直接导致程序崩溃,这时我们就需要检查程序是否按照预期的方式挂掉,这也就是所谓的“死亡测试”。gtest的死亡测试能做到在一个安全的环境下执行崩溃的测试案例,同时又对崩溃结果进行验证。

Fatal assertion

Nonfatal assertion

Verifies

ASSERT_DEATH(statement, regex`);

EXPECT_DEATH(statement, regex`);

statement crashes with the given error

ASSERT_EXIT(statement, predicate, regex`);

EXPECT_EXIT(statement, predicate, regex`);

statement exits with the given error and its exit code matches predicate

由于有些异常只在Debug下抛出,因此还提供了*_DEBUG_DEATH,用来处理Debug和Realease下的不同。

简单来说,通过*_DEATH(statement, regex`)和*_EXIT(statement, predicate, regex`),我们可以非常方便的编写导致崩溃的测试案例,并且在不影响其他案例执行的情况下,对崩溃案例的结果进行检查。

6      运行参数

玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数

gtest也为我们提供了一系列的运行参数(环境变量、命令行参数或代码里指定),使得我们可以对案例的执行进行一些有效的控制。

对于运行参数,gtest提供了三种设置的途径:

1. 系统环境变量

2. 命令行参数

3. 代码中指定FLAG

因为提供了三种途径,就会有优先级的问题, 有一个原则是,最后设置的那个会生效。不过总结一下,通常情况下,比较理想的优先级为:

命令行参数 > 代码中指定FLAG > 系统环境变量

在main函数中,将命令行参数交给了gtest,由gtest来搞定命令行参数的问题。

testing::InitGoogleTest(&argc, argv);

测试案例集合

命令行参数

说明

--gtest_list_tests

使用这个参数时,将不会执行里面的测试案例,

而是输出一个案例的列表。

--gtest_filter

对执行的测试案例进行过滤,支持通配符

--gtest_also_run_disabled_tests

执行案例时,同时也执行被置为无效的测试案例。

--gtest_repeat=[COUNT]

设置案例重复运行次数,非常棒的功能!

测试案例输出

命令行参数

说明

--gtest_color=(yes|no|auto)

输出命令行时是否使用一些五颜六色的颜色。默认是auto。

--gtest_print_time

输出命令行时是否打印每个测试案例的执行时间。默认是不打印的。

--gtest_output=xml[:DIRECTORY_PATH\|:FILE_PATH]

将测试结果输出到一个xml中。

对案例的异常处理

命令行参数

说明

--gtest_break_on_failure

调试模式下,当案例失败时停止,方便调试

--gtest_throw_on_failure

当案例失败时以C++异常的方式抛出

--gtest_catch_exceptions

是否捕捉异常。

7      深入解析gtest

玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest

通过分析TEST宏和RUN_ALL_TEST宏,了解到了整个gtest运作过程。

总的来说,TEST负责测试用例的编写和注册。RUN_ALL_TEST负责测试用例的运行。

8      打造自己的单元测试框架

玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架

尝试编写一个精简版本的C++单元测试框架:nancytest ,通过编写这个简单的测试框架,将有助于我们理解gtest。

gtest学习的更多相关文章

  1. Google C++测试框架系列高级篇:第二章 让GTest学习打印自定义对象

    上一篇:更多关于断言的知识 原始链接:Teaching Google Test How to Print Your Values 词汇表 版本号:v_0.1 让GTest学习打印自定义对象 当一个断言 ...

  2. gtest学习一:在vs2013中搭建gtest环境

    gtest版本:1.7.0,在哪里下载源码就不说了,网上太多了~ 配置过程: 1.下载解压后,进入googletest/msvc目录,直接打开gtest.sln,发现有四个工程:gtest.gtest ...

  3. 【索引】gtest学习笔记

    下载gtest 链接:http://www.cnblogs.com/duxiuxing/p/4270804.html gtest官方文档浅析 链接:http://www.cnblogs.com/dux ...

  4. gtest 学习

    mac 安装gtest 1.git clone https://github.com/google/googletest 2.cd googletest 3.brew install cmake如果没 ...

  5. GTest Google的一种白盒单元测试框架 开源项目

    GTest为google开源的白盒单元测试跨平台测试框架,含丰富的断言.类型参数化测试.死亡测试.以及其他的测试选项设置.文件保存等,以下将对该项目C++的实现进行简要的分析,作为学习记录备份. 基本 ...

  6. Google C++单元测试框架---Gtest框架简介(译文)

    一.设置一个新的测试项目 在用google test写测试项目之前,需要先编译gtest到library库并将测试与其链接.我们为一些流行的构建系统提供了构建文件: msvc/ for Visual ...

  7. Caffe学习系列(15):添加新层

    如何在Caffe中增加一层新的Layer呢?主要分为四步: (1)在./src/caffe/proto/caffe.proto 中增加对应layer的paramter message: (2)在./i ...

  8. Android源码-学习随笔

    在线代码网站1:http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/ 书籍: ...

  9. gtest官方文档浅析

    gtest的所有官方文档:http://code.google.com/p/googletest/w/list 选择单元测试框架的那些事 gtest不是唯一开源的单元测试框架,我也不觉得它是最好的单元 ...

随机推荐

  1. 003-BootStrap完整模板

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  2. badboy详解篇

    上一篇学习了jmeter录制的两种方法,badboy是比较好用的一个,它本身就是个测试工具,今天具体来介绍一下: 1.检查点 检查点就是记录被测系统某个值的预期结果 以百度搜索gogomall为例子 ...

  3. DDD中的EFCore

    EFCore在DDD中的使用 在DDD中,我们对聚合根的操作都会通过仓储去获取聚合实例. 因为聚合根中可能会含有实体属性,值对象属性,并且,在DDD中,我们所设计的领域模型都是充血模型.所以,在对聚合 ...

  4. [android] 界面切换的简单动画

    1. 新建个位移动画的xml文件 Activity中开启动画 使用AnimationUtils类加载动画资源文件 left_to_right.xml <?xml version="1. ...

  5. 缓存框架EhCache的简单使用

    缓存框架EhCache的简单使用: 1.Spring和EhCache框架整合 1.1导入jar包 <dependencies> <dependency> <groupId ...

  6. Spring学习笔记:面向切面编程AOP(Aspect Oriented Programming)

    一.面向切面编程AOP 目标:让我们可以“专心做事”,避免繁杂重复的功能编码 原理:将复杂的需求分解出不同方面,将公共功能集中解决 *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现 ...

  7. 互联网轻量级框架SSM-查缺补漏第九天

    简言: 第九章 Spring Ioc的概念 IoC(Inversion of Control)控制反转:比如想喝橙汁,在没有饮品店的日子,最直观的做法是买果汁机.橙汁.这是你自己“主动”创造的过程,也 ...

  8. mysql启动服务出错--发生系统错误 1067。

    记以此安装mysql出错的问题,MySQL 服务无法启动.系统出错  发生系统错误 1067.进程意外终止. 今天在安装本地mysql是,使用net start mysql命令启动服务时,总是报106 ...

  9. PHP打印日期

    <?php header("content-type:text/html;charset=utf-8"); echo "今天是 " . date(&quo ...

  10. enter键触发事件

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...