前言
在接口自動化測試的時候,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 的變量了