检查json_key_value:

检查:

requests.py

# -*- coding: utf-8 -*-
#@File :demo_04.py
#@Auth : wwd
#@Time : 2020/12/10 9:09 下午
import json
import jsonpath
import requests
import re
from utils.config_utils import local_config
from utils.check_utils import CheckUtils

class RequestsUtils:
def __init__(self):
self.hosts = local_config.HOSTS
self.session = requests.session()
self.tmp_variables={}
def __get(self,requests_info):
url = self.hosts + requests_info['请求地址']
variable_list = re.findall('\\${\w+}',requests_info['请求参数(get)'])
for variable in variable_list:
requests_info['请求参数(get)'] = requests_info['请求参数(get)'].replace(variable,
'"%s"'%self.tmp_variables[variable[2:-1]])
response = self.session.get( url = url,
params = json.loads(requests_info['请求参数(get)']),
headers = requests_info['请求头部信息'])
response.encoding = response.apparent_encoding #保证不乱码
if requests_info['取值方式'] == 'jsonpath取值':
value = jsonpath.jsonpath(response.json(),requests_info['取值代码'])[0]
self.tmp_variables[requests_info['取值变量']] = value
elif requests_info['取值方式'] == '正则取值':
value = re.findall(requests_info['取值代码'],response.text)[0]
self.tmp_variables[requests_info['取值变量']] = value
result = CheckUtils(response).run_check(requests_info['断言类型'],requests_info['期望结果'])
return result

def __post(self,requests_info):
url = self.hosts + requests_info['请求地址']
get_variable_list = re.findall('\\${\w+}', requests_info['请求参数(get)'])
for variable in get_variable_list:
requests_info['请求参数(get)'] = requests_info['请求参数(get)'].replace(variable,
'"%s"'%self.tmp_variables[variable[2:-1]])
post_variable_list = re.findall('\\${\w+}', requests_info['请求参数(post)'])
for variable in post_variable_list:
requests_info['请求参数(post)'] = requests_info['请求参数(post)'].replace(variable,
'"%s"'%self.tmp_variables[variable[2:-1]])
response = self.session.post(url=url,
headers=requests_info['请求头部信息'],
params=json.loads(requests_info['请求参数(get)']),
json = json.loads(requests_info['请求参数(post)'])
)
response.encoding = response.apparent_encoding
if requests_info['取值方式'] == 'jsonpath取值':
value = jsonpath.jsonpath(response.json(),requests_info['取值代码'])[0]
self.tmp_variables[requests_info['取值变量']] = value
elif requests_info['取值方式'] == '正则取值':
value = re.findall(requests_info['取值代码'], response.text)[0]
self.tmp_variables[requests_info['取值变量']] = value
result = CheckUtils(response).run_check(requests_info['断言类型'], requests_info['期望结果'])
return result

def request(self,step_info):
request_type = step_info['请求方式']
if request_type == "get":
result = self.__get(step_info)
elif request_type == "post":
result = self.__post(step_info)
else:
result = {'code':2,'result':'请求方式不支持'}
print(self.tmp_variables)
return result

def request_by_step(self,test_steps):
for test_step in test_steps:
result = self.request(test_step)
print(result)
if result['code'] != 0:
break
#print(result)
return result

if __name__=='__main__':
# req_post_dict = {'测试用例编号': 'api_case_03', '测试用例名称': '删除标签接口测试', '用例执行': '是', '用例步骤': 'step_03', '接口名称': '删除标签接口', '请求方式': 'post', '请求头部信息': '', '请求地址': '/cgi-bin/tags/delete', '请求参数(get)': '{"access_token":"39_ZlzNDPma7qLWpLJ4K0ir_cSahJ_fg9aevBpGvqRp9VNjqRE6hSkBOSUFla-mFjSGKyF-YFx28sM4Ch1rJISPGVSTahZ8l_xQ9M7CnAFoqUfibusAdeOI4lHEIzB6zhXJQHN5b9as9zhcGtSbBYKeAGAEBN"}', '请求参数(post)': '{ "tag":{ "id" : 456 } }'}
# req_dict = {'测试用例编号': 'api_case_01', '测试用例名称': '获取access_token接口测试', '用例执行': '是', '用例步骤': 'step_01', '接口名称': '获取access_token接口', '请求方式': 'get', '请求头部信息': '', '请求地址': '/cgi-bin/token', '请求参数(get)': '{"grant_type":"client_credential","appid":"wx55614004f367f8ca","secret":"65515b46dd758dfdb09420bb7db2c67f"}', '请求参数(post)': ''}

