网站备案是自己可以做吗,软件开发工程师简历模板,关键词排名优化网站建设公司,运营是做什么的一、关于Mock测试
1、什么是Mock测试#xff1f;
Mock 测试就是在测试过程中#xff0c;对于某些不容易构造#xff08;如 HttpServletRequest 必须在Servlet 容器中才能构造出来#xff09;或者不容易获取的比较复杂的对象#xff08;如 JDBC 中的ResultSet 对象#…一、关于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”}。
具体其他使用方法请参照官方文档moco/apis.md at master · dreamhead/moco · GitHub
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请求。
6save刷新页面
单击“Save”按钮。只需修改本地保存的json文件然后刷新浏览器或直接访问接口就可以看到效果了。