在测试过程中经常会涉及到接口关联的,比如需要上一个接口返回的参数作为下一个接口的入参,这里就涉及到热加载,即让yaml文件可以调用外部函数。

一、提取上一个接口返回的参数保存到extract.yaml文件中

这里支持两种提取方式:正则表达式和jsonpath表达式提取

                # 提取值并写入extract.yaml文件                if "extract" in caseinfo.keys():                    for key, value in caseinfo["extract"].items():                        if "(.*?)" in value or "(.+?)" in value:        # 正则表达式                            zz_value = re.search(value, return_text)                            if zz_value:                                extract_value = {key: zz_value.group(1)}                                write_yaml(os.path.dirname(os.getcwd()) + '/run/extract.yaml', extract_value)                        else:   # jsonpath                            js_value = jsonpath.jsonpath(return_json, value)                            if js_value:                                extract_value = {key: js_value[0]}                                write_yaml(os.path.dirname(os.getcwd()) + '/run/extract.yaml', extract_value)

以jsonpath为例,接口响应是json串,提取jwt的值保存为token。

​​​​​​

-  name: $ddt{name}  parameterize:    name-userName-password-assert_str: /testdatas/get_user_data.yaml  request:    url: *******    method: POST    data:      userName: $ddt{userName}      password: $ddt{password}  extract:    token: $.jwt  validate:    - equals: {status_code: 200}    - contains: $ddt{assert_str}

注意,这边是dict,不是list,token前面是没有-的。

二、在yaml用例中调用token

首先,创建hotloads文件夹,在文件夹下创建test.py文件,定义从extract.yaml文件中取值的方法。

#!/usr/bin/python3# -*- coding:utf-8 -*-# @Time : 2023/7/1 21:21# @Author : 凌雪# @File : test.py# @Software: PyCharm# 功能说明:热加载方法,在yaml用例中调用
from common.yaml_util import *
class Test:
    def read_extract_data(self,key):        """        从extract.yaml文件中读取动态参数值        :param key: 动态参数名称        :return: 动态参数值        """        return read_yaml(key)

然后,定义替换值的方法 ​​​​​​​

    def replace_value(self, data):        """        替换值的方法        :param data:        :return:        """        if data:            data_type = type(data)      # 保存数据类型            # 判断数据类型转换成str            if isinstance(data, dict) or isinstance(data, list):                str_data = json.dumps(data)                print("str_data:" + str_data)            else:                str_data = str(data)            for cs in range(1, str_data.count('${') + 1):                # 替换                if "${" in str_data and "}" in str_data:                    start_index = str_data.index("${")                    end_index = str_data.index("}", start_index)                    old_value = str_data[start_index:end_index + 1]                    # print("old_value:" + old_value)                    # 反射:通过类的对象和方法字符串调用方法                    func_name = old_value[2:old_value.index('(')]                    # print("func_name:" + func_name)                    args_value1 = old_value[old_value.index("(") + 1:old_value.index(")")]                    new_value = ""                    # new_value = read_yaml(old_value[2:-1])                    # str_data = str_data.replace(old_value, new_value)                    if args_value1 !="":                        args_value2 = args_value1.split(',')                        new_value = getattr(self.obj, func_name)(*args_value2)                    else:                        new_value = getattr(self.obj, func_name)()                    str_data = str_data.replace(old_value, str(new_value))            # 还原数据类型            if isinstance(data, dict) or isinstance(data, list):                data = json.loads(str_data)            else:                data = data_type(str_data)        return data

在测试用例中调用要加载的方法类 ​​​​​​

#!/usr/bin/python3# -*- coding:utf-8 -*-# @Time : 2023/7/1 16:43# @Author : 凌雪# @File : test_swiper.py# @Software: PyCharm# 功能说明:******管理测试
import pytestfrom common.send_request import Send_Requestfrom common.parameterize_util import ddt, read_testcaseimport allurefrom hotloads.test import Test
@allure.feature("****测试")class TestHomepage:
    @allure.story("*****的接口")    @pytest.mark.parametrize('testdata', read_testcase('swiper\\swiper.yaml'))    def test_getheadinfo(self, testdata):        res = Send_Request("trainurl", Test()).standard_yaml(testdata)

这边需要用到的是Test类中从extract.yaml文件中读取动态参数的方法,所以这里传的obj是Test()。

最后,在yaml用例中调用函数。 ​​​​​​​

-  name: ****列表  request:    url: ******    method: GET    headers:      token: ${read_extract_data(token)}    params:      page: 1      size: 20      query:      datatype: 3  extract:    lunboid: $.info.list[0].id  validate:    - equals: {statue: 200}    - equals: {msg: 查询成功}下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

资料获取方式 :

接口 自动化 框架 (1-4)(5)(6)(7)(8)(终极版)共6个分支 1pytest插件,运行规则以及 参数 ,pytest.ini配置文 件,跳过用例,用例执行顺序,夹具等 2Fixture固件,contest.py,断言以及Allure报告生成! 3Allure报告定制以及Parametrize数据驱动 4requests模块详解以及Cookie,Session 关联 处理 5 接口 统一请求封装和 接口 关联 封装 6 接口 自动化 框架 封装之规范 YAML 测试 用例& 接口 关联 封装改进&基础路径封装改进 7热加载封装以及断言封装 8数据类型处理以及DDT数据驱动封装 9异常日志与BaseUrl封装 简述和GNU一样, YAML 是一个递归着说“不”的名字。不同的是,GNU对UNIX说不, YAML 说不的对象是XML。 YAML 不是XML。为什么不是XML呢?因为: YAML 的可读性好。 YAML 和脚本语言的交互性好。 YAML 使用实现语言的数据类型。 YAML 有一个一致的信息模型。 YAML 易于实现。上面5条也就是XML不足的地方。同时, YAML 也有XML的下列优点: YAML 可以基于流来处理; YAML 表达能力...   我们在设计 自动化测试 框架 的时候,经常使用到配置文件,而配置文件种类有很多,常见的配置文件格式有很多中:ini、 yaml 、xml、properties、txt、py等。   配置文件ini   虽然配置文件放置一些公共的内容,比如说环境、路径、 参数 等。但也可以放 测试 数据,比如说 接口 一些信息,但不建议这样做。   下面看 python 读取配置文件ini的实例: 1、新建配置文件i...