Mock在接口测试中的实际应用

 关于Mock测试

01、含义和目的

1、 什么是mock测试?
Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取的比较复杂的对象(如 JDBC 中的ResultSet 对象),用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法。

2、为什么要进行Mock测试?

Mock是为了解决不同的单元之间由于耦合而难于开发、测试的问题。所以,Mock既能出现在单元测试中,也会出现在集成测试、系统测试过程中。Mock 最大的功能是帮你把单元测试的耦合分解开,如果你的代码对另一个类或者接口有依赖,它能够帮你模拟这些依赖,并帮你验证所调用的依赖的行为。

比如一段代码有这样的依赖:

在这里插入图片描述

当我们需要测试A类的时候,如果没有 Mock,则我们需要把整个依赖树都构建出来,而使用 Mock 的话就可以将结构分解开,像下面这样:

在这里插入图片描述

02、Mock对象适用场景

需要将当前被测单元和其依赖模块独立开来,构造一个独立的测试环境,不关注被测单元的依赖对象,只关注被测单元的功能逻辑。
比如被测代码中需要依赖第三方接口返回值进行逻辑处理,可能因为网络或者其他环境因素,调用第三方经常会中断或者失败,无法对被测单元进行测试,这个时候就可以使用mock技术来将被测单元和依赖模块独立开来,使得测试可以进行下去。

被测单元依赖的模块尚未开发完成,而被测单元需要依赖模块的返回值进行后续处理。

① 前后端项目中,后端接口开发完成之前,接口联调;

② 依赖的上游项目的接口尚未开发完成,需要接口联调测试;

被测单元依赖的对象较难模拟或者构造比较复杂。
比如支付宝支付的异常条件有很多,但是模拟这种异常条件很复杂或者无法模拟,比如,查询聚划算的订单结果,无法在测试环境进行模拟。

03、Mock测试的优势

1、团队可以并行工作
有了Mock,前后端人员只需要定义好接口文档就可以开始并行工作,互不影响,只在最后的联调阶段往来密切;后端与后端之间如果有接口耦合,也同样能被Mock解决;测试过程中如果遇到依赖接口没有准备好,同样可以借助Mock;不会出现一个团队等待另一个团队的情况。这样的话,开发自测阶段就可以及早开展,从而发现缺陷的时机也提前了,有利于整个产品质量以及进度的保证

2、开启TDD模式,即测试驱动开发
单元测试是TDD实现的基石,而TDD经常会碰到协同模块尚未开发完成的情况,但是有了mock,这些一切都不是问题。当接口定义好后,测试人员就可以创建一个Mock,把接口添加到自动化测试环境,提前创建测试。
3、可以模拟那些无法访问的资源
比如说,你需要调用一个“墙”外的资源来方便自己调试,就可以自己Mock一个。

4、隔离系统
假如我们需要调用一个post请求,为了获得某个响应,来看当前系统是否能正确处理返回的“响应”,但是这个post请求会造成数据库中数据的污染,那么就可以充分利用Mock,构造一个虚拟的post请求,我们给他指定返回就好了。

5、可以用来演示
假如我们需要创建一个演示程序,并且做了简单的UI,那么在完全没有开发后端服务的情况下,也可以进行演示。说到演示了,假如你已经做好了一个系统,并且需要给客户进行演示,但是里面有些真实数据并不想让用户看到,那么同样,你可以用Mock接口把这些敏感信息接口全部替换。

6、测试覆盖度
假如有一个接口,有100个不同类型的返回,我们需要测试它在不同返回下,系统是否能够正常响应,但是有些返回在正常情况下基本不会发生,比如,我们需要测试在当接口发生500错误的时候,app是否崩溃,别告诉我你一定要给服务端代码做些手脚让他返回500 。而使用mock,这一切就都好办了,想要什么返回就模拟什么返回,不用再担心我的测试覆盖度了!

04、Mock测试存在的问题

使用Mock测试有时可以提高团队的开发效率,但当B、C都开发完成代码后,这时应该把E2E测试代码从使用Mock测试改为调用真实的模块,以避免出现模块之间集成部分漏测的问题。这里说mock存在的问题,主要是让开发和测试不要过分的依赖/相信mock接口。

使用mock时,切记的几点:

测试人员不应该被覆盖率高的E2E自动化测试所迷惑,覆盖率高不代表没有问题。尤其在接手新项目中,需要查看E2E测试中有没有使用Mock测试,进一步去判断这些地方使用Mock测试是否合理,这些Mock测试是否应该换成真实模块间的调用和集成。

当把mock接口换成实际接口后,测试/开发也必须把之前的测试重新做一遍。

ps:当你使用mock接口来提高效率,请注意:

你的工作量其实是比 直接只用实际接口 多了 一倍的。如果测试时偷懒,替换成实际接口后,只是简单测试,那么 当实际接口和mock预期接口有差异时,故障便和你相遇了。

