百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

基于django开发的,易于构造复杂和动态响应的mock项目

bigegpt 2024-09-27 00:40 3 浏览

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

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

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

特性说明

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

软件架构

安装教程

下面提供两种方式:

  • 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 文件(文件路径必填)
#必填 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']
  1. 运行服务 python manage.py runserver
  2. 使用三方库拓展后可支持https

使用说明


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. 更多协议的支持?

最后

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

相关推荐

有些人能留在你的心里,但不能留在你生活里。

有时候,你必须要明白,有些人能留在你的心里,但不能留在你生活里。Sometimes,youhavetorealize,Somepeoplecanstayinyourheart,...

Python学不会来打我(34)python函数爬取百度图片_附源码

随着人工智能和大数据的发展,图像数据的获取变得越来越重要。作为Python初学者,掌握如何从网页中抓取图片并保存到本地是一项非常实用的技能。本文将手把手教你使用Python函数编写一个简单的百度图片...

软网推荐:图像变变变 一“软”见分晓

当我们仅需要改变一些图片的分辨率、裁减尺寸、添加水印、标注文本、更改图片颜色,或将一种图片转换为另一种格式时,总比较讨厌使用一些大型的图像处理软件,尤其是当尚未安装此类软件时,更是如此。实际上,只需一...

首款WP8.1图片搜索应用,搜照片得资料

首款WP8.1图片搜索应用,搜照片得资料出处:IT之家原创(天际)2014-11-1114:32:15评论WP之家报道,《反向图片搜索》(ReverseImageSearch)是Window...

分享一组美图(图片来自头条)(头条美女头像)

...

盗墓笔记电视剧精美海报 盗墓笔记电视剧全集高清种子下载

出身“老九门”世家的吴邪,因身为考古学家的父母在某次保护国家文物行动时被国外盗墓团伙杀害,吴家为保护吴邪安全将他送去德国读书,因而吴邪对“考古”事业有着与生俱来的兴趣。在一次护宝过程中他偶然获得一张...

微软调整Win11 24H2装机策略:6月起36款预装应用改为完整版

IT之家7月16日消息,微软公司今天(7月16日)发布公告,表示自今年6月更新开始,已默认更新Windows1124H2和WindowsServer2025系统中预装...

谷歌手把手教你成为谣言终结者 | 域外

刺猬公社出品,必属原创,严禁转载。合作事宜,请联系微信号:yunlugongby贾宸琰编译、整理11月23日,由谷歌新闻实验室(GoogleNewsLab)联合Bellingcat、DigD...

NAS 部署网盘资源搜索神器:全网资源一键搜,免费看剧听歌超爽!

还在为找不到想看的电影、电视剧、音乐而烦恼?还在各个网盘之间来回切换,浪费大量时间?今天就教你如何在NAS上部署aipan-netdisk-search,一款强大的网盘资源搜索神器,让你全网资源...

使用 Docker Compose 简化 INFINI Console 与 Easysearch 环境搭建

前言回顾在上一篇文章《搭建持久化的INFINIConsole与Easysearch容器环境》中,我们详细介绍了如何使用基础的dockerrun命令,手动启动和配置INFINICon...

为庆祝杜特尔特到访,这个国家宣布全国放假?

(观察者网讯)近日,一篇流传甚广的脸书推文称,为庆祝杜特尔特去年访问印度,印度宣布全国放假,并举办了街头集会以示欢迎。菲媒对此做出澄清,这则消息其实是“假新闻”。据《菲律宾世界日报》2日报道,该贴子...

一课译词:毛骨悚然(毛骨悚然的意思是?)

PhotobyMoosePhotosfromPexels“毛骨悚然”,汉语成语,意思是毛发竖起,脊梁骨发冷;形容恐惧惊骇的样子(withone'shairstandingonend...

Bing Overtakes Google in China&#39;s PC Search Market, Fueled by AI and Microsoft Ecosystem

ScreenshotofBingChinahomepageTMTPOST--Inastunningturnintheglobalsearchenginerace,Mic...

找图不求人!6个以图搜图的识图网站推荐

【本文由小黑盒作者@crystalz于03月08日发布,转载请标明出处!】前言以图搜图,专业说法叫“反向图片搜索引擎”,是专门用来搜索相似图片、原始图片或图片来源的方法。常用来寻找现有图片的原始发布出...

浏览器功能和“油管”有什么关联?为什么要下载

现在有没有一款插件可以实现全部的功能,同时占用又小呢,主题主要是网站的一个外观,而且插件则主要是实现wordpress网站的一些功能,它不仅仅可以定制网站的外观,还可以实现很多插件的功能,搭载chro...