在测试过程中经常会涉及到接口关联的,比如需要上一个接口返回的参数作为下一个接口的入参,这里就涉及到热加载,即让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...