前言:

  1.首先说明gtest中事件的结构层次:

  

  测试程序:一个测试程序只有一个main函数,也可以说是一个可执行程序是一个测试程序。该级别的事件机制会在程序的开始和结束执行。

  测试套件:代表一个测试用例的集合体,该级别的事件机制会在整体的测试案例开始可结束执行。

  测试用例:该级别的事件机制会在每个测试用例开始和结束都执行。

  gtest中的事件机制是指在测试前和测试后提供给用户自行添加操作的机制,而且次机制也可用让同一测试套件下的测试用例共享数据。

  

一、全局的事件机制(针对整个测试程序)

  实现全局的事件机制,需要创建一个自己的类,然后继承testing::Environment类,然后分别实现成员函数SetUp()和TearDown(),同时在main函数内进行调用,即"testing::AddGlobalTestEnvironment(new MyEnvironment);",通过调用函数我们可以添加多个全局的事件机制。

  SetUp()函数是在所有测试开始前执行。

  TearDown()函数是在所有测试结束后执行。

  示例:  

 /***********************************************

     Filename       : test.cpp
Author :
Description :
Create Data : 2018-10-21 00:42:34
Modfiy History : 2018-10-21 00:42:34 ***********************************************/ #include <iostream> #include <gtest/gtest.h> using namespace std; class MyEnvironment0 : public testing::Environment
{
public:
virtual void SetUp()
{
cout << "Global event0 : start" << endl;
} virtual void TearDown()
{
cout << "Global event0 : end" << endl;
}
}; class MyEnvironment1 : public testing::Environment
{
public:
virtual void SetUp()
{
cout << "Global event1 : start" << endl;
} virtual void TearDown()
{
cout << "Global event1 : end" << endl;
}
}; TEST(GlobalTest0, test0)
{
EXPECT_EQ(, );
}; TEST(GlobalTest0, test1)
{
EXPECT_EQ(, );
}; TEST(GlobalTest1, test0)
{
EXPECT_EQ(, );
}; int main(int argc, char *argv[])
{
testing::AddGlobalTestEnvironment(new MyEnvironment0);
testing::AddGlobalTestEnvironment(new MyEnvironment1); testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS();
}

  编译命令及结果:

二、局部的事件机制(针对一个个测试套件)

  测试套件的事件机制我们同样需要去创建一个类,继承testing::Test,实现两个静态函数SetUpTestCase()和TearDownTestCase(),测试套件的事件机制不需要像全局事件机制一样在main注册,而是需要将我们平时使用的TEST宏改为TEST_F宏。

  SetUpTestCase()函数是在测试套件第一个测试用例开始前执行。

  TearDownTestCase()函数是在测试套件最后一个测试用例结束后执行。

  需要注意TEST_F的第一个参数使我们创建的类名,也就是当前测试套件的名称。

  示例:

 /***********************************************

     Filename       : test.cpp
Author :
Description :
Create Data : 2018-10-21 01:05:17
Modfiy History : 2018-10-21 01:05:17 ***********************************************/ #include <iostream> #include <gtest/gtest.h> using namespace std; class MyTestSuite0 : public testing::Test
{
protected:
static void SetUpTestSuite()
{
cout << "TestSuite event0 : start" << endl;
} static void TearDownTestSuite()
{
cout << "TestSuite event0 : end" << endl;
}
}; class MyTestSuite1 : public testing::Test
{
protected:
static void SetUpTestSuite()
{
cout << "TestSuite event1 : start" << endl;
} static void TearDownTestSuite()
{
cout << "TestSuite event1 : end" << endl;
}
}; TEST_F(MyTestSuite0, test0)
{
EXPECT_EQ(, );
} TEST_F(MyTestSuite1, test0)
{
EXPECT_EQ(, );
} TEST_F(MyTestSuite0, test1)
{
EXPECT_EQ(, );
} TEST_F(MyTestSuite1, test1)
{
EXPECT_EQ(, );
} int main(int argc, char *argv[])
{
testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS();
}

  编译命令及结果:

三、个体的事件机制(针对一个个测试用例)

  测试用例的事件机制的创建和测试套件的基本一样,不同地方在于测试用例实现的两个函数分别是SetUp()和TearDown(),这两个函数不是静态函数了。

  SetUp()函数是在一个测试用例的开始前执行。

  TearDown()函数是在一个测试用例的结束后执行。

  示例:

 /***********************************************

     Filename       : test.cpp
Author :
Description :
Create Data : 2018-10-21 01:23:12
Modfiy History : 2018-10-21 01:23:12 ***********************************************/ #include <iostream> #include <gtest/gtest.h> using namespace std; class MyTestCase0 : public testing::Test
{
protected:
virtual void SetUp()
{
cout << "TestCase event0 : start" << endl;
} virtual void TearDown()
{
cout << "TestCase event0 : end" << endl;
}
}; class MyTestCase1 : public testing::Test
{
protected:
virtual void SetUp()
{
cout << "TestCase event1 : start" << endl;
}
virtual void TearDown()
{
cout << "TestCase event1 : end" << endl;
}
}; TEST_F(MyTestCase0, test0)
{
EXPECT_EQ(, );
} TEST_F(MyTestCase0, test1)
{
EXPECT_EQ(, );
} TEST_F(MyTestCase1, test0)
{
EXPECT_EQ(, );
} TEST_F(MyTestCase1, test1)
{
EXPECT_EQ(, );
} int main(int argc, char *argv[])
{
testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS();
}

  编译命令及结果:

