软件质量保障
专注于测试圈:测试质量保障、自动化工具/框架、平台开发、算法测试、BAT/TMD大厂测试岗面试题/面经分享、测试团队建设与管理、测试新技术的分享。 偶尔也聊聊个人工作的收获与经验。可以帮忙内推字节、阿里、百度等大厂。
使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂。
配置管理这块主要是管理一些环境相关的配置,例如各个环境的域名、数据库连接信息等。而存储这些配置信息的载体一般选择yaml/properties、ini/cfg。yaml可以适用于Java/Python测试框架,ini通常用于Python的测试框架。本文讲解一下这两种配置信息载体的配置格式与解析方法。
ini/cfg
在Python项目开发中,configparser库就是官方发布的配置文件库。ini文件由两部分组成sections与items,sections 用来区分不同的配置块,items 是sections下面的键值。
1.ini配置文件格式如下:
[section0]
key0 = value0
key1 = value1
[section1]
key2 = value2
key3 = value3
2.section不能重复,里面数据通过section去查找,每个seletion下可以有多个key和vlaue的键值对,注释用英文分号(;)。测试文件如下:
[mysql]
host=127.0.0.1
port=3306
user=root
password=yourpassword
dbname=test
[redis]
host=127.0.0.1
port=6379
password=88888
db=0
tips:如果ini文件里面写的是数字,读出来默认是字符串;
# -*- coding:utf-8 -*-
from configparser import ConfigParser
cf = ConfigParser()
cf.read('config/cfg.ini')
# ['mysql', 'redis']
print(cf.sections())
# 输出mysql下的所有配置项
print(cf.options('mysql'))
# 输出mysql下的所有键值对
print(cf.items('mysql'))
# 输出mysql 下配置项host的值
print(cf.get('mysql', 'host'))
# 输出port
print(cf.getint('mysql', 'port'))
>>
['mysql', 'redis']
['host', 'port', 'user', 'password', 'dbname']
[('host', '127.0.0.1'), ('port', '3306'), ('user', 'root'), ('password', 'yourpassword'), ('dbname', 'test')]
127.0.0.1
3306
3.如果想删除section中的一项,比如我想删除[mysql]下的port 这一行
# 删除一个 section中的一个 item(以键值KEY为标识)
cf.remove_option('mysql', "port")
4.删除整个section这一项
cf.remove_section('mysql')
5.新增一个section
# 添加一个section
cf.add_section("host")
print(cf.sections())
6.section里面新增key和value
# 往section添加key和value
cf.set("host", "dev", "taobao.com")
7.write
1.write写入有两种方式,一种是覆盖原文件内容,重新写入:w
cf.write(open(cfgpath, “w”)) # 覆盖原文件内容
另外一种是在原文件基础上继续写入内容,追加模式写入:a
cf.write(open(cfgpath, “a”)) # 追加模式写入
前面讲的remove和set方法并没有真正的修改ini文件内容,只有当执行cf.write()方法的时候,才会修改ini文件内容,举个例子:在ini文件上追加写入一项section内容。
# -*- coding:utf-8 -*-
from configparser import ConfigParser
cfgpath = 'config/cfg.ini'
cf = ConfigParser()
cf.read(cfgpath)
# ['mysql', 'redis']
print(cf.sections())
# 输出mysql下的所有配置项
print(cf.options('mysql'))
# 输出mysql下的所有键值对
print(cf.items('mysql'))
# 输出mysql 下配置项host的值
print(cf.get('mysql', 'host'))
# 输出port
print(cf.getint('mysql', 'port'))
cf.remove_section('mysql')
cf.add_section("host")
print(cf.sections())
cf.set("host", "dev", "taobao.com")
cf.write(open(cfgpath, 'w')) # 覆盖原文件内容
YAML
YAML是一种简洁的非标记语言。其以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁。
基本规则:
1.大小写敏感
2.使用缩进表示层级关系
3.缩进时不允许使用Tab键,只允许使用空格。
4.缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
5.使用#表示注释
6.字符串可以不用引号标注
数据结构:
1.对象:键值对的集合。键值对用冒号 “:” 结构表示,冒号与值之间需用空格分隔
2.数组:一组按序排列的值(简称 "序列或列表")。数组前加有 “-” 符号,符号与值之间需用空格分隔
3.基本数据类型(scalars):单个的、不可再分的值(如:字符串、bool值、整数、浮点数、时间、日期、null等),None值可用null表示
Python库:PyYaml
测试文件:
redis:
host: 127.0.0.1
port: 6379
password: 88888
db: 0
1.python通过open方式读取文件数据,再通过load函数将数据转化为列表或字典;
# -*- coding:utf-8 -*-
import yaml
def read_yaml_data(yaml_file):
print("***获取yaml文件数据***")
file = open(yaml_file, 'r', encoding="utf-8")
file_data = file.read()
file.close()
print(file_data)
print("类型:", type(file_data))
print("***转化yaml数据为字典或列表***")
data = yaml.load(file_data, Loader=yaml.FullLoader)
print(data)
print("类型:", type(data))
return data
if __name__ == '__main__':
yaml_path = 'config/cfg.yaml'
read_yaml_data(yaml_path)
>>
***获取yaml文件数据***
redis:
host: 127.0.0.1
port: 6379
password: 88888
db: 0
类型:<class 'str'>
***转化yaml数据为字典或列表***
{'redis': {'host': '127.0.0.1', 'port': 6379, 'password': 88888, 'db': 0}}
类型:<class 'dict'>
2.yaml文件中内容为“键值对'嵌套"键值对"
mysql:
host: 127.0.0.1
port: 3306
user: root
password: yourpassword
dbname: test
redis:
host: 127.0.0.1
port: 6379
password: 88888
db: 0
{'mysql': {'host': '127.0.0.1', 'port': 3306, 'user': 'root', 'password': 'yourpassword', 'dbname': 'test'}, 'redis': {'host': '127.0.0.1', 'port': 6379, 'password': 88888, 'db': 0}}
3.yaml文件中“键值对”中嵌套“数组”
# yaml键值对中嵌套数组
usr3:
- a
- b
- c
usr4:
- b
{'usr3': ['a', 'b', 'c'], 'usr4': ['b']}
4.yaml文件数据为数组
# yaml数组
- a
- b
- 5
[{'usr1': 'aaa'}, {'psw1': 111, 'usr2': 'bbb', 'psw2': 222}]