本程序是基于 django 开发的 mock server, 用于构造动态的复杂的 mock 响应.
在我另外的项目<BTest 接口测试平台>中使用开源工具 moco 作为 mock 服务. 然而, moco 对于实际应用中构造复杂动态的响应的需求, 似乎并没有很好的满足, 需要二次开发定制. 为了满足项目需要,就简单的开发了此程序.
虽然简单, 但也实用. 对照 moco 的用法, 本程序也使用 json 文件来管理 mock 数据, 并可以使用多层目录来管理文件. 支持 http/https.
项目地址: https://gitee.com/scu-zrb/djmockserver
下面提供两种方式:
docker build -t mockserver .
和 docker run -d --name=ms1 --restart=always -p 替换为要访问的端口:80 mockserver
如正常,应该是如下输出:
[root@zrb mockserver]# docker build -t mockserver .
Sending build context to Docker daemon 3.584kB
Step 1/8 : FROM scuzrb/py3_dev:v1.0
---> 0917af555736
......
Step 8/8 : CMD ["uwsgi", "--ini", "uwsgi.ini"]
---> Running in 9d15e79bbc3c
Removing intermediate container 9d15e79bbc3c
---> 4920fa944331
Successfully built 4920fa944331
Successfully tagged mockserver:latest
[root@zrb mockserver]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mockserver latest 4920fa944331 16 seconds ago 526MB
scuzrb/py3_dev v1.0 0917af555736 10 days ago 489MB
[root@zrb mockserver]# docker run -d --name=ms1 --restart=always -p 9000:80 mockserver
70054e2903fdad702407c2e16590b414b4cf6760729fcb281b12668a6aac8907
[root@rabbit-api-001 mockserver]#
[root@zrb mockserver]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
70054e2903fd mockserver "uwsgi --ini uwsgi.i…" 9 seconds ago Up 8 seconds 0.0.0.0:9000->80/tcp ms1
http://mock服务IP:访问端口/m6/
访问 mock, 正常会输出 text --> content
. 到此服务已正常可用。pip install -r requirements.txt
djmockserverproject/settings.py
文件 (文件路径必填) python manage.py runserver
# djmockserverproject/settings.py
# 必填 mock数据文件路径,可以是单个文件,或文件夹
MOCK_FILE_PATH = os.path.join(BASE_DIR, 'djmockserver', 'mockdata')
# MOCK_FILE_PATH = os.path.join(BASE_DIR, 'mock.json')
# mock数据文件刷新间隔, 单位:秒
REFRESH_INTERVAL = 2
# 选填 设置后,mock在匹配请求失败时,会把请求转发到此地址, 否则返回404
# REMOTE_HOST = 'http://127.0.0.1:8000'
# 选填 设置函数白名单列表
ADD_FUNC = ['len', 'str']
与 moco 格式一致, 以列表套字典的形式编写, 具体字段参考上面说明
[
{
"description": "",
"request": {},
"response": {}
},
{
"description": "",
"request": {},
"response": {}
}
]
可以多个文件保存多个 URI 响应列表 (此时应该配置 MOCK_FILE_PATH 为文件所在目录)
只要是符合python语法的字串表达式,且在白名单 (变量函数) 中,均可执行.
拓展函数 (djmockserver\mock\extend_func\extend_functions.py
): 自行拓展,定义函数,用于变量和响应中.
函数白名单 (ADD_FUNC
):为了安全考虑,限制 python 内置函数的使用.如要使用,需要添加函数到白名单中.
djmockserver\mockdata\
配合函数 collection_get 和变量 req, 可以提取请求数据, 处理后作为响应内容返回.
主要是开发同学会用得上. 考虑到在实际开发中, host 都是一处配置全局使用, 和 uri 分离. 而大多数的接口都有前置接口, 有上下文关系.
这时要使用 mock,要么把全局 host 配置为 mock 地址而前置接口也 mock 掉,要么在被 mock 接口代码增加局部 host(mock 地址).
很明显两种方式都不好.这种情况下转发请求就比前面的更合适.
只需配置全局 host 为 mock 地址,并在本程序 settings.py 文件中配置转发地址即可.只要是未 mock 的请求都会转发.
代码设计地不够优雅, 还有很多地方有待斟酌, 基本满足工作而已.