30行左右代码实现一个类似httprunner的接口框架
框架的最终归宿往往是领域语言+模板解析。
首先先约定一种所要执行操作的表述格式。然后通过模板解析将描述语言转化为代码进行执行。例如,我们可以使用以下yaml文件描述多个步骤并且需要关联的接口:
apis.yaml:
- name: 获取百度token接口 # 接口名称
request: # 请求报文
url: https://aip.baidubce.com/oauth/2.0/token
method: get
params:
grant_type: client_credentials
client_id: kPoFYw85FXsnojsy5bB9hu6x
client_secret: l7SuGBkDQHkjiTPU3m6NaNddD6SCvDMC
extract: # 提取变量, 字典格式
token: RESPONSE.json()['access_token'] # RESPONSE系统变量,代表响应对象
- name: 百度ORC接口 # 第二个接口
request:
url: https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=${token} # 使用变量
method: post
data: # 请求体(表单格式)
url: //upload-images.jianshu.io/upload_images/7575721-40c847532432e852.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240
verify: # 断言, 列表格式
- RESPONSE.json()['words_result_num'] == 6
其中,name为该接口或步骤的名称描述,request段是接口的信息,对应requests.request()的每一个参数,url和method是必要参数,params,headers,cookies,data, json,files,timeout 等,并使用对应格式。extract用于提取值, token: RESPONSE.json()['access_token'] ,表示提取该接口响应字典中的access_token字段的值保存为名为token的变量。
在第二个接口的url中通过使用${token},引用该变量。
verify段类似与extract, 计算表达式的值,通过结果的True/False判断该条断言是否通过。
上面我们定义了一套接口关联的描述及规则,下面我们要对我们的规则进行解析,并加载运行,主要分为以下几步:
- 读取yaml文件并使用
yaml.safe_load(f)转为列表/字典 - 遍历列表,每个列表项是一个接口
- 读取当前列表项(接口)的request段信息,处理${变量}
- 将request段(字典格式)重新转会yaml字符串
- 如果包含
$使用string.Template('字符串').safe_subtitute(locals()),从locals()当前所有局部变量中找到$表示的同名变量,如token,并替换。 - 重新将替换后变量的字符串转化为字典
- 字典拆包,发送request请求
- 如果请求中有extract字段,使用
eval()计算表达式的值并保存到局部变量locals()中。 - 如果请求中有verify字段,使用
eval()计算表达式的值,并判断真假。
实现代码:
需要安装pyyaml:
pip install pyyaml
apis_parser.py
import yaml
import requests
from string import Template
with open('apis.yaml', encoding='utf-8') as f:
apis = yaml.safe_load(f)
for api in apis:
print("处理请求:", api.get('name'))
request = api.get('request', {}) # 请求报文,默认值为{}
# 处理参数化请求中的${变量}
request_str = yaml.dump(request) # 先转为字符串
if '$' in request_str:
request_str = Template(request_str).safe_substitute(locals()) # 替换${变量}为局部变量中的同名变量
request = yaml.safe_load(request_str) # 重新转为字典
# 发送请求
res = requests.request(**request) # 字典解包,发送接口
# 提取变量
extract = api.get('extract')
if extract is not None: # 如果存在extract
for key, value in extract.items():
# 计算value表达式,可使用的全局变量为空,可使用的局部变量为RESPONSE(响应对象)
# 保存变量结果到局部变量中
print("提取变量:", key, value)
locals()[key] = eval(value, {}, {'RESPONSE': res})
# 处理断言
verify = api.get('verify')
if verify is not None:
for line in verify:
result = eval(line, {}, {'RESPONSE': res}) # 计算断言表达式,True代表成功,False代表失败
print("断言:", line, "结果:", "PASS" if result else "FAIL")
执行结果:
处理请求: 获取百度token接口
提取变量: token RESPONSE.json()['access_token']
处理请求: 百度ORC接口
断言: RESPONSE.json()['words_result_num'] == 6 结果: PASS
30行左右代码实现一个类似httprunner的接口框架的更多相关文章
- 30行JavaScript代码实现一个比特币量化策略
精简极致的均线策略 30行打造一个正向收益系统 原帖地址:https://www.fmz.com/bbs-topic-new/262 没错!你听的没错是30行代码!仅仅30行小编我习惯先通篇来看看 代 ...
- 不到30行JS代码实现的Excel表格
不到30行JS代码实现的Excel表格,jQuery并非不可替代 某国外程序员展示了一个由原生JS写成不依赖第三方库的,Excel表格应用,有以下特性: 由不足30行的原生JavaScript代码实现 ...
- 40多行python代码开发一个区块链。
40多行python代码开发一个区块链?可信吗?我们将通过Python 2动手开发实现一个迷你区块链来帮你真正理解区块链技术的核心原理.python开发区块链的源代码保存在Github. 尽管有人认为 ...
- 30行Python代码实现人脸检测
参考OpenCV自带的例子,30行Python代码实现人脸检测,不得不说,Python这个语言的优势太明显了,几乎把所有复杂的细节都屏蔽了,虽然效率较差,不过在调用OpenCV的模块时,因为模块都是C ...
- 8.如何自己设计一个类似 Dubbo 的 RPC 框架?
作者:中华石杉 面试题 如何自己设计一个类似 Dubbo 的 RPC 框架? 面试官心理分析 说实话,就这问题,其实就跟问你如何自己设计一个 MQ 一样的道理,就考两个: 你有没有对某个 rpc 框架 ...
- Gora是一个类似Hibernate的ORM框架
Gora是一个类似Hibernate的ORM框架,但是不只是支持关系数据库,更重要支持NoSQL之类大数据的存储. 支持NoSQL之类大数据的存储 Apache Gora是一个开源的ORM(Objec ...
- vnpy源码阅读学习(4):自己写一个类似vnpy的UI框架
自己写一个类似vnpy的界面框架 概述 通过之前3次对vnpy的界面代码的研究,我们去模仿做一个vn.py的大框架.巩固一下PyQt5的学习. 这部分的代码相对来说没有难度和深度,基本上就是把PyQt ...
- 50行ruby代码开发一个区块链
区块链是什么?作为一个Ruby开发者,理解区块链的最好办法,就是亲自动手实现一个.只需要50行Ruby代码你就能彻底理解区块链的核心原理! 区块链 = 区块组成的链表? blockchain.ruby ...
- 18 行 JS 代码编一个倒时器
有时候在生活中,你需要一个JavaScript倒计时时钟,而不是一个末日装置设备.不管你是否有一次约会,销售.促销.或者游戏,你可以受益于使用原生JavaScript构建一个时钟,而不是拿到一个现成的 ...
随机推荐
- 如何升级centos7 内核方法
关于内核说明: 版本性质:主分支ml(mainline),稳定版(stable),长期维护lt(longterm) 版本命名格式:“A.B.C" A代表内核版本号 B代表内核主版本号 C代表 ...
- SQL Server存储过程中变量使用函数调用变量
USE DB名称GO SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO . CREATE PROCEDURE 存储过程名 @formID n ...
- C#合并选中EXCEL中的各个工作表
合并选中EXCEL中的各个工作表,以第一个选中的EXCEL文件里的工作表进行匹配,遍历后面的每个EXCEL文件,有相同的工作表就合并: private void button1_Click(objec ...
- element-ui table 默认全选
来自: https://juejin.im/post/5cf24f1ee51d4577583ddc77 侵删 this.deviceTableData = res.body || []; // con ...
- English-培训3-Please call me Beth
- PLSQL登录的时候Warning提示:Using a filter for all users can lead to poor performance!
转自: https://blog.csdn.net/athena2015/article/details/81811908
- Jmeter学习笔记(五)——dubbo接口测试
一.什么是dubbo接口 Dubbo 接口是阿里巴巴开源的致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,dubbo框架告别了传统的web service的服务模式,进而改用 ...
- JS在浏览器中输出各种三角形
直角三角形 <script type="text/javascript"> for(var i=1;i<=8;i++){ for(var j=1;j<=i; ...
- 每日一题-——LeetCode(111)二叉树的最小深度
题目描述: 给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 思路一: 把每一层的结点加入到队列,每一层i+1,到下一层时,把上一层在队列中的结点都弹出,按从 ...
- ubuntu 修改环境变量(PATH)
1.什么是环境变量(PATH) 在Linux中,在执行命令时,系统会按照PATH的设置,去每个PATH定义的路径下搜索执行文件,先搜索到的文件先执行. 我们知道查阅文件属性的指令ls 完整文件名为:/ ...