gTest&gMock learning
在C++中,编写服务后的一种测试方式是使用google的gTest和gMock结合
之前写py,测试方式是将服务挂起,使用工具模拟请求发包,check resp,这样的缺点在于不方便,即使存下了所有的模拟请求,回头还是要按一遍,并且所做的测试并不能算作单元测试,而是集成
而使用test&mock的方式可以做到固定的单元测试
gTest:编写固定的单元测试代码,对每个c++的服务类进行测试
gMock:所测试的单元可能会有依赖的部分,我们当然是确保这些依赖项完全正确,那么就会面临一个局面:1 我们不能访问这些依赖项,因为单元测试。。 2 我们其实已经知道访问依赖项所得到的结果了
而我们又不能去写死,这样会更改单元测试代码。 于是这样就催生出一种需求,得到一个黑盒,对进去的请求直接返回设置好的答案,可以理解为一个大的if-else,mock就是这样,在这个黑盒里面写好
对于各种input的output(并非真的ifelse),代替依赖
gTest是一个框架,它支持我们对所测试方法,输入input,对比期望output,如TEST,一个TEST内可以有很多次测试
然而,假设我们需要对ray进行两次测试,分为ray_tt和ray_pg,其中都需要对input的类进行很长的初始化,如果两个可以放到同一个TEST,那么的确可以初始一次,测试两次,然而这样就不是很正规,于是gTest提供了TEST的升级版TEST_F,
对于每个TEST_F,可以传入一个类,在其中编写类似于构造方法的方法来实现自动初始化,这样对于每个独立测试都可以方便初始化和代码复用
在TEST_F之上和之下也有相同功能的东西,TEST_F的F=Fixture,对于多个测试的独立测试体进行统一初始化,上为TEST_ENV,即整个环境,在main中调用,对这次测试的最初和最后进行操作
下为TEST_CASE,在一个TEST中的多次测试事件的前后执行,看起来无意义,但从感觉上看,TEST等级(包括TEST_F)像是一类测试的归档,其中的多个case没有关联,甚至顺序随机,如果有相同的依赖,那么肯定要对依赖进行每个case的初始化
从魔幻的尝试修改之前的Test框架debug一下午得出来的结论:崩溃就去gdb core文件,有真相,注意一些地方的传值是不是空的,遇到过很多错误是因为顺序不对导致初始化前做了什么东西。
UT已经差不多结束了。。写一下感想
之前的任务是将已有的框架改成gTest gMock的格式,于是进行了学习,但是后来因为时间紧所以目标变成了跑通已有的UT
gTest体现的是黑盒测试,调用接口,测试结果和预期,而gMock的功能不仅在于实现“单元测试”,我们Mock出来一个依赖项,就可以控制它的行为,以实现白盒测试
gMock的功能是相当强大的,一般的Mock方法是对原有类做一个Mock类(成员函数为我们新造的),当程序调用类的时候会判断当前是否为Test环境(Test全局变量是否为true),从而返还不同的类,我们如果期待一个Mock类的方法能根据我们的想法来变换作用,就必须像区分是否返回Mock类一样挨个去判断(挨个判断各种Flag是否为true),这样就像写PrepareStmt一样,虽然写的多了最后随意调用就好,但是一开始会不断往上加
而gMock的做法是在UT代码中对原有类进行gMock声明,不重写内部函数,在需要控制依赖项行为的时候,"将service中,依赖项的对象更改为Mock对象,并声明期待行为",期待行为一般比较短。
对于Mock类,我们可以控制它的方法的被调用次数、返回值等
gTest&gMock learning的更多相关文章
- 使用gmock白盒测试
提起白盒测试,很多程序员可能觉得就是个书上的概念,很多人写完代码根本没有具体的测试方案,自己觉得可行就提交了,其实这是个很危险的事情,毕竟出了bug,最后要加班的人还是你 ,因此做好白盒测试,100% ...
- clion结合vcpkg以及GTest的使用
目录 一.vcpkg简介.下载和使用 1. vcpkg是什么 2. vcpkg下载 3. 使用vcpkg下载第三方库 二.clion结合vcpkg 1. 方法一:使用环境变量 2. 方法二:添加cma ...
- A quick introduction to Google test
视频参考:Google C++ Testing GTest GMock Framework 为什么要使用 Google C++ Testing Framework? 使用这个框架有许多好理由.本文讨论 ...
- 测试clang-format的格式化效果
我自己写的业余框架已告一段落,主体功能已完成,剩下的就是优化.第一个要优化的,就是代码格式.我一直是用编辑器写代码的,从之前的UltraEdit到notepad++到sublime text,再到现在 ...
- C++雾中风景番外篇2:Gtest 与 Gmock,聊聊C++的单元测试
正式工作之后,公司对于单元测试要求比较严格.(笔者之前比较懒,一般很少写完整的单测~~).作为一个合格的开发工程师,需要为所编写代码编写适量的单元测试是十分必要的,在实际进行的开发工作之中,TDD(T ...
- 白盒测试之gmock入门篇
一.gmock是什么 gmock是google公司推出的一款开源的白盒测试工具.gmock是个很强大的东西,测试一个模块的时候,可能涉及到和其他模块交互,可以将模块之间的接口mock起来,模拟交互过程 ...
- 编写优美的GTest测试案例
http://www.cnblogs.com/coderzh/archive/2010/01/09/beautiful-testcase.html 使用gtest也有很长一段时间了,这期间也积累了一些 ...
- gmock使用、原理及源码分析
1 初识gmock 1.1 什么是Mock 便捷的模拟对象的方法. 1.2 Google Mock概述 google mock是用来配合google test对C++项目 ...
- 在Clion里链接gtest
本来以为像之前链接boost一样,加个链接路径就好了,没想到报找不到gtest的符号,搞了半天,没弄明白啥原因. 网上也没搜到好方法,只能把gtest的源码加到项目里,然后在链接了. CMake配置如 ...
随机推荐
- 使用Nana进行C++ GUI开发
Nana官网地址:nanapro.org 简单示例:NanaDemo.cpp #include <nana/gui.hpp> #include <nana/gui/widgets/b ...
- C++应该被看成是个语言集合——四种语言(C语言,OO语言,泛型语言,STL)
至少有三种语言: 一,C++ is C 二,C++ is an OO language 三,C++ is a genetic programming language 有的童鞋觉得难,可能是没有看清楚 ...
- 【opencv】c++ 读取图片 & 绘制点 & 绘制文字 & 保存图片
//read pic ]; sprintf(path, "%s%d/%s", image_dir.c_str(), cam_num, filename.c_str()); cv:: ...
- 【我的Android进阶之旅】Android 混淆文件资源分类整理
之前将所有的混淆都配置在一个 proguard-rules.pro 这个Android Studio新建项目时自动生成的文件里面,而随着项目功能迭代越来越多,代码量越来越多,引用的第二方库.第三方库都 ...
- JSR303验证
转自:http://blog.csdn.net/lu930124/article/details/52587135 JSR-303是一个数据验证的规范,这里我不会讲这个规范是怎么回事,只会讲一下JSR ...
- notepad插件:url变成可以点击的连接
- Vue组件的定义方式
1.使用template标签定义组件 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...
- Bootstrap 中的插件的学习2(导航)
实例 在导航栏内 下面的实例演示了在导航栏内的下拉菜单的用法: <!DOCTYPE HTML> <html> <head> <link href=" ...
- 基于EasyUI 快速搭建权限管理平台
前言: 一.用户角色权限设计思路: <1>不同职责的人员,对于系统操作的权限应该是不同;<2>可以对“组”进行权限分配;<3>权限管理系统应该是可扩展的;<4 ...
- ubuntu apt-get 安装 lnmp
最近在 Ubuntu 14.04 LTS 安装 LNMP 一键安装包的时候出现了问题,PHP 5 服务没有启动,只好使用 Ubuntu 官方源进行安装: Nginx (读音 “engine x”)免费 ...