gtest 三种事件机制

前言:

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

  

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

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

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

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

  

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

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

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

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

  示例:  

 1 /***********************************************
 2
 3     Filename       : test.cpp
 4     Author         :
 5     Description    :
 6     Create Data    : 2018-10-21 00:42:34
 7     Modfiy History : 2018-10-21 00:42:34
 8
 9 ***********************************************/
10
11 #include <iostream>
12
13 #include <gtest/gtest.h>
14
15 using namespace std;
16
17 class MyEnvironment0 : public testing::Environment
18 {
19     public:
20         virtual void SetUp()
21         {
22             cout << "Global event0 : start" << endl;
23         }
24
25         virtual void TearDown()
26         {
27             cout << "Global event0 : end" << endl;
28         }
29 };
30
31 class MyEnvironment1 : public testing::Environment
32 {
33     public:
34         virtual void SetUp()
35         {
36             cout << "Global event1 : start" << endl;
37         }
38
39         virtual void TearDown()
40         {
41             cout << "Global event1 : end" << endl;
42         }
43 };
44
45 TEST(GlobalTest0, test0)
46 {
47     EXPECT_EQ(1, 1);
48 };
49
50
51 TEST(GlobalTest0, test1)
52 {
53     EXPECT_EQ(2, 2);
54 };
55
56 TEST(GlobalTest1, test0)
57 {
58     EXPECT_EQ(3, 3);
59 };
60
61 int main(int argc, char *argv[])
62 {
63     testing::AddGlobalTestEnvironment(new MyEnvironment0);
64     testing::AddGlobalTestEnvironment(new MyEnvironment1);
65
66     testing::InitGoogleTest(&argc, argv);
67
68     return RUN_ALL_TESTS();
69 }

  编译命令及结果:

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

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

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

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

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

  示例:

 1 /***********************************************
 2
 3     Filename       : test.cpp
 4     Author         :
 5     Description    :
 6     Create Data    : 2018-10-21 01:05:17
 7     Modfiy History : 2018-10-21 01:05:17
 8
 9 ***********************************************/
10
11 #include <iostream>
12
13 #include <gtest/gtest.h>
14
15 using namespace std;
16
17 class MyTestSuite0 : public testing::Test
18 {
19     protected:
20         static void SetUpTestSuite()
21         {
22             cout << "TestSuite event0 : start" << endl;
23         }
24
25         static void TearDownTestSuite()
26         {
27             cout << "TestSuite event0 : end" << endl;
28         }
29 };
30
31 class MyTestSuite1 : public testing::Test
32 {
33     protected:
34         static void SetUpTestSuite()
35         {
36             cout << "TestSuite event1 : start" << endl;
37         }
38
39         static void TearDownTestSuite()
40         {
41             cout << "TestSuite event1 : end" << endl;
42         }
43 };
44
45 TEST_F(MyTestSuite0, test0)
46 {
47     EXPECT_EQ(1, 1);
48 }
49
50 TEST_F(MyTestSuite1, test0)
51 {
52     EXPECT_EQ(1, 1);
53 }
54
55 TEST_F(MyTestSuite0, test1)
56 {
57     EXPECT_EQ(1, 1);
58 }
59
60 TEST_F(MyTestSuite1, test1)
61 {
62     EXPECT_EQ(1, 1);
63 }
64
65 int main(int argc, char *argv[])
66 {
67     testing::InitGoogleTest(&argc, argv);
68
69     return RUN_ALL_TESTS();
70 }

  编译命令及结果:

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

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

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

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

  示例:

 1 /***********************************************
 2
 3     Filename       : test.cpp
 4     Author         :
 5     Description    :
 6     Create Data    : 2018-10-21 01:23:12
 7     Modfiy History : 2018-10-21 01:23:12
 8
 9 ***********************************************/
10
11 #include <iostream>
12
13 #include <gtest/gtest.h>
14
15 using namespace std;
16
17 class MyTestCase0 : public testing::Test
18 {
19     protected:
20         virtual void SetUp()
21         {
22             cout << "TestCase event0 : start" << endl;
23         }
24
25         virtual void TearDown()
26         {
27             cout << "TestCase event0 : end" << endl;
28         }
29 };
30
31 class MyTestCase1 : public testing::Test
32 {
33     protected:
34         virtual void SetUp()
35         {
36             cout << "TestCase event1 : start" << endl;
37         }
38         virtual void TearDown()
39         {
40             cout << "TestCase event1 : end" << endl;
41         }
42 };
43
44 TEST_F(MyTestCase0, test0)
45 {
46     EXPECT_EQ(1, 1);
47 }
48
49 TEST_F(MyTestCase0, test1)
50 {
51     EXPECT_EQ(1, 1);
52 }
53
54 TEST_F(MyTestCase1, test0)
55 {
56     EXPECT_EQ(1, 1);
57 }
58
59 TEST_F(MyTestCase1, test1)
60 {
61     EXPECT_EQ(1, 1);
62 }
63
64 int main(int argc, char *argv[])
65 {
66     testing::InitGoogleTest(&argc, argv);
67
68     return RUN_ALL_TESTS();
69 }

  编译命令及结果:

