网站首页 > 技术文章 正文
wiremock-py
wiremock-py 是基于WireMock实现的, 使用Python批量生成不同 测试场景 下不同HTTP API的 mock 数据, 然后作为mock server快速全面地对 API 进行测试。
背景
在数澜地产应用的前端测试中, 前端一般依赖于后端的数据, 前端通过后端在网关上发布的 HTTP API 获取数据. 要对前端进行充分的测试, 理想的做法是, 等待后端部署完成, 并且在数据层直接输入不同类型的数据源, 然后前端直接调用后端发布在网关上的 API 进行测试。
然而现实的情况是, 前端和后端的开发进度不完全一致, 如果前端先开发完成了, 必须要等后端对应的 API 开发完成后才能开始测试, 而且数据层的数据也不容易构造。
为了解决这个问题, 网关平台做了简单的 mock 功能, 每个 API 可以填写一个 mock数据, 然后前端调用 API 时直接使用这个 mock数据:
这种方式下, 网关充当了mock server:
但由于大家都使用同一个网关, 一个 API 只能保存一份 mock 数据, 所以有以下一些缺点:
- 不同的测试场景需要不同的 mock 数据来测试, 此时需要删掉上个测试场景的 mock 数据, 再创建新场景的 mock 数据才能进行测试
- 不能根据测试场景来按照一定的规则动态生成 API 对应的 mock 数据
- 不能多人同时使用测试同一个 API时, 只能都使用同一份 mock 数据, 不能各用各的
wiremock-py 可以解决上述这些问题: wiremock-py 通过传入不同的测试场景参数来生成不同的 mock 数据, 同时不同测试场景下使用的 mock 数据可以保存起来; 生成 mock 数据时, wiremock-py 支持使用Python和js代码来动态生成 mock 数据(也支持直接使用 json 数据, 如果 mock 数据中的数据量很大, 人工手写 mock 时的数据量会很大, 使用代码生成则比较容易); 不同的测试人员使用各自自己的 mock server, 不会影响到其他测试人员的测试。
测试人员需要做的是: 确定哪些 API 需要进行 mock 以及不同测试场景下对应的 mock 规则是什么。
依赖环境
Java 1.8.0_144
Node v8.6.0
Python 3.4.3
演示
快速开始
以贸数v1.1.0版本 测试环境为例演示使用 wiremock-py 对楼层客流分布和店铺客流分布两张图分布在3种场景下的测试方法
先确定本地浏览器能过正常访问 http://mall-data.com:9012
准备
克隆代码
git clone http://git.dtwave-inc.com:30000/baomi.wbm/wiremock-py.git
安装依赖
cd wiremock-py
pip install -r requirements.txt
npm install mockjs
生成目录
python mock.py -g "demo"
? wiremock-py git:(master)? python mock.py -g "demo"
DEBUG:root:mockdir=, scene=, target=, proxy_port=5506, generate=demo, wiremock=False, rewrite=False
DEBUG:root:正在生成目录 /Users/wangbaomi/autotest/wiremock-py/demo
DEBUG:root:创建目录成功: demo
DEBUG:root:创建目录成功: demo/js
DEBUG:root:创建目录成功: demo/json
DEBUG:root:创建目录成功: demo/python
DEBUG:root:创建目录成功: demo/wiremock
DEBUG:root:创建文件成功: demo/mappings.json
DEBUG:root:生成目录完成: /Users/wangbaomi/autotest/wiremock-py/demo
填写 mappings.json、json、python、js 数据
mappings.json 中填写内容:
[
{
"response": {
"default": {
"proxyBaseUrl": "target"
}
},
"mapping_name": "request url not start with /api",
"request": {
"method": "ANY",
"urlPattern": "/(?!api).*"
}
},
{
"mapping_name": "楼层客流分布",
"request": {
"urlPattern": "/api/v1/mall_data/customer_flow/every_floor\\?(.*)",
"method": "POST"
},
"response": {
"default": {
"proxyBaseUrl": "target"
},
"测试场景1": {
"bodyFileName": {
"json": "楼层客流分布.json"
}
},
"测试场景2": {
"bodyFileName": {
"python": "楼层客流分布.py",
"python_args": "测试场景2"
}
},
"测试场景3": {
"bodyFileName": {
"js": "楼层客流分布.js"
}
}
}
},
{
"mapping_name": "店铺客流分布",
"request": {
"urlPattern": "/api/v1/mall_data/customer_flow/every_shop\\?(.*)",
"method": "POST"
},
"response": {
"default": {
"proxyBaseUrl": "target"
},
"测试场景1": {
"bodyFileName": {
"js": "店铺客流分布.js"
}
},
"测试场景2": {
"bodyFileName": {
"json": "店铺客流分布.json"
}
},
"测试场景3": {
"bodyFileName": {
"python": "店铺客流分布.py",
"python_args": "测试场景3"
}
}
}
}
]
js 文件夹中新建店铺客流分布.js文件, 内容为:
var r = { "success": true, "code": null, "message": null, "content": { "meta": {}, "multi": { "group": [ { "id": "rank", "name": "排名", "value": [ 1, 2, 3, 4 ] } ], "result": [ { "id": "the_shop", "name": "店铺", "value": [ "店铺1", "店铺2", "店铺3", "第4个店铺" ] }, { "id": "customer_count", "name": "人数", "value": [ 10, 100, 1000, 3242 ] } ] }, "single": [] } }; console.log(JSON.stringify(r));
js 文件夹中新建楼层客流分布.js文件, 内容为:
var r = { "success": true, "code": null, "message": null, "content": {"meta": {}, "multi": { "group": [ { "id": "the_floor", "name": "楼层", "value": [ "-1楼", "1楼", "2楼", "3楼", ] } ], "result": [ { "id": "customer_count", "name": "人数", "value": [ 100, 1000, 5000, 567 ] } ] }, "single": [] } }; console.log(JSON.stringify(r)); json 文件夹中新建店铺客流分布.json, 内容为: { "success": true, "code": null, "message": null, "content": { "meta": {}, "multi": {
点击“了解更多”查看其他技术文章。
猜你喜欢
- 2024-10-06 想要mock你的网络请求?还不快来学习Charles
- 2024-10-06 测试工具链—— AnyProxy搭建HTTP(S)代理服务器构建Mock服务(一)
- 2024-10-06 当 Swagger 遇上 Torna,瞬间高大上了
- 2024-10-06 Mockjs POST和GET不同参数返回不同结果的实现方法
- 2024-10-06 mock介绍及moco框架搭建使用 mockoa
- 2024-10-06 对于依赖第三方的接口如何进行测试?
- 2024-10-06 本地部署easy-mock 本地部署sd的最低配置要求
- 2024-10-06 利用 apipost 生成mock数据 怎么生成api接口
- 2024-10-06 Mock工具之Moco使用教程 mock新手教程
- 2024-10-06 最全面!一文让你看懂无侵入的微服务探针原理
你 发表评论:
欢迎- 501℃几个Oracle空值处理函数 oracle处理null值的函数
- 495℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 494℃Oracle分析函数之Lag和Lead()使用
- 482℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 474℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 468℃【数据统计分析】详解Oracle分组函数之CUBE
- 453℃Oracle有哪些常见的函数? oracle中常用的函数
- 450℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 最近发表
-
- Directus 火了!无代码 SQL 数据的协作应用利器!
- PHP和NodeJS的代码执行效率比较(php和nodejs的区别)
- 工商银行获得发明专利授权:“基于数据库映射动态接口的前端页面应用开发方法及装置”
- FAISS和Chroma:两种流行的向量数据库的比较
- 什么是数据库的索引?(数据库索引的定义和作用)
- Vercel和Neon“首次”推出用于前端云的无服务器SQL数据库
- 记一次前端逻辑绕过登录到内网挖掘
- 学Access好还是MySQL好?(access与mysql的语句区别)
- 惬意!清晨慢品 HTML canvas 标签题,面试知识轻松 get
- 前端实现知识图谱-force(d3.js)(前端知识树)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)