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

Posted dydxw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从接口自动化测试框架设计到开发数据依赖相关相关的知识,希望对你有一定的参考价值。

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

解析

 

技术图片
技术图片

 

以上是关于从接口自动化测试框架设计到开发数据依赖相关的主要内容,如果未能解决你的问题,请参考以下文章

从接口自动化测试框架设计到开发--持续集成jenkins

从接口自动化测试框架设计到开发--case运行结果统计发送邮件

Python接口自动化测试框架实战 从设计到开发

Python接口自动化测试框架实战 从设计到开发

API接口自动化测试框架搭建-封装conf配置文件读写数据方法operate_conf.py

从0开始学习接口自动化测试(三)