总结:

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

原文地址:https://www.cnblogs.com/jiangyibo/p/9825610.html

时间: 2024-10-11 01:54:16

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

earlysuspend、autosleep以及wakeup_count三种休眠机制的分析和比较

一.Opportunistic sleep引言 1. 背景 (1) android 面临的问题 Opportunistic sleep: 当没有任务时,需要寻找时机,进入suspended (2) 3类同步问题 a. 内核:driver处理event的过程中,系统不能suspend b. 用户:用户进程处理的过程中系统不能suspend c. 内核与用户交互: 休眠过程中,触发event, 需abort suspend流程; event 事件需用户态处理完毕后,才能suspend; 2. ear

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

首先,Oracle安装完毕有三个默认用户 ?  Sys:数据库对象的拥有者.权限最高.password在安装的时候(口令管理)能够改变 ?  System:数据库管理员,password为manager ?  Scott:一个普通用户,password为tiger 再看连接Oracle的三种验证机制 ?  操作系统验证(具体解释见以下) ?  password文件验证 ?  数据库验证 注:前两者适用于系统用户,比方:Sys.System等:最后一个适用于普通用户.比方:Scott. 再看Ora

Oracle数据库的三种验证机制

关于超级管理员登陆不需要密码因为: 数据库的三种验证机制: 操作系统验证(具有sysdba和sysopera的用户) 密码文件验证(具有sysdba和sysopera的用户) 数据库验证(普通用户) 因为不需要密码是不安全的,所以一般在计算机管理中的用户组ora_dba把Administrator删除,删除之后就要输入密码了. 启动监听:lsnrctl start 查看监听:lsnrctl status 停止监听:lsnrctl stop 1.oracle 数据服务器包括:实例进程和数据库:  

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

html页面上的元素都可以看成是框组成的,框通过三种定位机制排列在一起就过程了我们看到的页面.而框就是盒模型. 盒模型 1.页面上的每个元素可以看成一个矩形框,每个框由元素的内容,内边距,边框和外边距组成. 2.如果在元素上添加背景,则背景是边框, 内边距和内容组成的区域. 3.在css中width和height指的是内容区域的宽度和高度.增加内边距,边框和外边距不会影响内容区域的尺寸,但会增加元素框的总尺寸.即width=element 注意:ie的盒模型中,width指的是内容,内边距,和边

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

原文(http://www.cnblogs.com/wuhuacong/p/3526335.html)非常感谢伍华聪作者的分享! 缓存在很多情况下需要用到,合理利用缓存可以一方面可以提高程序的响应速度,同时可以减少对特定资源访问的压力.本文主要针对自己在Winform方面的缓存使用做一个引导性的介绍,希望大家能够从中了解一些缓存的使用场景和使用方法.缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源(例如数据库),我们一般会考虑将一些更新不是很频繁的,可以重用的数据,通过一

js 三种事件的绑定

第一种:前段常规绑定: <button type="button" class="recolor" onclick="reCol('rowIndex','colIndex')">重新着色</button> 第2种:js绑定监听事件: //添加监听器 table.addEventListener("click", display, false); } (generat()); //获取鼠标点击的行和列 f

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

.bind(), .live(), 和 .delegate()之间的区别并不明显.但是理解它们的不同之处有助于写出更简洁的代码,并防止我们的交互程序中出现没有预料到的bug. 基础 DOM树 首先,图形化的HTML文档能帮助我们更好的理解.一个简单的HTML页面看起来应该像这样 事件冒泡(也称作事件传递)(Event bubbling aka event propagation) 点击一个链接,触发绑定在链接元素上的 click 事件,进而触发绑定到这个元素的click事件的函数. 1 $('a

CSS三种定位机制

标准文档流 块级元素撑满整个页面div,ul,li,dl,dt,p 行级元素可以一行显示多个span,strong,img,input大部分 一般不设置盒子的高度,另其自动调整 margin属性的auto值适用于盒子相对于浏览器的自动居中 浮动 当元素没有设置宽度值,而设置了浮动属性,元素的宽度随着内容的变化而变化. 元素设置浮动属性后,会对后面的元素产生影响(紧邻其后面的元素). 若设置float=left,则该元素会在其父元素中左移 清除浮动: 绝对定位( absolute position

整理:3种消息传递机制的比较:Handler、BroadcastReceiver、EventBus

摘要:本文主要写了Handler.BroadcastReceiver.EventBus这三种消息传递机制的使用方法,这里强烈推荐使用最后一种,理由如下:1.完全解耦,发送者和接受者几乎没关联,删除其中一个对另外一个没影响(这一点Handler就不行).2.传参数方便,同时支持一个发送者发送多条消息.一个接受者接受多条消息. 1.Handler: (1).发送: public Handler parentHandler;//此Handle的赋值在目的地 // 发送Handle通知 Message