vlambda博客
学习文章列表

接口测试框架开发实践5:配置文件读取

软件质量保障
专注于测试圈:测试质量保障、自动化工具/框架、平台开发、算法测试、BAT/TMD大厂测试岗面试题/面经分享、测试团队建设与管理、测试新技术的分享。 偶尔也聊聊个人工作的收获与经验。可以帮忙内推字节、阿里、百度等大厂。
62篇原创内容
Official Account

使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂。

配置管理这块主要是管理一些环境相关的配置,例如各个环境的域名、数据库连接信息等。而存储这些配置信息的载体一般选择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}]



往期推荐: