一、Moco简介
什么是Moco
Moco是一个简单搭建模拟服务器的程序库/工具,是一个简单搭建的stub框架,主要用于测试和集成。Moco主要用于模拟HTTP、HTTPS和Socket协议的接口。
Moco的原理
- Moco会根据配置启动一个真正的HTTP服务,监听本地的指定端口。当客户端发起的请求满足某个条件时,服务端会回复一个对应的应答。Moco的底层是基于一个叫Netty网络应用框架,而不是依赖于像Servlet这样的重型框架,所以就绕过了复杂的应用服务器。
- Moco支持API和独立运行两种方式,测试和开发人员在JUnit、JBehave等测试框架中通常使用API的方式,一般情况则使用json脚本的方式。
二、测试中的应用场景
前端测试中的应用:我们在测试前端时,对于某些不易触发的异常场景,可以使用Mock虚拟技术模拟出相应的场景;
接口测试中的应用:我们在做接口测试时,会遇到被测接口需要调用第三方接口的情况,对于需要第三方接口返回特定数据的场景,需要跟第三方厂商沟通和联调测试,这样测试时间会被拉长,效率低。这个时候我们就可以使用Mock虚拟技术模拟第三方接口,设置特定的返回数据;
接口自动化测试中的应用:在自动化测试中,有的接口会调用第三方接口,如果第三方接口不稳定,就会导致测试用例的执行失败,为了增强自动化测试的稳定性,我们可以使用Mock虚拟技术模拟第三方接口。
三、安装及配置
Moco文档:https://github.com/dreamhead/moco/blob/master/moco-doc/apis.md
启动命令
(注:需要java运行环境)
java -jar ./moco-runner-0.11.0-standalone.jar http -p 8888 -c startup.json
-p #访问接口的端口号
-c #存放接口信息的json文件
启动成功示例
D:\AutoTest>java -jar ./moco-runner-0.11.0-standalone.jar http -p 8888 -c startup.json
28 六月 2023 23:48:21 [main] INFO Server is started at 8888
28 六月 2023 23:48:21 [main] INFO Shutdown port is 65479
四、示例Demo
GET请求
GET请求-不带参数
(注:响应体中中文乱码,可以在响应头中设置Content-Type)
[
{
"description": "get请求-不带参数",
"request": {
"uri": "/get/demo",
"method": "get"
},
"response": {
"headers": {
"Content-Type": "text/html;charset=gbk"
},
"text": "get请求-不带参数"
}
}
]
GET请求-带参数
[
{
"description": "get请求-带参数",
"request": {
"uri": "/get/with/params",
"method": "get",
"queries": {
"name": "tom",
"age": "10"
}
},
"response": {
"text": "tom and jerry"
}
}
]
POST请求
POST请求-form表单
[
{
"description": "带参数的form表单类post请求",
"request": {
"uri": "/post/form/demo",
"method": "post",
"forms": {
"name": "tom",
"age": "10"
}
},
"response": {
"json": {
"msg": "success",
"code": "200"
}
}
}
]
POST请求-json
[
{
"description": "post请求",
"request": {
"uri": "/post/param/demo",
"method": "post",
"json": {
"name": "tom",
"age": "10"
}
},
"response": {
"headers": {
"Content-Type": "text/html;charset=gbk"
},
"json": {
"msg": "success",
"code": "200"
}
}
}
]
POST请求-带headers
[
{
"description": "post请求-带headers",
"request": {
"uri": "/post/headers/demo",
"method": "post",
"headers": {
"Content-Type": "application/json",
"token": "slkdfjlsjfdsl"
},
"json": {
"name": "tom",
"age": "10"
}
},
"response": {
"json": {
"msg": "success",
"code": "200"
}
}
}
]
PUT请求
[
{
"description": "put请求",
"request": {
"uri": "/put/demo",
"method": "put",
"forms": {
"id": "123",
"age": "10"
}
},
"response": {
"json": {
"msg": "success",
"code": "200"
}
}
}
]
DELETE请求
[
{
"description": "delete请求",
"request": {
"uri": "/delete/demo/123",
"method": "delete"
},
"response": {
"json": {
"msg": "success",
"code": "200"
}
}
}
]
请求头带Cookie
GET请求-请求头带Cookie
[
{
"description": "带cookie的请求",
"request": {
"uri": "/get/with/cookies",
"method": "get",
"cookies": {
"login": "true"
}
},
"response": {
"text": "请求头中含cookie",
"headers": {
"Content-Type": "text/html;charset=gbk"
}
}
}
]
POST请求-请求头带Cookie
[
{
"description": "post请求-请求头带cookie",
"request": {
"uri": "/post/with/cookie",
"method": "post",
"cookies": {
"login": "true"
},
"json": {
"name": "tom",
"age": "10"
}
},
"response": {
"status": 200,
"json": {
"code": "1000",
"msg": "success!"
}
}
}
]
重定向
[
{
"description": "重定向",
"request": {
"uri": "/redirect/demo"
},
"redirectTo": "/get/demo"
}
]