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构建一个时钟,而不是拿到一个现成的 ...
随机推荐
- Consul 注册中心介绍
在 Spring Cloud 体系中,几乎每个角色都会有两个以上的产品提供选择,比如在注册中心有:Eureka.Consul.zookeeper.etcd 等:网关的产品有 Zuul.Spring C ...
- 微信小程序DEMO——面包旅行的代码
API 集合在一起写了一个页面,并导出, const apiURL = 'http://xxx.xxxx.com'; const trip = { hot(data,callback){ wx.req ...
- windows下搭建nginx负载均衡
学习笔记,第一次记录避免忘记 首先介绍一下本地环境是windows2008 R2-64位. 1. 到nginx官网上下载最新稳定版的安装包,http://nginx.org/en/download. ...
- 【转载】C#编程中两个List集合使用Intersect方法求交集
在C#语言程序设计中,List集合是常用的集合数据类型,在涉及集合类型的运算中,有时候我们需要计算2个List集合中共有的数据,即对2个List集合求交集运算.此时可以使用C#语言提供的Interse ...
- vue实现一个评论列表
<!DOCTYPE html> <html> <head> <title>简易评论列表</title> <meta charset=& ...
- iOS中JSON解析三方库的比较
网络数据解析框架 1. JsonModel 一个 JSON 模型转换库,有着比较简洁的接口.Model 需要继承自 JSONModel. 2. yyModel yyModel比较轻量(算上.h 只 ...
- jenkins的理解及安装
目录 一.理论概述 二.安装 一.理论概述 Jenkins的介绍 Jenkins是一个基于MIT License协议的开源软件项目,是基于Java开发的一种持续集成(CI)工具,用于监控持续重复的 ...
- Android笔记(三十四) Android中线程之间的通信(六)Handle中的post()方法详解
我们之前都是使用sendMessage()方法来发送消息,使用handleMessage来处理消息的,今天我们来看另外一种方法,先看代码: package cn.lixyz.handlertest; ...
- OpenStack中虚拟机获取不到IP地址的解决方法
OpenStack源码交流群: 538850354 系统环境: centos6.5 + icehouse多节点部署 问题描述: 使用测试镜像cirros,虚拟机实例可以正常启动,但是不能从IP池中获取 ...
- ubuntu18 搭建ftp服务器,以及文件目录权限问题
有时候呢我们有一台本地的台式机或者云服务器,我们想要搭个ftp服务器好让我们在内网/外网中方便的传输.保存文件,这样别的任何电脑啊,设备啊,只要访问这个ftp的地址,就可以进行文件传输啦!由于我现在台 ...