接口测试之Mock测试方法

🍅 视频学习:文末有免费的配套视频可观看

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快

一、关于Mock测试

1、什么是Mock测试?

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

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

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

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

3、Mock对象适用场景

(1)需要将当前被测单元和其依赖模块独立开来,构造一个独立的测试环境,不关注被测单元的依赖对象,只关注被测单元的功能逻辑。

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

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

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

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

  —–比如service层的代码中,包含对Dao层的调用,但是,DAO层代码尚未实现

(3)被测单元依赖的对象较难模拟或者构造比较复杂。

  —–比如,支付宝支付的异常条件有很多,但是模拟这种异常条件很复杂或者无法模拟,比如,查询聚划算的订单结果,无法在测试环境进行模拟。

4、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,这一切就都好办了,想要什么返回就模拟什么返回,不用再担心我的测试覆盖度了!

5、Mock测试存在的问题

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

使用mock时,切记的几点:

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

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

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

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

3)测试完毕,上线前,请一定确保 为了mock而做的相关代码/配置文件的修改,已经完全恢复了。

建议:上线checklist中条条列出,并上线前review

二、Mock测试方式

1. 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”}。

具体其他使用方法请参照官方文档:https://github.com/dreamhead/moco/blob/master/moco-doc/apis.md

2. fiddler

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

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

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

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

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

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

三、Mock测试示例

1、使用Fiddler进行Mock测试

——这种调试方式适用于rest接口调试,web界面调试等。

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

1.1 Fiddler AutoResponder工作原理

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

1.2 使用Fiddler进行Mock测试

(1)接口抓包—–找到要mock的接口

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

(2)复制接口数据到本地

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

(3)修改数据

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

(4)替换json文件

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

(5)激活规则

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

(6)save,刷新页面

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

同时,在这我为大家准备了一份软件测试视频教程(含面试、接口、自动化、性能测试等),就在下方,需要的可以直接去观看,也可以直接【点击文末小卡片免费领取资料文档】

2024花15天学完自动化测试全套教程,简单易上手,允许白嫖,拿走不谢!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跟TED演讲学英文:How to govern AI — even if it‘s hard to predict by Helen Toner

How to govern AI — even if it’s hard to predict Link: https://www.ted.com/talks/helen_toner_how_to_govern_ai_even_if_it_s_hard_to_predict? Speaker: Helen Toner Date: April 2024 文章目录 How to govern AI — even if its hard to predictIntroductionVocabu…

美业SaaS系统多门店收银系统源码-【分润常见问题】讲解(一)

美业管理系统源码 博弈美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 ▶ 分润常见问题: 1、分润金额基数 所有分润计算的基数均为平台订单中各个商…

解决 java: 非法字符: ‘\ufeff‘

【报错解释】: 该错误通常发生在尝试编译Java源代码文件时,文件开头的字符是一个字节顺序标记(Byte Order Mark,BOM),即\ufeff。在Java中,\ufeff不是一个合法的字符,因此编译器会报…

不考408的985,不想考408的有福了!吉林大学计算机考研考情分析

吉林大学(Jilin University)简称吉大,位于吉林长春,始建于1946年,是中华人民共和国教育部直属的综合性全国重点大学,国家“双一流”、“211工程”、“985工程”、“2011计划”重点建设的著名学府&#xff0…

open-webui+ollama本地部署Llama3

前言 Meta Llama 3 是由 Meta 公司发布的下一代大型语言模型,拥有 80 亿和 700 亿参数两种版本,号称是最强大的开源语言模型。它在多个基准测试中超越了谷歌的 Gemma 7B 和 Mistral 7B Instruct 模型。 安装 1.gpt4all https://github.com/nomic-ai/…

[Unity常见小问题]打包ios后无法修改模型透明度

