从接口自动化测试框架设计到开发(四)数据依赖相关
1.数据依赖问题从设计思路开始
提交订单,拿到订单号,才能查看订单详情这种业务流程
2.方法封装:从case_id获取case的返回数据
#operation_excel.py #根据对应的case_id,找到对应行的内容 def get_rows_data(self,case_id): row_num = self.get_row_num(case_id)#根据caseid拿到行号 rows_data = self.get_row_values(row_num)#根据行号拿到行的数据 return rows_data #根据对应的caseid找到对应的行号 def get_row_num(self,case_id): num = 0 #行号初始为0 clols_data = self.get_cols_data() for col_data in clols_data: if case_id in col_data: return num #如果依赖id和caseid相等,返回行号 num = num+1 #根据行号找到该行的内容 def get_row_values(self,row): tables = self.data row_data = tables.row_values(row) return row_data #获取某一列的内容 def get_cols_data(self,col_id=None): if col_id != None: cols = self.data.col_values(col_id) else: cols = self.data.col_values(0) return cols
3.根据规则提取响应数据
安装jsonpath_rw包
python -m pip install jsonpath_rw
#get_data.py #获取依赖数据的key def get_depend_key(self,row): col = int(self.dataconfig.get_data_depend()) depend_key = self.opera_excel.get_cell_value(row,col) if depend_key == ‘‘: return None else: return depend_key
#depend_data.py # -*- coding: utf-8 -*- # @Author: jiujiu # @Date: 2020-03-06 13:59:03 # @Last Modified time: 2020-03-06 13:59:03 from util.operation_excel import OperationExcel from base.run_method import RunMethod from data.get_data import GetData from jsonpath_rw import jsonpath,parse class DependentData(object): def __init__(self,case_id): self.case_id = case_id self.opera_excel = OperationExcel() self.data = GetData() self.runmethod = RunMethod() """根据caseid获取该case的整行数据""" def get_case_line_data(self,case_id): rows_data = self.opera_excel.get_rows_data(case_id) return rows_data #执行依赖测试,获取结果 def run_dependent(self): run_num = self.opera_excel.get_row_num(self.case_id)#拿到caseid的行号 request_data = self.data.get_data_for_json(run_num)#拿到请求数据 header = self.data.is_header(run_num) method = self.data.get_request_method(run_num) url = self.data.get_request_url(run_num) res = run_method.run_main(method,url,request_data,header) return json.loads(res) #拿到执行结果后,根据依赖数据规则提取这个数据 def get_data_for_key(self,row): depend_data = self.data.get_depend_key(row)#拿到依赖数据 response_data = self.run_dependent()#拿到返回数据 json_exe = parse(depend_data)#按照dependdata的规则在结果集里面查找 madle = json_exe.find(response_data) return [math.value for math in madle][0]
4.结构构建
#run_test.py def go_on_run(self): res = None #如果有10行,循环遍历每一行,从0行开始 rows_count = self.data.get_case_lines() #排除0行,从第1行开始 for i in range(1,rows_count): is_run = self.data.get_is_run(i) if is_run: url = self.data.get_request_url(i) method = self.data.get_request_method(i) data = self.data.get_data_for_json(i)#传入行数 # request_data = self.data.get_data_for_json(i) header = self.data.is_header(i) # print(i) depend_case = self.data.is_depend(i) # return res if depend_case != None: self.depend_data = DependentData(depend_case) #获取依赖的响应数据 depend_response_data = self.depend_data.get_data_for_key(i) #获取依赖的key depend_key = self.data.get_depend_field(i) request_data[depend_key] = depend_response_data #更新值 res = self.runmethod.run_main(method,url,data,header) self.data.write_result(i,res)
#get_data.py #获取依赖数据的key def get_depend_key(self,row): col = int(self.dataconfig.get_data_depend()) depend_key = self.opera_excel.get_cell_value(row,col) if depend_key == "": return None else: return depend_key #判断case是否有依赖 def is_depend(self,row): col = int(self.dataconfig.get_field_depend()) depend_case_id = self.opera_excel.get_cell_value(row,col) if depend_case_id == "": return None else: return depend_case_id #获取数据依赖字段 def get_depend_filed(self,row): col = int(self.dataconfig.get_field_depend()) data = self.opera_excel.get_cell_value(row,col) if data == "": return None else: return data
扩展jsonpath
数据验证,这里的数据验证指的是对响应结果进行数据的校验,接口自动化测试中,对于简单的响应结果(json),可以直接和期望结果进行比对,判断是否完全相等即可。如 json {"status":1,"msg":"登录成功"}
对于格式较复杂,尤其部分数据存在不确定性、会根据实际情况变化的响应结果,简单的判断是否完全相等(断言)通常会失败。
上面的json结构嵌套了很多信息,完整的匹配几乎不可能成功。比如其中的createTime信息,根据执行接口测试用例的时间每次都不一样。同时这个时间是响应结果中较为次要的信息,在进行接口自动化测试时,是可以选择被忽略的。我们需要某种简单的方法,能够从json中提取出我们真正关注的信息(通常也被称为关键信息)。
如提取出status的值为1,data数组中每个对象的investId都为1,data中第三个对象的unfinishedPrincipal值为100.00,只要这三个关键信息校验通过,我们就认为响应结果没有问题。
3、解决方案
JsonPath可以完美解决上面的痛点。通过JsonPath可以从多层嵌套的Json中解析出所需要的值。
JsonPath
JsonPath参照XPath解析xml的方式来解析Json
JsonPath用符号$表示最外层对象,类似于Xpath中的根元素
JsonPath可以通过点语法来检索数据,如:
shell $.store.book[0].title
也可以使用中括号[]的形式,如shell $[‘store‘][‘book‘][0][‘title‘]
运算符(Operators)
JsonPath案例
json
JsonPath例子及说明
一、使用jsonpath
安装jsonpath模块
pip install jsonpath==0.75
解析
二、使用与安装
使用jsonpath_rw
安装jsonpath_rw模块
pip install jsonpath-rw
解析