什么是 yaml
一种标记语言。yaml 是专门用来写配置文件的语言,非常简洁和强大
更直观,更方便,有点类似于 json 格式文章源自玩技e族-https://www.playezu.com/181945.html
自动化测试需要做到代码和数据分离,我们经常需要将不同的数据放到不同的文件内进行读取,比如用例放到 Excel 表里,配置文件放到 ini 文件里等等。yaml 专门用于写配置文件文章源自玩技e族-https://www.playezu.com/181945.html
yaml 基本语法规则文章源自玩技e族-https://www.playezu.com/181945.html
大小写敏感
使用缩进表示层级关系
缩进时不允许使用 Tab 键,只允许使用空格。
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
# 表示注释,这个和 python 的注释一样文章源自玩技e族-https://www.playezu.com/181945.html
安装 yaml
###pip install pyyaml文章源自玩技e族-https://www.playezu.com/181945.html
读取 yaml
键值对 (dict)
yaml 文件,test.yaml文章源自玩技e族-https://www.playezu.com/181945.html
###user: admin
pwd: 123456文章源自玩技e族-https://www.playezu.com/181945.html
用 python 读取 yaml 文件案例如下,先用 open 方法读取文件数据,再通过 load 方法转成 Python 对像,这个 load 跟 json 里面的 load 是相似的。文章源自玩技e族-https://www.playezu.com/181945.html
#! /usr/bin/python3文章源自玩技e族-https://www.playezu.com/181945.html
-- coding:utf-8 --
@Time : 2020/8/17 9:23
@Author : 程序员一凡
import yaml文章源自玩技e族-https://www.playezu.com/181945.html
定义 yaml 文件路径
yaml_path = "E:studydate.yaml"
打开 yaml 文件
file = open(yaml_path, "r", encoding="utf-8")
读取
string = file.read()
dict = yaml.load(string)
转换后数据类型为:dict
print(type(dict))
print(dict)
运行结果:
{'usr': 'admin', 'pwd': 123456}
序列 (list)
yaml 里面写一个数组,前面加一个 ‘-’ 符号,如下
- admin1
- admin2
- admin3
#! /usr/bin/python3
-- coding:utf-8 --
@FileName: day6.py
@Time : 2020/8/17 9:23
@Author : 程序员一凡
import yaml
定义文件路径
yaml_path = "E:studydate.yaml"
file = open(yaml_path, "r", encoding="utf-8")
string = file.read()
print(string)
转换后数据类型为列表
list = yaml.load(string, Loader=yaml.FullLoader)
print(list)
运行结果
['admin1', 'admin2', 'admin3']
纯量 (str)
单个的、不可再分的值。如:字符串、布尔值、整数、浮点数、Null、时间、日期
布尔值 true/false
n: true
int
n1: 12
float
n2: 12.3
# None
n3: ~
{'n': True, 'n1': 12, 'n2': 12.3, 'n3': None}
混合使用
字典镶嵌在列表内
usr:
name: admin
pwd: 123456mail:
user: 1224653735@qq.com
pwd: 123456
运行结果:
###[{'usr': {'name': 'admin', 'pwd': 123456}}, {'mail': {'user': '1224653735@qq.com', 'pwd': 123456}}]
数据写入 yaml
使用 yaml 下的 dump 方法将数据写入到 yaml 文件内
#! /usr/bin/python3
-- coding:utf-8 --
@Time : 2020/8/17 9:23
@Author : 程序员一凡
import yaml
写入键值对
data = {"send_mail": "7924348@qq.com"}
写入列表
data =["7924348@qq.com", "1224653735@qq.com"]
写入混合数据
data = [{"mai": {"send": "1224653735@qq.com"}}]
yaml 文件路径
yaml_path = "E:studydate.yaml"
打开文件,a 是在文件末尾写入内容
file = open(yaml_path, "a", encoding="utf-8")
写入数据, allow_unicode=True
yaml.dump(data, file)
关闭文件
file.close()
运行结果
键值对
send_mail: 7924348@qq.com
列表
- 7924348@qq.com
- 1224653735@qq.com
混合数据
- mai:
send: 1224653735@qq.com
实战
上面我们说了 yaml 用于在自动化测试中实现代码和数据分离。那么我们在企业项目中如何用 yaml 实现代码和数据分离呢?有一个场景,我们要发送邮件给指定收件人。
编写 yaml 文件
将收发邮件人数据写到 yaml 文件内
发件人邮箱和授权码
- send_mail: xxx@qq.com
password: QQ 邮箱的授权码
# 收件人邮箱 - get_mail: yyyy@qq.com
读取 yaml 文件
#! /usr/bin/python3
-- coding:utf-8 --
@FileName: read_yaml.py
@Time : 2020/8/19 16:21
公众号 : 程序员一凡
import yaml
def read_yaml():
"""读取 yaml 文件"""
# 定义 yaml 文件路径
yaml_path = "E:maildateyaml.yaml"
# 打开 yaml 文件
file = open(yaml_path, "r")
# 读取文件
string = file.read()
# 转换为 python 对像,类型为字典
dict = yaml.load(string)
print(dict)
# 返回数据为字典类型
return dict
运行结果
###[{'send_mail': 'xxx@qq.com', 'password': 'code'}, {'get_mail': 'yyyy@qq.com'}]
发送邮件
#! /usr/bin/python3
-- coding:utf-8 --
@FileName: mail.py
@Time : 2020/8/19 16:20
公众号 : 程序员一凡
import zmail
导入 common 文件下的 read_yaml 函数
from common import read_yaml
调用 yaml 文件里的数据
response = read_yaml.read_yaml()
def send(send_mail, password, get_mail):
"""发送测试报告"""
report_path = "E:mailreporttest.html"
MAIL = {
'subject': '邮件主题',
'content_text': '测试发送邮件',
'attachments': report_path,
}
server = zmail.server(send_mail, password)
server.send_mail(get_mail, MAIL)
send(response[0]["sendmail"], response[0]["password"], response[1]["getmail"])
课后练习
写一个登录的脚本,把登录的测试数据放在 yaml 文件中,然后读取 yaml 文件,执行脚本
将执行后的结果写入 Yaml 文件
文章首发于公众号程序员一凡,愿你我相遇皆有所获!
未知地区 1F
请教个问题,要读取的 yaml 文件内容如图
但是通过 yaml.load 方法读取后,返回的类型是 string,不是 dict,这是咋回事?