从接口自动化测试框架设计到开发(四)数据依赖相关

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

解析

从接口自动化测试框架设计到开发(四)数据依赖相关
从接口自动化测试框架设计到开发(四)数据依赖相关

相关推荐