简介
yaml 文件是一种数据序列化语言,扩展名可以是 .yaml 和 .yml ,支持 # 注释,通过缩进表示层级关系,区分大小写;其良好的跨语言、跨平台、易于理解、格式简单而广泛应用于配置文件、数据文件、日志文件等,因为采用了缩进方式表示层级关系,在python语言中使用就显得更加亲切。
用途:
- 用于做配置文件,如 环境变量,数据库信息,用户名密码,日志格式等
- 用于编写自动化测试用例:web、ui、app
语法规则:
- 区分大小写;
- 通过#注释;
- 执行时最好加上
Loader=yaml.FullLoader
; - 通过缩进表示层级关系,一般用空格,不要使用tab键;
- 字符串可以不用写引号,也可以写单引号或者双引号,区别在于,单引号会对特殊字符进行转义;
数据组成
- 列表、字典、列表嵌套字典;
- map对象:键:(空格)值对,如:“a”: “b”;
- 使用 ‘-’ 代表列表;
- 多组需要用 ‘-’ 开头,标注为不同组数据;
- yaml读取出来之后是一个字典列表格式;
数据类型:
- 字符串
- 整形
- 浮点
- 布尔
- 日期
- 空(null)
- 数组
上述类型除数组外。其他数据类型无特殊语法格式。只需要输入数据,底层会自动转换类型。
说到数组,在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
配置yaml
安装
1、使用命令安装
使用官方pypi源来安装 pip install ruamel.yaml
使用豆瓣pypi源来安装(推荐)pip install -i https://pypi.douban.com/simple ruamel.yaml
2、在Settings下搜索安装
基本使用
在项目根目录下创建 文件.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)]
}
锚点
主要作用就是引用公共变量。
语法:
-
设置锚点
使用 &锚点名称,建立一个锚点。可以标注锚点
-
引用锚点
使用 *+锚点名称。可以引用锚点 << 锚点名称。表示将锚点追加到本数据组中,表示合并。
info.yaml 文件
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}]
}
操作yaml
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()
总结
- yaml文件读取效率非常高
- yaml文件相当适合存放测试数据
- ruamel.yaml模块对yaml文件的操作进一步简化
- yaml在自动化测试和测试开发中都有广泛应用
parametrize 结合yaml实现自动化测试
1、写一个yaml文件:long.yaml
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
request 源码文章来源:https://uudwc.com/A/nP3GA
4、pytest 统一接口封装request_util.py文章来源地址https://uudwc.com/A/nP3GA
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