Dipa 2020-03-06
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 cols3.根据规则提取响应数据
安装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
解析

