首页 > 技术文章 > Mock测试技术

caoxiaowei 2020-06-02 22:51 原文

1.什么是mock?

在软件测试过程中,对于一些不容易构造、获取的对象,用一个虚拟的对象来替代它,以达到相同的效果,这个虚拟的对象就是Mock。

在前后端分离项目中,当后端工程师还没有完成接口开发的时候,前端开发工程师利用Mock技术,自己用mock技术先调用一个虚拟的接口,模拟接口返回的数据,来完成前端页面的开发。
其实,接口测试和前端开发有一个共同点,就是都需要用到后端工程师提供的接口。所以,当我们做接口测试的时候,如果后端某些接口还不成熟、所依赖的接口不稳定或者所依赖的接口为第三方接口、构造依赖的接口数据太复杂等问题时,我们可以用mock的方式先虚拟这些接口返回来代替。提高工作效率。

2. moco介绍

实现mock的技术很多,这些技术中,可以分为两类,mock数据和mock服务:
mock数据:即 mock 一个对象,写入一些预期的值,通过它进行自己想要的测试。常见的有:EasyMock、Mockito 、WireMock、JMockit。主要适用于单元测试。
mock 服务:即mock 一个 sever,构造一个依赖的服务并给予他预期的服务返回值,适用范围广,更加适合集成测试。如 moco框架。

Moco 是类似一个 Mock 的工具框架,一个简单搭建模拟服务器的程序库/工具,下载就是一个JAR包。有如下特点:
只需要简单的配置 request、response 等即可满足要求
支持 http、https、socket 协议,可以说是非常的灵活性
支持在 request 中设置 Headers , Cookies , StatusCode 等
对 GET、POST、PUT、DELETE 等请求方式都支持
无需环境配置,有 Java 环境即可
修改配置后,立刻生效。只需要维护接口,也就是契约即可
支持多种数据格式,如 JSON、Text、XML、File 等
可与其他工具集成,如 Junit、Maven等

3.下载moco

我们可以直接去github上获取moco的jar包,当前版本是:V1.1.0。
地址:https://github.com/dreamhead/moco 这里展示了关于moco的介绍和源码,我们可以点击箭头处直接下载它的jar包。

4. 配置json文件

我们需要先编辑一个json文件,用来模拟不同的请求,返回不同的响应。
新建一个文件,格式改为json,然后打开这个文件进行编辑,内容如下:
[{ "description":"demo", "request":{ "uri":"/demo1" }, "response":{ "text":"Hello,demo1" } }]
其中

description是注释(描述),由于json无法写注释,所以提供了用这个key
uri就是我们这个接口的统一资源标识符,可以根据模拟的接口自行定义
response里的内容即为返回的值
这是一个非常简单的mock

5. 启动moco

输入命令:java -jar moco-runner-1.1.0-standalone.jar http -p 9090-c test.json
其中
jar包的名称可根据自己下载的jar包版本来写
http代表这个模拟的是http请求
-p 9090 定义是端口号
-c test.json 是我们编辑的那个json文件名。

6. 配置不同的请求

demo1:约定URI
[{ "description":"demo1=约定URI", "request":{ "uri":"/demo1" }, "response":{ "text":"Hello,demo1" } }]
demo2:约定请求参数
[{ "description":"demo2=约定请求参数", "request":{ "queries":{ "key1":"abc", "key2":"123" } }, "response":{ "text":"Hello,demo2" } }]
demo3:约定请求方法
[{ "description":"demo3=约定请求方法", "request":{ "method":"DELETE" }, "response":{ "text":"Hello,demo3" } }]
demo4:约定请求头
[{ "description":"demo4=约定请求头", "request":{ "headers":{ "Content-Type":"application/xml" } }, "response":{ "text":"Hello,demo4" } }]
demo5:约定请求体参数-form
[{ "description":"demo5=约定请求体参数-form", "request":{ "forms":{ "key1":"abc" } }, "response":{ "text":"Hello,demo5" } }]
demo6:约定请求体参数-json
[{ "description":"demo6=约定请求体参数-json", "request":{ "headers":{ "Content-Type":"application/json" }, "json":{ "key1":"value1", "key2":"value2" } }, "response":{ "text":"Hello,demo6" } }]

7. 附:json脚本关键字

request
*method
*uri
*headers
*cookies
*queries
*forms、json、text
response
*status
*headers
*cookies
*text、json
*redirectTo

推荐阅读