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配置如 ...
随机推荐
- Python 进程(process)
1. 进程 1.1 进程的创建 fork 正在运行着的代码,就称为进程 # 示例: import os # 注意: fork 函数,只在 Unix/Linux/Mac 上运行, windows 不可以 ...
- Cyclic Nacklace ---hdu3746(循环节,kmp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746 给你一个字符串,让你在后面加尽量少的字符,使得这个字符串成为一个重复串. abca---添加bc ...
- VirtualBox network / study environment setup for RHEL
I re-visited the RHEL study material and setup the environment again, noted down the procedure. 1, c ...
- VS安装程序制作之MSI/EXE
MSI文件是Windows Installer的数据包,它实际上是一个数据库,包含安装一种产品所需要的信息和在很多安装情形下安装(和卸载)程序所需的指令和数据.MSI文件将程序的组成文件与功能关联起来 ...
- ambari rest api (修改集群配置文件)
1.找到你需要修改的配置的最新版本 curl -u admin:admin -H "X-Requested-By: ambari" -X GET http://AMBARI_SER ...
- Linux中的yum的配置以及常见报错的处理
一. 今天登录服务器的时候,误把yum所在的cache文件夹中的文件删除掉了,导致yum不能够使用,解决的方法: 显示错误如下: Loaded plugins: fastestmirror Deter ...
- 创建发布Webservice以及wsimport工具
一. 通过wsimport生成本地代理调用WebService 1.推荐的访问服务方式 WebService已纳入w3c规范,其他的平台都支持该规范 :J2EE\Php\.NET都支持wsimport ...
- MapReduce Unit Test
以前用java写MR程序总不习惯写单元测试,就是查错也只是在小规模数据上跑一下程序.昨天工作时,遇到一个bug,查了好久也查出来.估计是业务逻辑上的错误.后来没办法,只好写了个单元测试,一步步跟踪,瞬 ...
- Font: a C++ class
Font: a C++ class This class is used in Fractal Generator. Avi Examples The header fileFon ...
- spring boot 启动原理
https://www.processon.com/view/link/59812124e4b0de2518b32b6e https://www.cnblogs.com/trgl/p/7353782. ...