# step_list = [{'测试用例编号': 'api_case_02', '测试用例名称': '创建标签接口测试', '用例执行': '是', '用例步骤': 'step_01', '接口名称': '获取access_token接口', '请求方式': 'get', '请求头部信息': '', '请求地址': '/cgi-bin/token', '请求参数(get)': '{"grant_type":"client_credential","appid":"wx55614004f367f8ca","secret":"65515b46dd758dfdb09420bb7db2c67f"}', '请求参数(post)': ''}, {'测试用例编号': 'api_case_02', '测试用例名称': '创建标签接口测试', '用例执行': '是', '用例步骤': 'step_02', '接口名称': '创建标签接口', '请求方式': 'post', '请求头部信息': '', '请求地址': '/cgi-bin/tags/create', '请求参数(get)': '{"access_token":"39_Bm5UI-zvWkokwnl6d3zCW30hk3sVHSv6sh6cHN3dbgnwUdfmhM-EFZ3OIrTechkzaRt9Iae3yX_MF7_h7bobNybvkoAC1CM2pAfGfNqSegXsPbjyJzkgSHtBV1OezPwEvFn60jS3__w5BdzVMRHcAHAYDT"}', '请求参数(post)': '{ "tag" : { "name" : "广东" } } '}]
# requestsUtils = RequestsUtils()
# requestsUtils.request_by_step( step_list )

#step_list = [{'测试用例编号': 'api_case_02', '测试用例名称': '创建标签接口测试', '用例执行': '是', '用例步骤': 'step_01', '接口名称': '获取access_token接口', '请求方式': 'get', '请求头部信息': '', '请求地址': '/cgi-bin/token', '请求参数(get)': '{"grant_type":"client_credential","appid":"wx55614004f367f8ca","secret":"65515b46dd758dfdb09420bb7db2c67f"}', '请求参数(post)': '', '取值方式': 'jsonpath取值', '取值代码': '$.access_token', '取值变量': 'token'}, {'测试用例编号': 'api_case_02', '测试用例名称': '创建标签接口测试', '用例执行': '是', '用例步骤': 'step_02', '接口名称': '创建标签接口', '请求方式': 'post', '请求头部信息': '', '请求地址': '/cgi-bin/tags/create', '请求参数(get)': '{"access_token":${token}}', '请求参数(post)': '{ "tag" : { "name" : "p3p4hehehe1" } } ', '取值方式': '无', '取值代码': '', '取值变量': ''}]
#step_list = [{'测试用例编号': 'api_case_03', '测试用例名称': '删除标签接口测试', '用例执行': '是', '用例步骤': 'step_01', '接口名称': '获取access_token接口', '请求方式': 'get', '请求头部信息': '', '请求地址': '/cgi-bin/token', '请求参数(get)': '{"grant_type":"client_credential","appid":"wx55614004f367f8ca","secret":"65515b46dd758dfdb09420bb7db2c67f"}', '请求参数(post)': '', '取值方式': 'jsonpath取值', '取值代码': '$.access_token', '取值变量': 'token'}, {'测试用例编号': 'api_case_03', '测试用例名称': '删除标签接口测试', '用例执行': '是', '用例步骤': 'step_02', '接口名称': '创建标签接口', '请求方式': 'post', '请求头部信息': '', '请求地址': '/cgi-bin/tags/create', '请求参数(get)': '{"access_token":${token}}', '请求参数(post)': '{ "tag" : { "name" : "p3p4pppp2" } } ', '取值方式': 'jsonpath取值', '取值代码': '$.tag.id', '取值变量': 'tag_id'}, {'测试用例编号': 'api_case_03', '测试用例名称': '删除标签接口测试', '用例执行': '是', '用例步骤': 'step_03', '接口名称': '删除标签接口', '请求方式': 'post', '请求头部信息': '', '请求地址': '/cgi-bin/tags/delete', '请求参数(get)': '{"access_token":${token}}', '请求参数(post)': '{"tag":{"id":${tag_id}}}', '取值方式': '无', '取值代码': '', '取值变量': ''}]
step_list = [{'测试用例编号': 'api_case_02', '测试用例名称': '创建标签接口测试', '用例执行': '是', '用例步骤': 'step_01', '接口名称': '获取access_token接口',
'请求方式': 'get', '请求头部信息': '', '请求地址': '/cgi-bin/token',
'请求参数(get)': '{"grant_type":"client_credential","appid":"wx55614004f367f8ca","secret":"65515b46dd758dfdb09420bb7db2c67f"}',
'请求参数(post)': '', '取值方式': '正则取值', '取值代码': '"access_token":"(.+?)"', '取值变量': 'token', '断言类型': 'json_key_value',
'期望结果': '{"expires_in":7200}'},
{'测试用例编号': 'api_case_02', '测试用例名称': '创建标签接口测试', '用例执行': '是', '用例步骤': 'step_02', '接口名称': '创建标签接口',
'请求方式': 'post', '请求头部信息': '', '请求地址': '/cgi-bin/tags/create', '请求参数(get)': '{"access_token":${token}}',
'请求参数(post)': '{ "tag" : { "name" : "P3P4ssss" } } ', '取值方式': '无', '取值代码': '', '取值变量': '',
'断言类型': 'json_key', '期望结果': 'tag'}]
requestsUtils = RequestsUtils()
r = requestsUtils.request_by_step(step_list)

