最近在一个偶然的机会了解到了 Mock,看了看对我个人感觉使用场景不多。趁着有时间,在这里总结一下。此文适合有 HTTP 基础的人员观看。
那么,什么是 Mock 呢?将 Mock 单独翻译过来为:虚假、虚设。而在软件开发领域,我们也可以将其理解成虚假数据或者模拟数据。
在测试过程中,我们经常会碰到协同模块尚未开发完成的情况,像这种情况一般都需要等待协同模块开发完成才进入测试阶段。而如果使用了 Mock,当接口定义好后,测试人员可以创建一个 Mock,把接口添加到自动化测试环境,提前进行测试。
现在市面上有很多实现了 Mock 的框架,如:Mockito、EasyMock、Mockito、PowerMock、JMockit、Moco 等等。下面随机抽取 Moco 框架进行演示说明,想了解其它 Mock 框架的可以自行了解。
Moco 是 ThoughtWorks 的前工程师郑烨使用 Java 进行编写并且开源在了 GitHub,地址。
我们进入 Moco 的首页然后进行下载。下载的文件是一个 JAR 包,所以在使用 Moco 前还需要安装部署 JDK 环境。
下载好后我们来看看 Moco 的优点及缺点。
说完了优点及缺点,我们来根据 GitHub 的使用说明看看怎么用吧。
首先,我们先创建一个 JSON 文件,moco.json。内容如下:
[
{
"description": "这是一个GET请求",
"request": {
"uri": "/get"
},
"response": {
"text": "Hello Moco GET URI"
}
}
]
我们可以看到有几个关键字,其中 description 表示注释,request 中是请求的方式及请求的参数等,而 response 是返回的数据格式及数据。让我们来启动 Moco。命令如下:
java -jar moco-runner-1.1.0-standalone.jar http -p 8080 -c moco.json
想知道更多 moco 用法可以进链接了解
运行成功后我们使用 Postman 进行一个请求看看效果。
我们可以看到,用 Postman 请求成功了,也返回了 moco.json 文件中 response 中的内容。
除此之外,我们还可以设置请求方式。如:
[
{
"description": "无参GET请求",
"request": {
"uri": "/get",
"method": "get"
},
"response": {
"text": "无参GET请求返回"
}
},
{
"description": "带参GET请求",
"request": {
"uri": "/getparam",
"method": "get",
"queries": {
"code": "success",
"status": "200"
}
},
"response": {
"text": "带参GET请求返回"
}
}
]
这时候。如果我们使用 Post 方式请求就失败了。因为带参的请求中限制了请求方式及参数,只要不是符合下面 URL 的都会报错。
http://127.0.0.1:8080/getparam?code=success&status=200 请求方式必须为GET
除此之外,POST 请求也是可以进行 body 限制的,如限制 forms 的键值对:
[
{
"description": "带参数POST请求",
"request": {
"uri": "/postparam",
"method": "post",
"forms": {
"code": "success",
"status": "200"
}
},
"response": {
"text": "带参POST请求返回",
"headers": {
"Content-Type": "text/html;charset=utf-8"
}
}
}
]
除此之外,也可以设置 Headers 返回 JSON 。如:
[
{
"description": "带headers信息POST请求",
"request": {
"uri": "/post/headers",
"method": "post",
"headers": {
"content-type": "application/json"
},
"json": {
"name": "testing",
"sex": "23"
}
},
"response": {
"json": {
"code": "success",
"status": "200"
}
}
}
]
除此之外,也可以设置 cookies 等信息。如:
[
{
"description": "返回cookies信息的GET请求",
"request": {
"uri": "/getcookies",
"method": "get"
},
"response": {
"cookies": {
"key": "4d942801-ddcd-4d84-a6fb-9e0703409cd1"
},
"text": "get cookies success"
}
},
{
"description": "携带cookies信息的GET请求",
"request": {
"uri": "/get/with/cookies",
"method": "get",
"cookies": {
"key": "4d942801-ddcd-4d84-a6fb-9e0703409cd1"
}
},
"response": {
"text": "the cookies is okay"
}
},
{
"description": "携带cookies信息的POST请求",
"request": {
"uri": "/post/with/cookies",
"method": "post",
"cookies": {
"key": "4d942801-ddcd-4d84-a6fb-9e0703409cd1"
},
"json": {
"name": "testing",
"age": "24"
}
},
"response": {
"status": 200,
"json": {
"code": "success",
"status": "200"
}
}
}
]
除了请求之外,moco 还支持重定向。
[
{
"description": "绝对路径重定向",
"request": {
"uri": "/redirect"
},
"redirectTo": "/redirect""
},
{
"description": "相对重定向",
"request": {
"uri": "/redirect/top"
},
"redirectTo": "/redirect/max"
},
{
"description": "被重定向的请求",
"request": {
"uri": "/redirect/max"
},
"response": {
"text": "top == max"
}
}
]
支持 file 返回文件。
[
{
"request": {
"uri": "/file"
},
"response": {
"file": "data.json"
}
}
]
通过 Java 的 keytools 生成密钥
java -jar moco-runner-1.1.0-standalone.jar http -p 8088 -c moco.json --https tomcat.keystore --cert 123456 --keystore 123456
支持引入多个文件,类似于开发项目时的多个 config 文件,不过启动方式要由-c 改为-g
[
{
"context": "/",
"include": "./json/moco1.json"
},
{
"context": "/",
"include": "./json/moco2.json"
}
]
支持正则表达式
[
{
"request": {
"uri": {
"match": "/gettest/\\w"
}
},
"response": {
"text": "gettest"
}
}
]
支持 template 动态返回
[
{
"request": {
"uri": {
"match": "/gettest/\\w"
}
},
"response": {
"text": {
"template": "${req.method}"
}
}
}
]
除此之外,template 还支持:
"template": "${req.version}"
"template": "${req.method}"
"template": "${req.content}"
"template": "${req.headers['foo']}"
"template": "${req.queries['foo']}"
"template": "${req.forms['foo']}"
"template": "${req.cookies['foo']}"
支持延迟返回,如下 20 秒后返回。
[
{
"request": {
"uri": {
"match": "/gettest/\\w"
}
},
"response": {
"latency": {
"duration": 20,
"unit": "second"
},
"text": {
"template": "${req.method}"
}
}
}
]
moco 除了本身的功能,moco 也可以和 Junit 单元测试框架进行集成,具体的就不进行说明了,对 moco 有兴趣的可以到 GITHUB 官网进行文档查看。地址
mock 及工具 moco 就说到这。有兴趣的可以关注下本人的公众号:测试小哥进阶,TesterHome 会不定时的更新。哈哈~ 对了,最近想建个学习的测试群,有好的资源可以分享、有问题也可以在群里提问、也可以互相监督学习、或者组团参与线下沙龙,各地的小伙伴可以在群里捞人,欢迎软件测试的各位小伙伴的加入!公众号二维码和群二维码会放在评论区~