建议: mock接口只能主流程联调/ 异常返回测试,不要过分依赖mock接口进行测试。

测试完毕,上线前请一定确保 为了mock而做的相关代码/配置文件的修改,已经完全恢复了。
建议:上线checklist中条条列出,并上线前review

Mock测试方式

01、Mock Server-Moco

这是一个jar包,只要执行该jar包,指定配置文件,就可开启一个http服务器提供服务,并且修改配置文件后也无需重启服务,支持动态加载。我使用的是moco-runner-0.10.2-standalone.jar,运行方式如下:

```java -jar moco-runner-0.10.2-standalone.jar start -p 8080 -c XXX.json```
XXX.json就是我们的mock配置文件,比如:

[    

   {       

      "description": "api 1",        

      "request" :

          {            

             "method" : "get",        

             "uri" : "/foo"        

           },        

      "response": 
{            

      "json": {"foo":"bar"}        

      }    

   }

]

以上就可以实现当我们访问127.0.0.0:8080/foo时,返回一个json为{“foo”:“bar”}。

02、fiddler

fiddler大家都很熟了,在windows环境可以随便自定义返回内容,但一个很大的缺点是,它不跨平台,而我们平时的很多场景下是需要在Linux下进行mock的。

还有一些其他mock工具,大多都是通过编写js代码或者python、java等代码来达到mock目的,此处就不再介绍了。

在选择mock工具时,可参考以下几个方面:

一是数据要好管理,别让我管理一堆文件;

二是mock接口最好可以设置成和真实接口完全一致,这样就只需要切换hosts就可以切换mock
接口和真实接口,不需要修改代码;

三是跨平台, moc k接口在windows和Linux下都需要可用。至于跨域、动态加载什么的,这是必
须条件。

Mock测试示例

使用Fiddler进行Mock测试,这种调试方式适用于rest接口调试,web界面调试等。

测试工程师在做测试时,也需要服务器返回- -些特殊的数据来做测试,使用Fiddler AutoResponder
功能来伪造测试数据(创建虚拟对象) , 能大大减少测试工程师的工作量。

1、Fiddler AutoResponder工作原理
使用Fiddler可以替换自动返回的一个【伪造】的HTTP响应,这与使用断点修改HTTP响应类似,只不过AutoResponder是自动的,操作更加方便。即浏览器发出的HTTP请求并没有到达服务器,而是被Fiddler直接返回了一个【伪造】的HTTP响应。

2、使用Fiddler进行Mock测试

接口抓包-----找到要mock的接口
以掘金首页为例,找到下面的接口 https://gold-tag-ms.juejin.im/v1/categories

复制接口数据到本地
在接口上进行右键点击,选择save -> …and Open as Local File -> 默认会保存至桌面,示例中的数据,保存到了桌面的test.json

修改数据
修改保存到本地的json文件,示例中仅修改了页面的标签数据。

替换json文件
在web session 面板中找到对应的请求,然后将其拖到AutoResponder面板中,在RuleEditor中单击“Find a file…”,选择本地json文件的路径。

激活规则
选中“Enable rules”,激活规则。选中“Unmatched requests passthrough",放行不匹配的HTTP请求。

save,刷新页面
单击“Save”按钮。只需修改本地保存的json文件,然后刷新浏览器(或直接访问接口),就可以看到效果了。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/438203.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

yolov8训练CDLA数据文版版面分析

一.数据集介绍 CDlA数据集介绍:CDLA CDLA是一个中文文档版面分析数据集,面向中文文献类(论文)场景。包含以下10个label: 数据量: 共包含5000张训练集和1000张验证集,分别在train和val目录下。每…

今天分享一个好看的输入法皮肤相信每个人心里住着一个少女心我们美化一下她吧

标题: 白日梦皮肤上线,百度输入法助你开启梦幻之旅! 正文: 大家好呀!今天我来给大家安利一款超级梦幻的百度输入法皮肤——“白日梦”系列! 这款皮肤的设计灵感来源于我们内心深处的白日梦,充…

技术实践|数据迁移中GBK转UTF8字符集问题分析

导语:在国产化创新的大背景下,数据库迁移项目逐渐增多,在数据库迁移过程中,源数据库和目标数据库字符集有时会不同,这时如何进行字符集转换则成为了一个重要的问题,同时在转换过程中还需要确保数据的完整性…

武汉灰京文化:游戏推广的领军者

在当今飞速发展的游戏行业中,游戏推广成为了每个游戏开发商和发行商必然要面对的挑战。如何能够将游戏信息传播给更广泛的受众群体,提升游戏的知名度和用户参与度,成为了每个游戏从业者需要思考的问题。而武汉灰京文化作为游戏推广领域的领军…

