举一个例子来介绍:在当今,很多项目都是前后端分离的,前端和后端开发好接口后需要联调,前端工程师不可能等到后端工程师完全开发完成再开始联调,而是会利用一个mock技术来模拟后端返回的数据,来完成前端的开发。
Moco 是类似一个Mock的工具框架,一个简单搭建模拟服务器的程序库/工具,下载就是一个JAR包。有如下特点:
给一个github源码的地址:(PS: 这里需要手动打成jar包。)
https://github.com/dreamhead/moco
因为我们要把这些请求数据和响应数据都写在这个json文件里面,所以事先要先写好,才能启moco服务。
新建一个json文件,文件名随便写一个,内容如下:
[ { "description":"demo1:直接访问http://127.0.0.1:port端口号/demo1", "request":{ "method":"GET", "uri":"/demo1" }, "response":{ "text":"Hello,demo1" } }]
这里有一个大前提:需要安装好jdk环境,最好版本>=1.8
命令窗口cd到json文件(我这里的json文件就是test.json)、jar包所在的目录,执行:java -jar moco-runner-1.1.0-standalone.jar http -p 6666 -c test.json
有以下输出,表示服务启动成功:
C:\Users\Administrator\Downloads\mock>cd C:\Users\Administrator\Downloads\mock C:\Users\Administrator\Downloads\mock>java -jar moco-runner-1.1.0-standalone.jar http -p 5555 -c test.json 06 七月 2020 18:17:58 [main] INFO Server is started at 6666 06 七月 2020 18:18:00 [main] INFO Shutdown port is 11385
其中:
{ "description":"demo1:http://127.0.0.1:5555/demo1", "request":{ "method":"GET", "uri":"/demo1" }, "response":{ "text":"Hello,demo1" } }
{ "description":"demo2:http://127.0.0.1:5555/demo2?key1=abc&key2=123", "request":{ "queries":{ "username":"XXX", "password":"123456" }, "method":"GET", "uri":"/demo2" }, "response":{ "text":"Hello,demo2" } }
{ "description":"demo3:配置method", "request":{ "method":"DELETE" }, "response":{ "text":"Hello,demo3" } }
{ "description":"demo4:配置request_headers", "request":{ "headers":{ "Content-Type":"application/json" } }, "response":{ "text":"Hello,demo4" } }
{ "description":"demo5:配置请求体参数form", "request":{ "forms":{ "username":"XXX" } }, "response":{ "text":"Hello,demo5" } }
{ "description":"demo6:配置请求体参数json", "request":{ "json":{ "username":"XXXX", "password":"123456" } }, "response":{ "text":"Hello,demo6" } }
{ "description":"demo7:uri-startsWith匹配", "request":{ "uri":{ "startsWith":"/test" } }, "response":{ "text":"Hello,demo7" } }
{ "description":"demo8:uri-endsWith匹配", "request":{ "uri":{ "endsWith":"test" } }, "response":{ "text":"Hello,demo8" } }
{ "description":"demo9:uri-contain匹配", "request":{ "uri":{ "contain":"test" } }, "response":{ "text":"Hello,demo9" } }
{ "description":"demo10:status_code", "request":{ "uri":"/demo10" }, "response":{ "status":400 } }
{ "description":"demo11:response_headers", "request":{ "uri":"/demo11" }, "response":{ "headers":{ "Content-Type":"application/json" } } }
{ "description":"demo12:redirectTo", "request":{ "uri":"/demo12" }, "redirectTo":"https://www.baidu.com" }
{ "description":"demo13:返回json格式的数据", "request":{ "uri":"/demo13" }, "response":{ "json":{"username":"XXXX","password":"123456"} } }
参考接口文档,写一个登录接口:
{ "description":"登录接口", "request":{ "method":"POST", "uri":"/XXX/XXX/loginReq", "headers":{ "Content-Type":"application/x-www-form-urlencoded" }, "forms":{ "username":"XXXX", "password":"XXXXXXXXX" } }, "response":{ "headers":{ "Content-Type":"application/json" }, "status":200, "json":{ "retcode":0 } } }
Python代码如下:
import requests url = "http://127.0.0.1:5555/XXX/XXX/loginReq" data = {"username": "XXXX", "password": "XXXXXXXXX"} headers = {"Content-Type": "application/x-www-form-urlencoded"} res = requests.post(url=url, data=data, headers=headers) print(res.text)
运行结果:
{"retcode":0}
cmd里面打印的内容:
06 七月 2020 20:33:24 [pool-1-thread-241] INFO Request received: POST /XXX/XXX/loginReq HTTP/1.1 Accept: */* User-Agent: python-requests/2.22.0 Connection: keep-alive Host: 127.0.0.1:5555 Accept-Encoding: gzip, deflate Content-Length: 32 Content-Type: application/x-www-form-urlencoded username=XXXX&password=XXXXXXXXX 06 七月 2020 20:33:24 [pool-1-thread-241] INFO Response return: HTTP/1.1 200 Content-Length: 13 Content-Type: application/json {"retcode":0}
Moco还可以通过在json文件中添加cookies、header、重定向这些参数,来模拟各种情况下的请求和返回值,可以根据自己工作的需求去对这些东西进行了解。
Moco是热更新的,所以启动了jar包的服务之后,即使修改了json文件中的内容,也不需要重启服务就生效。
掌握了mock测试的技术,可以让我们在开发没有完成对应接口的时候,有接口文档就提前进入到测试状态,是现在敏捷模式下不可或缺的技术,也是持续集成中一个重要的组成部分。
好了,mock初识到此结束。
参考:https://www.cnblogs.com/tedliu/p/13255814.html