问题 在Editor下可以使用如下代码去修改模型的材质的透明度,但是打包ios后无法对透明度进行修改且没有任何warning和error using System.Collections; using System.Collections.Generic; using UnityEngine;public class NewBehaviourScript : MonoBehaviour {[R…

Word页脚设置“第X页共X页”的方法【域实现】

Word页脚设置“第X页共X页”的方法【域实现】 在设置Word页码格式的要求中,有时需要设置为“第X页共X页”这种格式,使用Word中的域功能可实现,同时,在某些情况下,可能还需要减去封面的页码,接下来为具体步…

i.MX 6ULL 裸机 IAR 环境安装

一. IAR 的安装请自行搜索 二. 使用最新版本的 IAR,需要修改 SDK 1. 在 SDK 的 core_ca7.h 加上 #include "intrinsics.h" /* IAR Intrinsics */ 2. debug 时需要修改每个工程下的 ddr_init.jlinkscript,参考链接 Solved: How to conn…

五月节放假作业讲解

目录 作业1: 问题: 结果如下 作业2: 结果: 作业1: 初始化数组 问题: 如果让数组初始化非0数会有问题 有同学就问了,我明明已经初始化定义过了,为啥还有0呀 其实这种初始化只会改变第一个…

蓝桥杯-网络安全比赛(7)基础知识 HTTP、TTL、IP数据包、MSS、MTU、ARP、LLMNR、MDNS、NBNS。

1. IP中TTL值能够给我提供什么信息?2. IP头部中标志、13位偏移、32位源IP地址、目标IP、IP数据包格式,有多少字节3. IP头部中的16位标识是什么?4. MSS 和MTU分别有多大?5. 怎么获取路由IP信息?PING、NSLOOKUP、TRACERT…

RAG进阶(二): RAG 融合(rag fusion)

在上一篇博客中,我们学习了多重查询(Multi Query)技术,Multi Query的基本思想是当用户输入查询语句(自然语言)时,我们让大模型(LLM)基于用户的问题再生成多个查询语句,这些生成的查询语句是对用户查询语句的补充,它们是…

Mybatis逆向工程笔记小结

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 1.前言 2.实现方案 2.1. mybatis-generator生成 2.1.1. 环境说明 2.1.2. 数…

【强训笔记】day7

NO.1 思路:双指针模拟,begin表示最长数字字符串最后一个字符,而len表示数字字符串的长度,i用来遍历,如果为数字,那么定义j变量继续遍历,直到不为数字,i-j如果大于len,就…

博客系统项目测试报告

文章目录 一.报告概要二.测试环境三.手工测试用例四.编写测试用例五.自动化测试Selenium测试项目主要特点 一.报告概要 项目概要 本项目是一个全功能的个人博客系统,旨在提供一个用户友好、功能全面的平台,允许用户注册、登录、浏览博客、查看详细内容、…

周刊是聪明人筛选优质知识的聪明手段!

这是一个信息过载的时代,也是一个信息匮乏的时代。 这种矛盾的现象在 Python 编程语言上的表现非常明显。 它是常年高居编程语言排行榜的最流行语言之一,在国外发展得如火如荼,开发者、项目、文章、播客、会议活动等相关信息如海如潮。 但…

#9松桑前端后花园周刊-React19beta、TS5.5beta、Node22.1.0、const滥用、jsDelivr、douyin-vue

行业动态 Mozilla 提供 Firefox 的 ARM64 Linux二进制文件 此前一直由发行版开发者或其他第三方提供,目前Mozilla提供了nightly版本,正式版仍需要全面测试后再推出。 发布 React 19 Beta 此测试版用于为 React 19 做准备的库。React团队概述React 19…

leetCode76. 最小覆盖子串

leetCode76. 最小覆盖子串 题目思路 代码 // 双指针 哈希表 // 这里cnt维护过程:先找到能够匹配T字符串的滑动窗口,然后这个cnt就固定了,因为i向前移动的同时,j也会维护着向前 // 就是当又出现能够满足T字符串的时候&#xff0…

Chrome浏览器安装React工具

一、如果网络能访问Google商店,直接安装官方插件即可 二、网络不能访问Google商店,使用安装包进行安装 1、下载react工具包 链接:https://pan.baidu.com/s/1qAeqxSafOiNV4CG3FVVtTQ 提取码:vgwj 2、chrome浏览器安装react工具…

基于ESP32和ESP8266的物联网开发过程(一)

给大家演示一个小工具,通过Wifi去连接ESP32或者ESP8266出来的一个热点。连接到这个热点之后,可以输密码,也可以不输密码。这里我设置的是不输密码直接进来,我这个是ESP8266。 进来之后直接点配置Wifi,然后可以看到ESP8…

【简单介绍下7-Zip】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…