欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

接口自动化测试框架之yaml

程序员文章站 2024-03-19 19:26:58
...

什么是配置文件?

配置文件是指项目当中,对项目进行配置(设置)的一些数据。如:通过openpyxl读取excel时传入的excel文件路径是一条配置数据;logging封装中传入的日志名称、日志收集器级别、流处理器级别、文件处理器级别等都是配置项,都可以写入配置文件当中。
配置项在当前环境、当前项目不会有变化,但对于不同的项目,不同的环境可能需要变化。

为什么要使用配置文件?

那之前封装好的log_handler举例。函数log_handler中有多个传入参数,此时我想修改stream_level,把原来的DEBUG级别改成INFO级别,这时我们修改需要三个步骤:第一,找到log_handler这个文件;第二,找到stream_level这个参数;第三,修改stream_level值为INFO。这如果是文件少、代码量少的场景还好说,如果对于一个文件量大、代码量大的大项目,这改起来需要耗费不少时间。所以我们可以把这些需要配置的信息(参数、常量、变量等)统一写在一个配置文件中,这时修改只需要找到配置文件(找一个配置文件总比找一个模块简单吧),找到这个配置项即可修改,这样能剩下不少的时间。
进一步来说,配置文件可以将代码和配置都变成可配置化,这样就提高了代码的重用性(一次配置,多个模块都可使用),不用每次都去修改代码内部。
接口自动化测试框架之yaml

什么是yaml?

yaml是一个标记语言(一种注释文本的语言,以便计算机可以操作该文本)。与xml、ini一样,都可以用来做配置文件。

为什么要使用yaml?

我们为什么要使用yaml而不是用xml、ini等文件格式做配置文件?这是因为yaml的功能更加强大,且与python兼容得更好。老式的格式(如cfg)支持的格式比较少,一般只支持数字和字符串,在上面写列表、字典等格式的数据还得在代码中将字符串转换成列表、字典,使用起来比较费劲。而yaml能支持多种数据格式,如数字、字符串、布尔、字典、列表等。
python从yaml中读取出来的数据是一个字典,字典的key是yaml中顶格写的配置名称,字典的value是换行写的各个配置的值。
(yaml)
接口自动化测试框架之yaml
(读取出来的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)

执行结果如下:
接口自动化测试框架之yaml
这里报了个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)

执行结果如下,可看到警告信息没了:
接口自动化测试框架之yaml

封装

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)

相关标签: 接口自动化测试