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