目前在工做中写脚本的时候发现了一些以前开源的apiAutoTest的可优化项,后面应该也是会慢慢的继续优化了python
截止到写这篇文章的时间是,2020/11/19 00:53 如今也是把该项优化了,那优化了什么尼?git
我理解的参数依赖/接口依赖就是接口进行关联操做,好比有些查询接口须要登陆以后才能够操做,那么咱们就须要拿到token之类的东西,这一部分东西是放到header中的,apiAutoTest围绕的只有路径参数依赖,请求数据依赖github
路径参数依赖json
譬如说如今的restful,一个users接口,路由通常这样的users
他的请求方式是get,这个路由咱们把他认为是查全部用户,若是查某一个用户多是这样的users/:id
也是个get请求,这里这个id想表达的意思是这里有个须要个用户id的参数,好比1-500里面的任意1个,也就是说这个id是可变的,能够从登陆接口的返回响应取一个叫userId的值api
请求参数依赖restful
这个应该好理解些,就是说支付接口须要的订单id,是从上一步提交订单接口返回的响应订单idide
因为在改动时发现了以前的代码挺绕的,并且都没什么帮助因此就不说了,若是对以前的感兴趣能够看这里:https://testerhome.com/topics/25003 , 下面上新版用例截图jsonp
关于文件改动,新增了data_process.py
文件里面封装了请求保存实际结果响应,path参数处理,请求数据处理优化
#!/usr/bin/env/python3 # -*- coding:utf-8 -*- """ @project: apiAutoTest @author: zy7y @file: data_process.py @ide: PyCharm @time: 2020/11/18 """ import json import re from tools import * class DataProcess: response_dict = {} header = {} null_header = {} @classmethod def save_response(cls, key: str, value: object) -> None: """ 保存实际响应 :param key: 保存字典中的key,通常使用用例编号 :param value: 保存字典中的value,使用json响应 """ cls.response_dict[key] = value logger.info(f'添加key: {key}, 对应value: {value}') @classmethod def handle_path(cls, path_str: str = '') -> str: """路径参数处理 :param path_str: 带提取表达式的字符串 /&$.case_005.data.id&/state/&$.case_005.data.create_time& 上述内容表示,从响应字典中提取到case_005字典里data字典里id的值,假设是500,后面&$.case_005.data.create_time& 相似,最终提取结果 return /511/state/1605711095 """ # /&$.case.data.id&/state/&$.case_005.data.create_time& path_str.split('/') for i in re.findall('&(.*?)&', path_str): path_str = path_str.replace(f'&{i}&', str(extractor(cls.response_dict, i))) logger.info(f'提取出的路径地址: {path_str}') return path_str @classmethod def handle_header(cls, is_token: str, response: dict, reg) -> dict: """处理header""" if is_token == '写': cls.header['Authorization'] = extractor(response, reg) return cls.header elif is_token == '': return cls.null_header else: return cls.header @classmethod def handle_data(cls, variable: str) -> dict: """请求数据处理 :param variable: 请求数据,传入的是可转换字典/json的字符串,其中能够包含变量表达式 return 处理以后的json/dict类型的字典数据 """ if variable == '': return for i in re.findall('&(.*?)&', variable): variable = variable.replace(f'&{i}&', str(extractor(cls.response_dict, i))) if 'null' in variable: variable = variable.replace('null', 'None') if 'true' in variable: variable = variable.replace('true', 'True') if 'false' in variable: variable = variable.replace('false', 'False') logger.info(f'最终的请求数据以下: {variable}') return eval(variable)
相比以前这种写法应该更加清晰,而后以前的请求数据是采用字典合并的方式,在请求数据多层结构的时候会出现bug,如今改为了文本替换以后转json/dict的方法rest
举个例子
假设如今有个实际响应结果字典以下
{"case_002": { "data": { "id": 500, "username": "admin", "mobile": "12345678", }}, "case_005": { "data": { "id": 511, "create_time": 1605711095 }, } }
excel中接口路径内容:users/&$.case_005.data.id&/state/&$.case_005.data.careate_time&
代码内部解析后以下:users/511/state/1605711095
&$.case_005.data.id&
表明从响应字典中提取case_005字典中data字典中的id的值,提取出来的结果是511
excel中请求参数内容以下:
{ "pagenum": 1, "pagesize": "12", "data": &$.case_005.data&, "userId": &$.case_002.data.id& }
代码内部解析后以下:
{ "pagenum": 1, "pagesize": "12", "meta": { "id": 511, "create_time": 1605711095 }, "userId": 500 }
其实不难看出其中规则&jsonpath提取语法&
,若是你须要的内容是字符串类型,只须要这样"&jsonpath提取语法&"
github: https://github.com/zy7y/apiAutoTest.git
gitee: https://gitee.com/zy7y/apiAutoTest.git
谢谢各位的点评,在实际工做写到以后发现以前的写法的确不如意,但愿多写,而后进步~晚安