简介

    事件机制用于在案例运行前后添加一些操作(相当于挂钩函数)。目前,gtest提供了三种等级的事件,分别:

  • 全局级,所有案例执行的前后
  • TestSuite级,某一个案例集的前后
  • TestCase级,每一个案例的前后

    不同等级的事件在影响不同的范围。


示例-全局级

    全局级事件在所有案例执行的前后运行,制作该事件需要继承testing::Environment类,实现里面的SetUp和TearDown方法。为了模拟实际应用中的情况,下面的测试代码分为了三个文件,分别代表:全局级事件头文件(unit_test.h);全局级事件实现文件(unit_test.cc);具体的测试文件(test_main.cc)。测试代码如下,

/* 为单元测试设置全局事件 */
// unit_test.h
#ifndef UNIT_TEST_H_
#define UNIT_TEST_H_ #include <gtest/gtest.h> class FooEnvironment: public testing::Environment{
public:
void SetUp();
void TearDown();
}; #endif
/* 为单元测试设置全局事件 */
// unit_test.cc
#include <iostream>
#include "unit_test.h" void FooEnvironment::SetUp(){
std::cout<<"FooEnvironment::SetUp"<<std::endl;
} void FooEnvironment::TearDown(){
std::cout<<"FooEnvironment::TearDown"<<std::endl;
}
/* 单元测试 */
// test_main.cc
#include "unit_test.h" bool checkOdd(int a){
return a%2==1;
}
// 测试集checkOddTest的测试1
TEST(checkOddTest, test1){
ASSERT_EQ(true, checkOdd(1));
ASSERT_EQ(true, checkOdd(11));
} int main(int argc, char **argv){
testing::AddGlobalTestEnvironment(new FooEnvironment);
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

    上述代码是一个简单的全局级事件模板,大部分时候我们都可以采用类似的结构在实际工程中添加单元测试程序。其中,SetUp方法在所有案例前执行,TearDown方法在所有案例后执行。

    这份代码的编译同样需要gtest的头文件和库文件,所以采用了与简介中相同的方案来配置编译环境。cmake文件如下,

cmake_minimum_required(VERSION 2.6)

# Locate GTest
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS}) add_executable(runTests test_main.cc
unit_test.cc)
target_link_libraries(runTests ${GTEST_LIBRARIES} pthread)

    运行如下编译指令,可以获得单元测试程序,

cmake CMakeLists.txt

make

    now,运行单元测试程序,结果如下,

[==========] Running 1 test from 1 test case.

[----------] Global test environment set-up.

FooEnvironment::SetUp

[----------] 1 test from checkOddTest

[ RUN ] checkOddTest.test1

[ OK ] checkOddTest.test1 (0 ms)

[----------] 1 test from checkOddTest (0 ms total)

[----------] Global test environment tear-down

FooEnvironment::TearDown

[==========] 1 test from 1 test case ran. (0 ms total)

[ PASSED ] 1 test.

    可以看到,我们的单元测试程序汇报了单元测试的最终结果,包括:全局级事件的运行、测试样例的运行等等。


示例-TestSuite级

    TestSuite级的事件覆盖范围相对要小一些,只是覆盖几个具备相同事件需求的测试样例,该事件需要继承自testing::Test,实现其中的两个静态方法,

  1. SetUpTestCase()方法在该测试集的第一个TestCase之前执行
  2. TearDownTestCase()方法在该测试集的最后一个TestCase之后执行

    下列示例代码采用了与全局级事件相似的组织结构。测试代码如下,

/* test_suit.h */
/* 测试TestSuite事件 */
#ifndef TEST_SUITE_H_
#define TEST_SUITE_H_ #include <gtest/gtest.h> class FooTest: public testing::Test{
protected:
static void SetUpTestCase();
static void TearDownTestCase();
// some expensive resource shared by all tests.
static int *p_;
}; #endif
/* test_suit.cc */
/* 测试TestSuite事件 */
#include <iostream>
#include "test_suit.h" int* FooTest::p_ = nullptr; void FooTest::SetUpTestCase(){
p_ = new int;
std::cout<<"FooTest::SetUpTestCase"<<std::endl;
} void FooTest::TearDownTestCase(){
delete p_;
p_ = nullptr;
std::cout<<"FooTest::SetUpTestCase"<<std::endl;
}
/* test_main.cc */
/* 测试TestSuite事件 */
#include "test_suit.h" bool isFoo(int data){
return data%2==1;
} TEST_F(FooTest, test1){
ASSERT_EQ(true, isFoo(3));
ASSERT_EQ(false, isFoo(4));
ASSERT_EQ(true, isFoo(2));
} int main(int argc, char **argv){
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

    使用的编译文件为,

cmake_minimum_required(VERSION 2.6)
set(CMAKE_CXX_STANDARD 11) # Locate GTest
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS}) add_executable(runTests test_main.cc
test_suit.cc)
target_link_libraries(runTests ${GTEST_LIBRARIES} pthread)

    使用如下指令编译,

cmake CMakeLists.txt

make

    当编译好单元测试程序后,运行该程序,结果如下,

blue@blue-Aspire-4741:~/lab/gtest/event/suite$ ./runTests