总结:

  gtest的三种事件机制总的来说还是简单的,而且也比较灵活,通过上面的例子也能看出我们可以在事件机制中实现一些资源共享,使我们的测试更加灵活。

gtest 三种事件机制的更多相关文章

  1. 【css笔记】css中的盒模型和三种定位机制(固定定位,绝对定位,浮动)

    html页面上的元素都可以看成是框组成的,框通过三种定位机制排列在一起就过程了我们看到的页面.而框就是盒模型. 盒模型 1.页面上的每个元素可以看成一个矩形框,每个框由元素的内容,内边距,边框和外边距 ...

  2. Oracle基础学习2--Oracle登录与三种验证机制

    首先,Oracle安装完毕有三个默认用户 Ø  Sys:数据库对象的拥有者.权限最高.password在安装的时候(口令管理)能够改变 Ø  System:数据库管理员,password为manage ...

  3. 请写出JavaScript中常用的三种事件。

    请写出JavaScript中常用的三种事件. 解答: onclick,onblur,onChange

  4. Oracle数据库的三种验证机制

    关于超级管理员登陆不需要密码因为: 数据库的三种验证机制: 操作系统验证(具有sysdba和sysopera的用户) 密码文件验证(具有sysdba和sysopera的用户) 数据库验证(普通用户) ...

  5. NET下三种缓存机制(Winform里面的缓存使用 )

    原文(http://www.cnblogs.com/wuhuacong/p/3526335.html)非常感谢伍华聪作者的分享! 缓存在很多情况下需要用到,合理利用缓存可以一方面可以提高程序的响应速度 ...

  6. java中存在三种调用机制

    1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消息或事件的机制 ...

  7. jQuery三种事件绑定方式.bind(),.live(),.delegate()

    .bind(), .live(), 和 .delegate()之间的区别并不明显.但是理解它们的不同之处有助于写出更简洁的代码,并防止我们的交互程序中出现没有预料到的bug. 基础 DOM树 首先,图 ...

  8. python三种回收机制

    Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾.在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的 ...

  9. CSS三种定位机制

    标准文档流 块级元素撑满整个页面div,ul,li,dl,dt,p 行级元素可以一行显示多个span,strong,img,input大部分 一般不设置盒子的高度,另其自动调整 margin属性的au ...

随机推荐

  1. R语言预测实战(游浩麟)笔记2

    特征构建技术 特征变换,对原始的某个特征通过一定的规则或映射得到新特征的方法,主要方法包括概念分层.标准化.离散化.函数变换以及深入表达.特征变换主要由人工完成,属于比较基础的特征构建方法. 概念分层 ...

  2. while循环与 for循环,函数定义与调用

    import turtle turtle.setup(600,400,0,0) turtle.bgcolor('red') turtle.color('yellow') turtle.fillcolo ...

  3. 自己动手写CPU——寄存器堆、数据存储器(基于FPGA与Verilog)

    上一篇写的是基本的设计方案,由于考研复习很忙,不知道下一次什么时候才能打开博客,今天就再写一篇.写一写CPU中涉及到RAM的部件,如寄存器堆.数据存储器等. 大家应该在大一刚接触到计算机的时候就知道R ...

  4. vim打开txt文件看到^@字符

    '\0'是不可见字符,使用vim编辑器查看的文本文件中如果包含'\0'字符,vim会自动将'\0'字符转换为^@字符. 看下面的代码: #include <stdio.h> #includ ...

  5. intellij idea 程序包不可见问题

    刚用intellij idea不久,出现了个程序包不可见的问题. 原因:jdk9的问题,用的是jdk9就会出现这个问题. 解决办法:把jsk9换成jdk1.8就能解决.

  6. css实现文本块在容器中垂直居中

    效果如图: css代码: .textContainer { display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-pack: ...

  7. 配置Nim的默认编译参数 release build并运行

    配置Nim的默认编译参数 release build并运行 默认情况下nim编译是debug build,如果需要release build, 需要加上-d:release , release编译的命 ...

  8. 第七届蓝桥杯大赛个人赛决赛(软件类C语言B组)第一题:一步之遥

      这题好多人用爆搜/bfs来做,然而这题可用exgcd(扩展欧几里得)做,而且很简便. 先附原题: 一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里. 矿车停在平直的废弃的轨道上. 他的面 ...

  9. HAProxy原理和配置

    HAProxy原理和配置 目录 1.HAProxy简介 2.haproxy安装和配置说明 proxies配置参数 bind配置 Balance配置 基于cookie的会话绑定 统计接口启用相关的参数 ...

  10. vs2017 创建虚拟目录失败 http//locXXXXXX,vs2015 无法访问IIS源数据

    两个版本ide打开的错误提示不一样,但是一个解决都解决了 这个问题折磨了我接近五个小时 终于找到了解决方案,在百度上面搜的都没什么鸟用,最终还是在stackoverflow找到了解决方案,附上连接,虽 ...