pytest文档72- 使用 template 替换 yaml 文件的变量
Posted 上海-悠悠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytest文档72- 使用 template 替换 yaml 文件的变量相关的知识,希望对你有一定的参考价值。
前言
在接口自动化测试的时候,yaml 文件一般放测试的数据或当配置文件使用,yaml 文件存放静态的数据是没问题的,python的数据类型基本上都是支持的。
有时候我们想在 yaml 文件中引用变量来读取 python 代码的设置值。
template 使用
template 是字符串模板,用于替换字符串中的变量,是 string 的一个类引用变量有 2 种格式
- $variable 使用 $变量名 引用变量
- ${variable} 使用 ${变量名} 大括号包起来
第一种 $variable
from string import Template
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
tempTemplate = Template("My name is $name , i like $fancy")
d = {'name': 'yoyo', 'fancy': 'python'}
print(tempTemplate.substitute(d))
# 运行结果
# >>> My name is yoyo , i like python
第二种 ${variable}
from string import Template
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
tempTemplate = Template("My name is ${name} , i like ${fancy}")
d = {'name': 'yoyo', 'fancy': 'python'}
print(tempTemplate.substitute(d))
# 运行结果
# >>>My name is yoyo , i like python
safe_substitute使用
上面的方式只能严格的匹配变量,当字符串中有$符号,不想匹配变量的时候,会报错
from string import Template
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
tempTemplate = Template("$My name is ${name} , i like ${fancy}")
d = {'name': 'yoyo', 'fancy': 'python'}
print(tempTemplate.substitute(d))
这段,$符号加在My的前面,我只想让它是一个普通的字符串,不想引用变量,就出现了报错说找不到这个key
Traceback (most recent call last):
File "D:/soft/api_pytest_1208/config/aa.py", line 12, in <module>
print(tempTemplate.substitute(d))
File "E:\\python36\\lib\\string.py", line 130, in substitute
return self.pattern.sub(convert, self.template)
File "E:\\python36\\lib\\string.py", line 123, in convert
return str(mapping[named])
KeyError: 'My'
Template 里面还有一个 safe_substitute 的方法,可以忽略匹配不到的变量
from string import Template
tempTemplate = Template("$My name is ${name} , i like ${fancy}")
d = {'name': 'yoyo'}
print(tempTemplate.safe_substitute(d))
# 运行结果:$My name is yoyo , i like ${fancy}
虽然字符串定义了多个变量,但是引用的时候只给了name这个值,也不影响运行,没给值的当普通字符串出来,这样就很完美了
yaml 文件引用变量
通过前面 Template 的基础使用,已经掌握了基本的用法了,接下来在 yaml 文件中引用变量
- test:
name: login case1
request:
url: http://49.235.x.x:7000/api/v1/login/
method: POST
headers:
Content-Type: application/json
User-Agent: python-requests/2.18.4
json:
username: $user
password: $psw
validate:
- eq: [$.msg, login success!]
- eq: [$.code, 0]
python读yaml文件代码
from string import Template
import yaml
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
with open("login.yml", encoding='utf-8') as fp:
read_yml_str = fp.read()
# print(xx)
tempTemplate1 = Template(read_yml_str)
c = tempTemplate1.safe_substitute({"user": "yoyo", "psw": "123456 "})
print(c)
# yml 文件数据,转 python 类型
yaml_data = yaml.safe_load(c)
print(yaml_data)
运行结果
- test:
name: login case1
request:
url: http://49.235.x.x:7000/api/v1/login/
method: POST
headers:
Content-Type: application/json
User-Agent: python-requests/2.18.4
json:
username: user
password: 123456
validate:
- eq: [$.msg, login success!]
- eq: [$.code, 0]
[{
'test': {
'name': 'login case1',
'request': {
'url': 'http://49.235.x.x:7000/api/v1/login/',
'method': 'POST',
'headers': {
'Content-Type': 'application/json',
'User-Agent': 'python-requests/2.18.4'
},
'json': {
'username': 'user',
'password': 123456
}
},
'validate': [{
'eq': ['$.msg', 'login success!']
}, {
'eq': ['$.code', 0]
}]
}
}]
这样 yaml 文件就能引用到 python 的变量了
以上是关于pytest文档72- 使用 template 替换 yaml 文件的变量的主要内容,如果未能解决你的问题,请参考以下文章
pytest文档68-pytest-lazy-fixture 插件解决 pytest.mark.parametrize 中使用 fixture 问题
pytest文档67-pytest.mark.parametrize 中使用 fixture