yaml读取
# yaml格式
# 语法规则
# 大小写敏感
# 使用缩进表示层级关系
# 缩进的空格树木不重要,只要相同层级的元素左侧对齐便可
# 支持的数据结构
# 对象,数组,纯量:单个的,不可再分的值(不可变类型)
# yaml数据格式-对象
# python字典 {'a':'b'} yaml对象 a: b(必须要空格)
# yaml数据格式-数组
# -a
# -b
# -c 也可以直接python写法
# yaml数据格式-纯组
# yaml数据引用
# 同一个yaml文件表示多个文档
# yaml数据读取
# 安装pyyaml pip install pyyaml
# 单个yaml读取
import yaml
import os
# 看是否有这个路径
def read_yaml(yamlpath):
if not os.path.isfile(yamlpath):
raise FileNotFoundError('文件路径不存在:{}'.format(yamlpath))
with open(yamlpath, 'r', encoding='utf-8') as f:
cfg = f.read()
content = yaml.load(cfg, Loader=yaml.FullLoader)
return content
if __name__ == '__main__':
content = read_yaml(r'E:\testzidonghua\student\qingqiu\data.yaml')
print(content)
for i in content:
print(i)
# loader有四种模式 BaseLoader:仅加载最基本的yaml
# safeLoader:安全地加载yaml语言的子集,建议加载不可信的输入
# FullLoader: 加载完整的yaml语言,避免执行任何代码(常用)
# UnsaFeLoader:不首信任的数据输入可以轻易利用原始loader代码
yaml变量传递
# yaml文件中的变量传递
# def yaml_template(yamlpath):
import yaml
import os
from string import Template
def yaml_tmplate(yamlpath,change_data):
if not os.path.isfile(yamlpath):
raise FileNotFoundError('文件路径不存在,请检查{}'.format(yamlpath))
if not isinstance(change_data,dict):
raise Exception('修改内容必须为字典:{}'.format(change_data))
# 读取文本内容
with open(yamlpath, 'r', encoding='utf-8') as f:
cfg = f.read()
content = Template(cfg).substitute(**change_data)
return content
if __name__ == '__main__':
change_data = {
'user': 'user01',
'pwd': 'psw01'
}
res = yaml_tmplate(r'E:\testzidonghua\student\qingqiu\post.yaml', change_data)
print(res)
传递的yaml数据格式
写入yaml数据
# yaml写入
# 单个写入
# 参数说明 data:写入的数据 stream:打开的文件 allow_unicode:true:参数防止写入的中文乱码
import os
import yaml
lista = [{'username': 'use1', 'password': 'psw1'}, {'username': 'use2', 'password': 'psw2'}]
def write_yaml(yamlpath, data):
if not os.path.isfile(yamlpath):
raise FileNotFoundError('文件不存在,请检查:{}'.format(yamlpath))
if not isinstance(data, list):
raise TypeError('数据类型错误:{}'.format(data))
with open(yamlpath, 'w', encoding='utf-8')as f:
yaml.dump(data=data, stream=f)
if __name__ == '__main__':
write_yaml(r'E:\testzidonghua\student\qingqiu\list.yaml', lista)
数据驱动
# yaml模式驱动
# 数据驱动实现步骤
# 1:从数据文件中读取数据,数据格式必须是列表中套用多个字典的形式[{}]
# 2:将读取到的数据通过parametrize装饰器传人测试用例函数中
import pytest
import yaml
import os
def read_yaml(yamlpath):
if not os.path.isfile(yamlpath):
raise FileNotFoundError('文件路径不存在:{}'.format(yamlpath))
with open(yamlpath, 'r', encoding='utf-8') as f:
cfg = f.read()
content = yaml.load(cfg, Loader=yaml.FullLoader)
return content
case_date = read_yaml(r'E:\testzidonghua\student\qingqiu\data.yaml')
print(case_date)
class TestCase():
# data是名字 case_date是值
@pytest.mark.parametrize('data', case_date)
def test_login(self, data):
print('输入用户名:{}'.format(data['usernaml']))
print('输入密码:{}'.format(data['password']))
print('点击登录')
assert 1 == 1
为啥需要yaml数据?
1 Yaml 是一种所有编程语言可用的友好的数据序列化标准
2 数据驱动就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。简单来说,就是参数化的应用。数据量小的测试用例可以使用代码的参数化来实现数据驱动,数据量大的情况下建议使用一种结构化的文件(例如yaml,json等)来对数据进行存储,然后在测试用例中读取这些数据。
原理与前面章节“UI自动化测试框架”中的“测试数据的数据驱动”大同小异。依然使用 @pytest.mark.parametrize 装饰器来进行参数化,使用参数化来实现数据驱动。