yaml 文件是一种数据序列化语言,扩展名可以是 .yaml 和 .yml ,支持 # 注释,通过缩进表示层级关系,区分大小写;其良好的跨语言、跨平台、易于理解、格式简单而广泛应用于配置文件、数据文件、日志文件等,因为采用了缩进方式表示层级关系,在python语言中使用就显得更加亲切。
用途:
语法规则:
Loader=yaml.FullLoader
;数据类型:
上述类型除数组外。其他数据类型无特殊语法格式。只需要输入数据,底层会自动转换类型。
说到数组,在yaml中想定义一个数组,需要在key值前增加一个"-"来表示数组。
# ['张三','李四']
# 列表 --> yaml
- 张三
- 李四
# {'user':'123456','passwd':'123456'}
# 字典 --> yaml
user: test1
passwd: 123456
# [{'user':'123456','passwd':'123456'},{'user':'111111'}]
# 列表包含字典 --> yaml
- user: test1
passwd: 123456
- user: 111111
读取yaml
import yaml
# 获取项目路径
def get_obj_path():
return os.path.dirname(__file__)
# return os.getcwd()
def read_yaml():
with open('yaml文件路径',mode='r',encoding='utf-8') as f:
value = yaml.load(stream=f,Loader=yaml.FullLoader)
return value
1、使用命令安装
使用官方pypi源来安装 pip install ruamel.yaml
使用豆瓣pypi源来安装(推荐)pip install -i https://pypi.douban.com/simple ruamel.yaml
在项目根目录下创建 文件.yaml
例一:
- name: 张三
- age: 14
# 输出:[{'name': '张三'}, {'age': 14}]
- name
- age
# 输出:['name', 'age']
例二:
info.yaml 文件
yaml_test.py 文件读取info.py文件
# from ruamel.yaml import YAML
import os
import yaml
import pprint # 美化输出数据
with open('D:/Pycharm/pythonProject1/info.yaml','r',encoding='utf-8') as f:
date=yaml.load(stream=f,Loader=yaml.FullLoader)
print('\n', date)
执行结果
{
'boolean': [True, False],
'float': [3.14, '6.8523015e_5'],
'int': [123, 685230],
'kongzhi': {'parent': None, 'olass': None},
'string': ['哈哈', 'Hello world: from this way', '写多行'],
'date': [datetime.date(2018, 2, 12), datetime.datetime(2018, 2, 7, 12, 23, 34)]
}
主要作用就是引用公共变量。
语法:
设置锚点
使用 &锚点名称,建立一个锚点。可以标注锚点
引用锚点
使用 *+锚点名称。可以引用锚点
<< 锚点名称。表示将锚点追加到本数据组中,表示合并。
yaml_test.py 文件读取info.py文件
with open('D:/Pycharm/pythonProject1/info.yaml','r',encoding='utf-8') as f:
date=yaml.load(stream=f,Loader=yaml.FullLoader)
print('\n', date)
执行结果
{
'manager': {'name': '张三', 'age': 28, 'sex': '男'},
'staff': {'name': '李彤', 'age': 22, 'sex': '女'},
'department': [{'Position_m': '经理'}, {'name': '张三', 'age': 28, 'sex': '男', 'level': 10}, {'Position_s': '职员'}, {'name': '李彤', 'age': 22, 'sex': '女', 'leve': 5}]
}
1、读取
def get_cwd(): #获取项目根路径
return os.getcwd()
# 读取yaml
def read_yaml(filename):
# filename 文件名称
path = get_cwd()+'/'+filename
with open(path,'r',encoding='utf-8') as f:
return yaml.load(stream=f,Loader=yaml.FullLoader)
2、写入(追加)
def get_cwd(): #获取项目根路径
return os.getcwd()
# 写入yaml
def write_yaml(filename,data):
# filename 文件名称
# data 写入数据
path = get_cwd()+'/'+filename
with open(path,'a',encoding='utf-8') as f:
# allow_unicode 允许Unicode编码格式
yaml.dump(data,f,allow_unicode=True)
3、清空
def clear_yaml(yaml_path):
with open(yaml_path,encoding="utf-8",mode="w") as f:
f.truncate()
2、读取yaml文件:read_yaml.py
import os
import yaml
def get_obj_path(): # 获取项目路径
# 使用切割方法 获取目录路径
return os.path.dirname(__file__).split('testcase')[0]
# 读取yaml文件
def read_yaml(filename):
path = get_obj_path()+ filename
with open(path,'r',encoding='utf-8') as f:
data = yaml.load(stream=f,Loader=yaml.FullLoader)
return data
if __name__ == '__main__':
print(read_yaml('login.yaml'))
执行结果
[
{
'name': '正确验证码登录',
'request': {
'method': 'get', 'url': 'http://域名/jeecg-boot/sys/login',
'headers': {'Content_Type': 'application/json'},
'data': {'captcha': 'Gkak!@#2023s', 'checkKey': 1637811815838, 'password': 123456, 'remeber_me': 2, 'username': 'admin'}
},
'validate': 'None'
}
]
3、使用parametrize结合yaml 实现数据驱动 parametrize_yaml.py
import pytest
import requests
from testcase.read_yaml import read_yaml
class TestYaml:
session = requests.session()
@pytest.mark.parametrize('caseinfo',read_yaml('login.yaml'))
def test_get_token(self,caseinfo):
print('获取统一接口鉴权')
name =caseinfo['name']
method =caseinfo['request']['method']
url =caseinfo['request']['url']
data =caseinfo['request']['data']
validate =caseinfo['validate']
res = TestYaml.session.request(method=method,url=url,params=data)
result = res.json()
assert 'access_token' in result
4、pytest 统一接口封装request_util.py
import requests
class RequestUtil:
session = requests.Session()
def send_request(self,method,url,data,**kwargs):
method = str(method).lower()
res = ""
if method == "get":
res = RequestUtil.session.request(method,url,params=data,**kwargs)
elif method =="post":
res = RequestUtil.session.request(method,url,json=data,**kwargs)
return res