自动化工具 开源 Mock 工具 [djmockserver]~~~欢迎使用 star

匿名 · 2020年04月15日 · 最后由 大瓶子 回复于 2022年03月03日 · 2894 次阅读

djmockserver

介绍

本程序是基于 django 开发的 mock server, 用于构造动态的复杂的 mock 响应.

在我另外的项目<BTest 接口测试平台>中使用开源工具 moco 作为 mock 服务. 然而, moco 对于实际应用中构造复杂动态的响应的需求, 似乎并没有很好的满足, 需要二次开发定制. 为了满足项目需要,就简单的开发了此程序.

虽然简单, 但也实用. 对照 moco 的用法, 本程序也使用 json 文件来管理 mock 数据, 并可以使用多层目录来管理文件. 支持 http/https.

项目地址: https://gitee.com/scu-zrb/djmockserver

特性说明

  1. json 格式保存 mock 数据 (与 moco 类似),支持单文件或多层目录多文件管理数据文件
  2. 根据请求内容匹配,同一 uri 可配置多种响应结果
  3. mock 数据修改实时更新无须重启服务 (增删 mock 文件需重启)
  4. 支持 python 字符串表达式 (有白名单设置) 执行,生成动态数据
  5. 支持自定义函数用于构造响应数据
  6. mock 接口 uri 与真实 uri 保持一致
  7. 支持非 mock 接口的请求转发

软件架构

djmockserver 架构图

安装教程

下面提供两种方式:

  • Dockerfile 构建
  • 开发环境安装

Dockerfile 构建部署

  1. 默认已有可用 docker 环境(自行解决)
  2. 单独下载项目中 Dockerfile 文件到本地 或 git clone 下载项目
  3. 切到 Dockerfile 所在目录执行命令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
  1. 如上输出, 可在浏览器上输出http://mock服务IP:访问端口/m6/ 访问 mock, 正常会输出 text --> content. 到此服务已正常可用。
  2. 如需要增加 mock 接口或拓展函数, 参考 Dockerfile 中说明。

开发环境部署

  1. git clone 下载项目
  2. 切换到项目根目录 pip install -r requirements.txt
  3. 配置 mock 数据文件,后缀为.json,可 N 个 mock 文件,支持多层目录管理
  4. 修改配置 djmockserverproject/settings.py 文件 (文件路径必填)
  5. 运行服务 python manage.py runserver
  6. 使用三方库拓展后可支持https
# 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']

使用说明

Mock 文件字段

1. request 支持的字段 (参考 RequestSerializer 类)
  • uri: str
  • method: str
  • queries: dict
  • form/json: dict
  • body: str 非 form 和 json 格式的内容,如文本、html、xml 等数据
  • cookies: dict
  • description: str 描述性文字
2. response 支持的字段 (参考 ResponseMaker 类)
  • status: int 响应码
  • headers: dict 头域
  • vars: dict 设置局部变量, 从上往下,优先级增加. 变量执行先于响应 (text/json)
  • text: str
  • json: dict 默认 content-type 为 application/json
  • text 与 json 互斥,同在时 json 优先

Mock 文件格式

与 moco 格式一致, 以列表套字典的形式编写, 具体字段参考上面说明

[
    {
        "description": "",
        "request": {},
        "response": {}
    },
    {
        "description": "",
        "request": {},
        "response": {}
    }
]

可以多个文件保存多个 URI 响应列表 (此时应该配置 MOCK_FILE_PATH 为文件所在目录)

构造动态响应

只要是符合python语法的字串表达式,且在白名单 (变量函数) 中,均可执行.

1. 变量
  • 只允许使用 response 中设置的局部变量和 settings 中设置的全局变量 (如有).
2. 响应
  • 拓展函数 (djmockserver\mock\extend_func\extend_functions.py): 自行拓展,定义函数,用于变量和响应中.

  • 函数白名单 (ADD_FUNC):为了安全考虑,限制 python 内置函数的使用.如要使用,需要添加函数到白名单中.

3. mock 配置样例
  • 路径: djmockserver\mockdata\

提取请求

配合函数 collection_get 和变量 req, 可以提取请求数据, 处理后作为响应内容返回.

请求转发

主要是开发同学会用得上. 考虑到在实际开发中, host 都是一处配置全局使用, 和 uri 分离. 而大多数的接口都有前置接口, 有上下文关系.

这时要使用 mock,要么把全局 host 配置为 mock 地址而前置接口也 mock 掉,要么在被 mock 接口代码增加局部 host(mock 地址).

很明显两种方式都不好.这种情况下转发请求就比前面的更合适.

只需配置全局 host 为 mock 地址,并在本程序 settings.py 文件中配置转发地址即可.只要是未 mock 的请求都会转发.
转发请求

TODO

  1. 增加 mock 数据管理页
  2. 更多协议的支持?

最后

代码设计地不够优雅, 还有很多地方有待斟酌, 基本满足工作而已.

共收到 10 条回复 时间 点赞

能动态 mock 么?

匿名 #2 · 2020年04月16日
cool 回复

可以支持,工具的核心目标就是构造动态 mock

感谢分享~~
插个眼,回头试试~

启动服务之后,怎么访问 mock 呢
比如 m1
http://127.0.0.1:8000/m1
这样是不行的

匿名 #5 · 2020年04月16日
花菜 回复

这个两个原因造成的,
1、django 对于结尾不带/的 uri 默认会自动添加/后再重定向, 可以由 APPEND_SLASH 参数决定的,默认是 True, 网上介绍有很多,参考文章;加上我习惯使用 django,都会给 uri 结尾加/,没能发现问题。
2、urls.py 文件中,添加了re_path('^.*$', mock)来匹配未 mock 的请求,这个匹配规则会把/m1给拦截了,也不会进行重定向,所以匹配错误,无法返回正确响应。

修正方法:
re_path('^.*$', mock)在 $ 前加上/ 即可,这样,你的请求就是重定向到http://127.0.0.1:8000/m1/,可以正确返回

搞定了~~
期望接下来可以把 json 文件保存到数据库
然后提供 web 界面进行增删改查的操作~~

匿名 #7 · 2020年04月16日
花菜 回复

BTest 接口平台项目中已经有现成的 mock 管理界面,应该会把这工具集成进去。不过这是相对独立的工具,也有考虑单独写个管理页面。只是近期没时间而已。

挺好用的,JAVA 功力不够,果断放弃 moco 了😎
要是能再给个 web 界面方便操作,就更好了。
还有,请教一下大佬,如果用来做性能档板,不知道能不能抗得住?

匿名 #9 · 2020年07月14日
xiuxiu-18 回复

web 界面暂时没时间去搞。
性能呢,简单测过,资源不成瓶颈的情况下,单个服务根据构造的接口复杂程度不同,有 3k-4k 的 TPS。
不够的话,可以 NGINX+DOCKER 多部署几个服务负载均衡。

666,膜拜楼主,学习 ing

需要 登录 後方可回應,如果你還沒有帳號按這裡 注册