# print( r['response_body'] )

check_utils.py
# -*- coding: utf-8 -*-
#@File :check_utils.py
#@Auth : wwd
#@Time : 2020/12/10 7:18 下午
import requests
import json
import requests
import json

class CheckUtils:
def __init__(self,response_data):
self.response_data = response_data
self.check_rules = { #判断规则和方法名去对应的一个过程
'无': self.none_check,
'json_key': self.key_check,
'json_key_value': self.key_value_check,
'正则比对': self.regexp_check
}
self.pass_result = {
'code':0, # 状态吗,0表示断言成功
'response_code':self.response_data.status_code,
'response_reason':self.response_data.reason,
'response_headers':self.response_data.headers,
'response_body':self.response_data.text,
'response_url':self.response_data.url,
'check_result': True
}
self.fail_result = {
'code':1,
'response_code':self.response_data.status_code,
'response_reason':self.response_data.reason,
'response_headers':self.response_data.headers,
'response_body':self.response_data.text,
'response_url':self.response_data.url,
'check_result': False
}

def none_check(self):
return self.pass_result

def key_check(self,check_data):
print('111')
key_list = check_data.split(',')
tmp_result = []
print(key_list)
print(self.response_data.json().keys())
for key in key_list:
if key in self.response_data.json().keys():
tmp_result.append( self.pass_result )
else:
tmp_result.append( self.fail_result )
if self.fail_result in tmp_result:
return self.fail_result
else:
return self.pass_result

def key_value_check(self,check_data):
key_value_dict = json.loads( check_data )
tmp_result = []
for key_value in key_value_dict.items():
if key_value in self.response_data.json().items():
tmp_result.append( self.pass_result )
else:
tmp_result.append( self.fail_result )
if self.fail_result in tmp_result:
return self.fail_result
else:
return self.pass_result

def regexp_check(self,check_data):
pass

def run_check(self,check_type,check_data):
if check_type=='无' or check_data == '':
return self.check_rules[check_type]()
else:
return self.check_rules[check_type](check_data)

if __name__=='__main__':
session = requests.session()
get_param_dict = {
"grant_type": "client_credential",
"appid": "wx55614004f367f8ca",
"secret": "65515b46dd758dfdb09420bb7db2c67f"
}
response = session.get(url='https://api.weixin.qq.com/cgi-bin/token',
params=get_param_dict)
response.encoding = response.apparent_encoding
checkUtils = CheckUtils(response)
# print( checkUtils.key_check('access_token,expires_in') )
# print( checkUtils.key_value_check('{"expires_in":7200}') )
print( checkUtils.run_check('json_key','access_token,expires_in') )
print( checkUtils.run_check('json_key_value','{"expires_in":7200}') )

github源码:https://github.com/w550856163/JKZDH_KJ.git tag:V1.2

