zoukankan      html  css  js  c++  java
  • 从接口自动化测试框架设计到开发(四)数据依赖相关

    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

    解析

  • 相关阅读:
    EasyUI中页面必须刷新才显示tree组件最新数据的BUG解决方案
    tp2.2.2新特点
    easyui添加自定义验证规则
    TP第一天路由解析
    负载均衡和冗余技术
    smarty缓存控制
    smarty中section遍历数组
    鬼谷子绝学
    Python的Django框架中的URL配置与松耦合
    Python的Django框架中的URL配置与松耦合
  • 原文地址:https://www.cnblogs.com/dydxw/p/12427460.html
Copyright © 2011-2022 走看看