如何减少AI中的偏见问题:八种方法避免AI偏见渗入模型

克服与避免 AI 偏见的八大方法 AI 中的算法偏见是一个普遍存在的问题,它虽然不可能完全消除,但却可以通过科学的方法积极地防止这种偏见。我们将在本文中围绕如何应对AI中的偏见问题展开深入的讨论。 您可能会回想起新闻中报道的一些存在偏见的算法示例…

springboot248校园资产管理

校园资产管理 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本校园资产管理就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大…

试用Claude3

1 简介 好消息是,2024 年 3 月 4 日发布了 Claude3,据传比 GPT-4 更好,snooet 版本可以免费试用,坏消息是我们这儿不能用。 在官网注册时,需要选择国家并使用手机接收短信验证码。而在选项中没有中国这个选项。即使成…

【Maven】Maven 基础教程(五): jar 包冲突问题

《Maven 基础教程》系列,包含以下 5 篇文章: Maven 基础教程(一):基础介绍、开发环境配置Maven 基础教程(二):Maven 的使用Maven 基础教程(三):b…

贪心 Leetcode 763 划分字母区间

划分字母区间 Leetcode 763 学习记录自代码随想录 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。 返…

JAVA语言基础 JAVA入门

注释 单行注释:用双斜线 // 表示 多行注释:用 /*------------------*/ 表示 文档注释:用 /**-----------------*/ 表示 分隔符 常见的分隔符有:分号 ; 花括号 {} 方括号 [ ] 圆括号 () 空格 圆点 . 在 Java 语言中每一条…

LeetCode 刷题 [C++] 第300题.最长递增子序列

题目描述 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 题目…

快递包装展|2024上海国际电商物流包装产业展览会

2024中国(上海)国际电商物流包装产业展览会 2024 China (Shanghai) international e-commerce logistics packaging industry exhibition 时 间:2024年7月24日 —7月26日 地 点:国家会展中心(上海市青浦区崧泽大道333号&#xff…

react 分步表单中使用useEffect来更新表单值的问题

问题背景:我在完成一个分步表单的功能的时候,在进行点击下一步的时候,会通过useEffect 来监听下一步或者上一步的动作,进行表单赋值,我使用 useEffect(() > {setFieldsValue(formValues);}, [stepNum]) 直接赋值的…

2024-3-7 市场分歧视角

昨天安奈儿市场带领市场情绪一致,新型工业化方向独占鳌头,日内高潮节点尾盘老龙 克来机电涨停,昨晚很多老师在YY老龙是不是要二波了,呵呵。 今天市场分歧从竞价就开始了,隔夜单我记忆中 天奇股份88亿,上海…

MySQL--优化(索引--索引创建原则)

MySQL–优化(索引–索引创建原则) 定位慢查询SQL执行计划索引 存储引擎索引底层数据结构聚簇和非聚簇索引索引创建原则索引失效场景 SQL优化经验 一、索引创建原则 我们使用的索引种类: 主键索引唯一索引根据业务创建的索引(复…

线程安全——使用线程安全函数,多线程中执行fork引发的问题及如何解决

目录 一、引例 二、线程安全 三、多线程中执行fork 3.1 多线程中某个线程调用 fork()&#xff0c;子进程会有和父进程相同数量的线程吗? 3.2 父进程被加锁的互斥锁 fork 后在子进程中是否已经加锁 一、引例 在主线程和函数线程中进行语句分割并输出。 #include <stdi…

CRichEditUI中文乱码问题(Duilib)

这是遇到问题的时候&#xff0c;我还以为是韩文 解决方案&#xff1a; //HMODULE hmod LoadLibrary(_T("msftedit.dll"));HMODULE hmod LoadLibrary(_T("riched20.dll"));//修改一下使用的动态库&#xff0c;兼容性问题需要自己测

每日OJ题_链表②_力扣24. 两两交换链表中的节点

目录 力扣24. 两两交换链表中的节点 解析代码 力扣24. 两两交换链表中的节点 24. 两两交换链表中的节点 难度 中等 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&…

JavaWeb04-Request,Response

目录 一、Request&#xff08;请求&#xff09; 1.作用 2.继承体系 3.获取请求数据 &#xff08;1&#xff09;请求行 &#xff08;2&#xff09;请求头 &#xff08;3&#xff09;请求体&#xff08;POST&#xff09; &#xff08;5&#xff09;Request通用方式获取请求…

植物神经紊乱的五大信号,你知道吗?

植物神经紊乱&#xff0c;听起来像是医学名词&#xff0c;但其实它离我们的生活并不遥远。它就像一位隐形的朋友&#xff0c;时常悄悄地出现&#xff0c;给我们带来从头到脚的不适&#xff0c;让我们的生活变得困扰不已。今天&#xff0c;就让我们一起揭开这位“朋友”的真面目…