断言封装整合到requests封装中应用(纠错False,Result循环,tag测试)的更多相关文章

  1. 在C#代码中应用Log4Net(五)将Log4Net正确地封装在自己的类库中并进行调用

    前面的几篇文章已经比较完整地解释了怎么使用Log4Net,但是我们可能需要将Log4Net的日志类封装在自己的类库中,以便C/S或B/S程序进行调用.下面的示例程序简单地分为两层,一个是应用程序层We ...

  2. 将PL/SQL代码封装在机灵的包中

    将代码封装在机灵的包中 http://www.oracle.com/technetwork/issue-archive/2013/13-jan/o13plsql-1872456.html 绝大多数基于 ...

  3. 将DLL文件直接封装进exe执行文件中(C#)

    前言:由于项目需要,需制作一个注册机,将个人PC的MAC值和硬盘序列号与软件进行绑定,由于笔者的C++不是很好,所以采用C#进行开发.但在采用C#的时候,获取硬盘的MAC值和序列号的时候又不是很准确, ...

  4. 一个用python简单的封装了aria2的jsonrpc中adduri的脚本

    aria2是一个十分牛逼的下载神器,有时候项目需要一个很牛逼的下载中间件的话,aria2是一个不错的选择.其中支持jsonrpc和websocket的特性尤其诱人.但是python用起来还是有点不爽, ...

  5. [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例)

    [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例) 踏雁寻花 发表于 2015-8-23 23:31:28 https://www.itsk.com/thread-35 ...

  6. SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装

    SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装 >>>>>>>& ...

  7. FFmpeg封装格式处理4-转封装例程

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10506662.html FFmpeg封装格式处理相关内容分为如下几篇文章: [1]. F ...

  8. 面向对象 - 1.封装之如何实现属性的隐藏/2.封装的意义/3.封装与扩展性/4.property的使用

    1.封装之如何实现属性的隐藏封装: __x=1 # 把数据属性隐藏 (如何实现隐藏) 类定义阶段 __开头发生了变形 __x --> _A__x特点: 1.在类外部无法直接:obj.__Attr ...

  9. 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 02 封装的代码实现

    088 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 02 封装的代码实现 本文知识点:Java封装的代码实现 说明:因为时间紧张,本人写博客过程中只 ...

随机推荐

  1. HashMap相关类:Hashtable、LinkHashMap、TreeMap

    前言 很高兴遇见你~ 在 深入剖析HashMap 文章中我从散列表的角度解析了HashMap,在 深入解析ConcurrentHashMap:感受并发编程智慧 解析了ConcurrentHashMap ...

  2. Java-web-多个独立项目之间相互调用实践

    本篇文章只涉及到应用层面,没有涉及到什么底层原理之类的,我目前的实力还没有达到那个级别.如果是大神级别的人看到这篇文章,请跳过. 项目框架也已经是搭建好了的,springboot版本为1.5,数据库操 ...

  3. Ionic学习记录

    1.跨域问题 浏览器中的运行 当你运行 ionic serve 时发生了什么呢? 启动了一个本地 web 服务器 你的浏览器打开并定位到本地服务器地址 这让你看着你的应用加载到你电脑上一个浏览器里,地 ...

  4. 安卓实用工具箱v4.3几百种小功能

    款多功能实用工具箱.提供了从日常.图片.查询.设备.辅助.提取.优惠券.趣味游戏等多方面的功能,操作简单,即点即用,避免您下载超多应用的难题,且应用体积轻巧,界面简洁.已去除广告! 下载地址:http ...

  5. 开源一套原创文本处理工具:Java+Bat脚本实现自动批量处理对账单工具

    原创/朱季谦 这款工具是笔者在2018年初开发完成的,时隔两载,偶然想起这款小工具,于是,决定将其开源,若有人需要做类似Java批处理实现整理文档的工具,可参考该工具逻辑思路来实现. 该工具是运行在w ...

  6. OpenSNS后台文件上传漏铜分析

    前言 这几天正在想找个文件上传漏洞分析一波,以加深对文件上传漏洞的理解,正好看到FreeBuf的一片文章记对OpenSNS的一次代码审计,由于其只对漏洞进行复现,故在此进行代码层面的分析. 漏洞分析 ...

  7. UWP 实现Tab导航首页

    先看效果: 这个是用Pivot来实现 1.自定义Pivot的样式,使用Blend工具生成模板,将HeaderTemplate的布局都隐藏 1 <Style x:Key="PivotSt ...

  8. .Net Core使用IdentityServer4

    官方文档https://identityserver4.readthedocs.io/en/latest/ 参考https://www.cnblogs.com/i3yuan/p/13843082.ht ...

  9. Presto安装完成之后需要做的

    Presto因其优秀的查询速度被我们所熟知,它本身基于MPP架构,可以快速的对Hive数据进行查询,同时支持扩展Connector,目前对Mysql.MongoDB.Cassandra.Hive等等一 ...

  10. APK 的前世今生:从 Android 源码到 apk 的编译打包流程

    最近想要研究热修复的原理,并自己实现一套简单的热修复框架(音视频的坑刚挖好就又挖另一个坑了2333),已经在看书入门 c++,方便后续查看业内一些知名热修复框架的源码,另外在涉及编译期/运行时修改代码 ...