[==========] Running 1 test from 1 test case.

[----------] Global test environment set-up.

[----------] 1 test from FooTest

FooTest::SetUpTestCase

[ RUN ] FooTest.test1

/home/blue/lab/gtest/event/suite/test_main.cc:11: Failure

Value of: isFoo(2)

Actual: false

Expected: true

[ FAILED ] FooTest.test1 (0 ms)

FooTest::SetUpTestCase

[----------] 1 test from FooTest (0 ms total)

[----------] Global test environment tear-down

[==========] 1 test from 1 test case ran. (1 ms total)

[ PASSED ] 0 tests.

[ FAILED ] 1 test, listed below:

[ FAILED ] FooTest.test1

1 FAILED TEST

    单元测试运行结果的展示也几乎一样。


示例-TestCase级

    该部分与上述两部分非常相似,仅仅是继承类与重载函数稍有不同。


Reference

    [1] http://www.cnblogs.com/coderzh/archive/2009/04/06/1430396.html 本文部分参考了这里

简单易懂的单元测试框架-gtest(二)的更多相关文章

  1. 简单易懂的单元测试框架-gtest(一)

    简介     gtest是google开源的一个单元测试框架,以其简单易学的特点被广泛使用.该框架以第三方库的方式插入被测代码中.同其他单元测试框架相似,gtest也通过制作测试样例来进行代码测试.同 ...

  2. Google单元测试框架gtest之官方sample笔记2--类型参数测试

    gtest 提供了类型参数化测试方案,可以测试不同类型的数据接口,比如模板测试.可以定义参数类型列表,按照列表定义的类型,每个测试case都执行一遍. 本例中,定义了2种计算素数的类,一个是实时计算, ...

  3. Google单元测试框架gtest之官方sample笔记3--值参数化测试

    1.7 sample7--接口测试 值参数不限定类型,也可以是类的引用,这就可以实现对类接口的测试,一个基类可以有多个继承类,那么可以测试不同的子类功能,但是只需要写一个测试用例,然后使用参数列表实现 ...

  4. Google单元测试框架gtest之官方sample笔记4--事件监控之内存泄漏测试

    sample 10 使用event listener监控Water类的创建和销毁.在Water类中,有一个静态变量allocated,创建一次值加一,销毁一次值减一.为了实现这个功能,重载了new和d ...

  5. 聊聊 Python 的单元测试框架(二):nose 和它的继任者 nose2

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  6. C++单元测试框架gtest使用

    作用 作为代码编码人员,写完代码,不仅要保证编译通过和运行,还要保证逻辑尽量正确.单元测试是对软件可测试最小单元的检查和校验.单元测试与其他测试不同,单元测试可看作是编码工作的一部分,应该由程序员完成 ...

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

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

  8. Google单元测试框架gtest之官方sample笔记1--简单用例

    1.0 通用部分 和常见的测试工具一样,gtest提供了单体测试常见的工具和组件.比如判断各种类型的值相等,大于,小于等,管理多个测试的测试组如testsuit下辖testcase,为了方便处理初始化 ...

  9. Google C++单元测试框架GoogleTest(总)

    之前一个月都在学习googletest框架,对googletest的文档都翻译了一遍,也都发在了之前的博客里,另外其实还有一部分的文档我没有发,就是GMock的CookBook部分:https://g ...

随机推荐

  1. JavaScript 新语法详解:Class 的私有属性与私有方法

    译者按: 为什么偏要用 # 符号? 原文:JavaScript's new #private class fields 译者:Fundebug 本文采用意译,版权归原作者所有 proposal-cla ...

  2. Web地图导图总结

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 地图端展示了各类制图效果,用户希望可以一键生成报表,其中核心 ...

  3. SVN的安装与配置

    单独安装 SVN:1.安装:yum -y install subversionmkdir -p /data/svn/ 创建创库目录svnadmin create /data/svn/repos 构建版 ...

  4. Python算法与数据结构--求所有子数组的和的最大值

    Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室-玄魂 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个 ...

  5. 升讯威微信营销系统开发实践:(3)功能介绍与此项目推广过程的一些体会( 完整开源于 Github)

    GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...

  6. 【安富莱STM32H7教程】第1章 初学STM32H7的准备工作

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第1章   初学STM32H7的准备工作 俗话说万事开头 ...

  7. 【从零开始搭建自己的.NET Core Api框架】(七)授权认证进阶篇

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  8. PS抠图简单粗暴2种方法

    1.矩形框住要抠的→ Ctrl+j →选中图层 →矩形框住 →图像裁剪另存为 2.钢笔工具框住要抠的→ Ctrl+Enter→ Ctrl+j→.钢笔框住→图像裁剪另存为

  9. 关于Python深浅拷贝

    拷贝: 说明:原则上就是把数据分离出来,复制其数据,并以后修改互不影响. 何来深浅拷贝的说法? 深浅拷贝的“深”和“浅”可以理解为从变量到硬盘上的物理存储介质之间的层次的多少. 下面用一个示例来解释浅 ...

  10. webstorm使用问题总结

    webstorm 打断点调试配置 run/edit configurations中,把nodejs里的历史都删除:然后打开Defaults/Node.js将node的可执行程序放到Node inter ...