接口自动化测试框架之yaml
什么是配置文件?
配置文件是指项目当中,对项目进行配置(设置)的一些数据。如:通过openpyxl读取excel时传入的excel文件路径是一条配置数据;logging封装中传入的日志名称、日志收集器级别、流处理器级别、文件处理器级别等都是配置项,都可以写入配置文件当中。
配置项在当前环境、当前项目不会有变化,但对于不同的项目,不同的环境可能需要变化。
为什么要使用配置文件?
那之前封装好的log_handler举例。函数log_handler中有多个传入参数,此时我想修改stream_level,把原来的DEBUG级别改成INFO级别,这时我们修改需要三个步骤:第一,找到log_handler这个文件;第二,找到stream_level这个参数;第三,修改stream_level值为INFO。这如果是文件少、代码量少的场景还好说,如果对于一个文件量大、代码量大的大项目,这改起来需要耗费不少时间。所以我们可以把这些需要配置的信息(参数、常量、变量等)统一写在一个配置文件中,这时修改只需要找到配置文件(找一个配置文件总比找一个模块简单吧),找到这个配置项即可修改,这样能剩下不少的时间。
进一步来说,配置文件可以将代码和配置都变成可配置化,这样就提高了代码的重用性(一次配置,多个模块都可使用),不用每次都去修改代码内部。
什么是yaml?
yaml是一个标记语言(一种注释文本的语言,以便计算机可以操作该文本)。与xml、ini一样,都可以用来做配置文件。
为什么要使用yaml?
我们为什么要使用yaml而不是用xml、ini等文件格式做配置文件?这是因为yaml的功能更加强大,且与python兼容得更好。老式的格式(如cfg)支持的格式比较少,一般只支持数字和字符串,在上面写列表、字典等格式的数据还得在代码中将字符串转换成列表、字典,使用起来比较费劲。而yaml能支持多种数据格式,如数字、字符串、布尔、字典、列表等。
python从yaml中读取出来的数据是一个字典,字典的key是yaml中顶格写的配置名称,字典的value是换行写的各个配置的值。
(yaml)
(读取出来的yaml)
yaml在框架中扮演什么样的角色?
抽取框架中公共模块(logging_handler、excel_handler、mysql_handler、request_handler)中的一些可配置的信息整合到一个配置文件中,方便日后配置。
如何写yaml配置文件?
(yaml)
excel:
file: cases.xlsx
logger:
name: "log"
file: "log_01.txt"
logger_level: "DEBUG"
stream_level: "DEBUG"
file_level: "INFO"
students:
- john
- tom
- amy
- tim
yaml基本格式
配置项名称顶格写,该配置项下的每一个值换行写,且key冒号后面需空一格:
excel:
file: cases.xlsx
字典的表示
写完配置项名称,换行写各个key:value,读取出来的格式即为字典。
如logger配置项,读取出来的数据格式即为字典:
# 此处省略前面的配置项
'logger': {'file': 'log_01.txt',
'file_level': 'INFO',
'logger_level': 'DEBUG',
'name': 'log',
'stream_level': 'DEBUG'}
列表的表示
配置的值使用 - 即表示列表。
如students的配置项,读取出来的数据格式即为列表:
# 此处省略前面的配置项
'students': ['john', 'tom', 'amy', 'tim']
字符串表示
字符串可以用引号也可以不用,读取时会自动识别。
如:
"name":John
与下面的写法是一样的:
"name":"John"
代码实操
读取yaml数据
#打开yaml文件
with open("config.yml",encoding="utf-8") as f:
#加载yaml文件
conf = yaml.load(f)
#打印yaml数据
pprint.pprint(conf)
执行结果如下:
这里报了个warnning: calling yaml.load() without Loader=… is deprecated, as the default Loader is unsafe.意思是说默认的加载器是不安全的。我们进入load方法的源码看看:
def load(stream, Loader=None):
"""
Parse the first YAML document in a stream
and produce the corresponding Python object.
"""
if Loader is None:
load_warning('load')
Loader = FullLoader
loader = Loader(stream)
try:
return loader.get_single_data()
finally:
loader.dispose()
这里可以看出,如果不指定loader,会抛出个警告,并使用FullLoader作为默认的loader。这里我们最好指定一个loader,如:SafeLoader:
import yaml
import pprint
#打开yaml文件
with open("config.yml",encoding="utf-8") as f:
#加载yaml文件
conf = yaml.load(f,Loader=yaml.SafeLoader)
#打印yaml数据
pprint.pprint(conf)
执行结果如下,可看到警告信息没了:
封装
import yaml
def read_yaml(file):
"""读取 yaml 文件"""
with open(file, encoding='utf8') as f:
conf = yaml.load(f, Loader=yaml.SafeLoader)
return conf
def write_yaml(file, data):
with open(file, 'w', encoding='utf8') as f:
yaml.dump(data, f)
上一篇: 无重复字符的最长子串