在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的更多相关文章

  1. 使用gmock白盒测试

    提起白盒测试,很多程序员可能觉得就是个书上的概念,很多人写完代码根本没有具体的测试方案,自己觉得可行就提交了,其实这是个很危险的事情,毕竟出了bug,最后要加班的人还是你 ,因此做好白盒测试,100% ...

  2. clion结合vcpkg以及GTest的使用

    目录 一.vcpkg简介.下载和使用 1. vcpkg是什么 2. vcpkg下载 3. 使用vcpkg下载第三方库 二.clion结合vcpkg 1. 方法一:使用环境变量 2. 方法二:添加cma ...

  3. A quick introduction to Google test

    视频参考:Google C++ Testing GTest GMock Framework 为什么要使用 Google C++ Testing Framework? 使用这个框架有许多好理由.本文讨论 ...

  4. 测试clang-format的格式化效果

    我自己写的业余框架已告一段落,主体功能已完成,剩下的就是优化.第一个要优化的,就是代码格式.我一直是用编辑器写代码的,从之前的UltraEdit到notepad++到sublime text,再到现在 ...

  5. C++雾中风景番外篇2:Gtest 与 Gmock,聊聊C++的单元测试

    正式工作之后,公司对于单元测试要求比较严格.(笔者之前比较懒,一般很少写完整的单测~~).作为一个合格的开发工程师,需要为所编写代码编写适量的单元测试是十分必要的,在实际进行的开发工作之中,TDD(T ...

  6. 白盒测试之gmock入门篇

    一.gmock是什么 gmock是google公司推出的一款开源的白盒测试工具.gmock是个很强大的东西,测试一个模块的时候,可能涉及到和其他模块交互,可以将模块之间的接口mock起来,模拟交互过程 ...

  7. 编写优美的GTest测试案例

    http://www.cnblogs.com/coderzh/archive/2010/01/09/beautiful-testcase.html 使用gtest也有很长一段时间了,这期间也积累了一些 ...

  8. gmock使用、原理及源码分析

    1      初识gmock 1.1      什么是Mock 便捷的模拟对象的方法. 1.2      Google Mock概述 google mock是用来配合google test对C++项目 ...

  9. 在Clion里链接gtest

    本来以为像之前链接boost一样,加个链接路径就好了,没想到报找不到gtest的符号,搞了半天,没弄明白啥原因. 网上也没搜到好方法,只能把gtest的源码加到项目里,然后在链接了. CMake配置如 ...

随机推荐

  1. libtorch 哪些函数比较常用?

    libtorch 加载 pytorch 模块进行预测示例 void mat2tensor(const char * path, torch::Tensor &output) { //读取图片 ...

  2. Spark2.0 协同过滤推荐

    ALS矩阵分解 http://blog.csdn.net/oucpowerman/article/details/49847979 http://www.open-open.com/lib/view/ ...

  3. linux 目录与文件命令

    目录与文件常用命令 1.cd命令 cd [相对路径或绝对路径或特殊符号] 功用:变换目录 ps: 不加参数时,默认切换到用户主目录,即环境变量HOME指定的目录,如root用户的HOME变量为/roo ...

  4. pytorch rnn

    温习一下,写着玩. import torch import torch.nn as nn import numpy as np import torch.optim as optim class RN ...

  5. css 自定义滚动条

    我遇到的场景: 对于iframe窗口,自带滚动条是整个窗口的大小.有时需要顶部或底部固定,则滚动条不应该触碰到顶部或底部. 那么首先打开iframe时应该去掉滚动条 scrolling="n ...

  6. Python 新手常犯错误(第一部分)转载

    觉得这篇文章针对python的默认参数写的不错,翻译的也不错,故转载下. 原文链接: Amir Rachum   翻译: 伯乐在线- 伯乐在线读者译文链接: http://blog.jobbole.c ...

  7. 微信公众号JSAPI支付

    微信公众号JSAPI支付 一:配置参数 申请成功后,获取接口文件, 将所有文件放入项目根目录weixin下,在WxPay.ub.config.php中填入配置账户信息; 二:设置授权 开发者中心-&g ...

  8. 记Tfs2010 Tfs_Warehouse路径配置更新

    继上一次tfs数据库迁移问题续. Tfs数据库迁移成功后遗留了部分问题,本次记录问题处理过程: 原服务器地址10.58.8.231,迁移至新服务器10.58.1.230后TFS管理控制台中 应用层 – ...

  9. POJ - 1966 Cable TV Network (最大流求点连通度)

    题意:求一个无向图的点连通度.点联通度是指,一张图最少删掉几个点使该图不连通:若本身是非连通图,则点连通度为0. 分析:无向图的点连通度可以转化为最大流解决.方法是:1.任意选择一个点作为源点:2.枚 ...

  10. Zookeeper环境安装

    源码包下载: http://archive.apache.org/dist/zookeeper/zookeeper-3.4.10 集群环境: master 192.168.1.99 slave1 19 ...