Yaml--配置文件
1、Yaml 介绍及安装
(1)yaml介绍
Yaml 是一种所有编程语言可用的友好的数据序列化标准。语法和其他高阶语言类似,并且可以简单表达字 典、列表和其他基本数据类型的形态。语法规则如下:
1. 大小写敏感。
2. 使用缩进表示层级关系。
3. 使用空格键缩进,而非Tab键缩进
4. 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。
5. 文件中的字符串不需要使用引号标注,但若字符串包含有特殊字符则需用引号标注;
6. 注释标识为# 官网:https://yaml.org/
(2)Yaml 安装
$ pip3 install PyYaml
(3)Yaml 快速体验
字典{"name": "test_yaml", "result", "success"}写成Yaml的形式,并输出结果 结构通过空格缩进来展示。
列表里的项用"-"来代表,字典里的键值对用":"分隔.
示例函数:
data.yaml name: "test_yaml" result: "success" demo.py import yaml with open("./data.yaml",'r') as f: data = yaml.safe_load(f) print(data)
运行结果:
{'name': 'test_yaml', 'result': 'success'}
2、Yaml 字典和列表介绍
(1)字典
字典里的键值对用":"分隔.
示例: {"name": "test_yaml", "result", "success"}
name: "test_yaml"
age: "success"
总结: 字典直接写key和value,每一个键值对占一行。 : 后面要有空格
(2)列表
一组按序排列的值(简称 "序列或列表")
数组前加有 “-” 符号,符号与值之间需用空格分隔
示例:["a", "b", "c"]
- "a"
- "b"
- "c"
列表中的元素需要用 -来表示
每一个元素前面都有一个 -,后面接元素内容
3、Yaml 字典和列表基本操作
(1)字典嵌套字典
需求:
{
person1:{
"name": "xiaoming",
"age": "18"
},
person2: {
"name": "xiaohong",
"age": "20"
}
}
示例:
person1:
name: "xiaoming"
age: "18"
person2:
name: "xiaohong"
age: "20"
(2)字典嵌套列表
需求:
{person: ["1", "2", "3"]}
示例 :
persion:
- "1"
- "2"
- "3"
(3)列表嵌套字典
需求:
[{ "username1": "test1" }, { "password1": "111", "username2": "test2", "password2": "222" }]
示例:
- username1: "test1"
- password1: "111"
username2: "test2"
password2: "222"
(4)列表嵌套列表
需求:
[["a","b","c"],["1","2","3"]]
示例:
-
- "a"
- "b"
- "c"
-
- "1"
- "2"
- "3"
注意:
- pycharm会自动将yaml中的tab转化成空格。但是不能复制”tab键“,不会进行转化。
- 同级别左侧必须要对齐,少个空格无所谓。
4、读取yaml文件
(1)读取单个Yaml文档
yaml文档
#data.yaml "用户名称": "test123" "密码": "123456"
示例函数:demo.py 中文问题(windows): encoding='utf-8
import yaml # 打开要读取的文件,中文 encoding='utf-8' with open("./data.yaml", 'r', encoding='utf-8') ) as f: # 加载文件内容 data = yaml.safe_load(f) # 打印结果 print(data)
读取实际上就是先使用 with open 的形式获取文件对象,再使用 yaml 中的 load 方法加载这个文件对象,通过 过load方法,一个字符串变成了一个字典
结果: {'用户名称': 'test123', '密码': '123456'}
(2)读取多个Yaml文档
多个文档在一个yaml文件,使用 --- 分隔方式来分段
yaml文档:
--- "用户名称1": "test123" "密码": "123456" --- "用户名称2": "test456" "密码": "123456"
示例:
import yaml with open("./data.yaml",'r') as f: data = yaml.safe_load_all(f) for i in data: print(i)
结果:
{'用户名称1': 'test123', '密码': '123456'}
{'用户名称2': 'test456', '密码': '123456'}
5、yaml封装
import os import yaml #1、创建类 class YamlReader: #2、初始化,文件是否存在 def __init__(self,yamlf): if os.path.exists(yamlf): self.yamlf = yamlf else: raise FileNotFoundError("文件不存在") self._data = None self._data_all = None #3、yaml读取 #单个文档读取 def data(self): #第一次调用data,读取yaml文档,如果不是,直接返回之前保存的数据 if not self._data: with open(self.yamlf,"rb") as f:self._data = yaml.safe_load(f) return self._data #多个文档读取 def data_all(self): #第一次调用data,读取yaml文档,如果不是,直接返回之前保存的数据 if not self._data_all: with open(self.yamlf,"rb") as f: self._data_all = list(yaml.safe_load_all(f)) return self._data_all
6、配置文件设置
(1)配置文件conf.yaml
BASE: #log等级 log_level: "debug" #扩展名 log_extension: ".log" test: url: "http://211.103.136.242:8064" case_file: "testdata.xlsx" case_sheet: "美多商城接口测试"
(2)基本目录配置
import os from utils.YamlUtil import YamlReader #1、获取项目基本目录 #获取当前项目的绝对路径 current = os.path.abspath(__file__) #print(current) BASE_DIR = os.path.dirname(os.path.dirname(current)) #print(BASE_DIR) #定义config目录的路径 _config_path = BASE_DIR + os.sep + "config" #定义data目录的路径 _data_path = BASE_DIR + os.sep + "data" #定义conf.yml文件的路径 _config_file = _config_path + os.sep +"conf.yml" #定义db_conf.yml路径 _db_config_file = _config_path + os.sep +"db_conf.yml" #定义logs文件路径 _log_path = BASE_DIR + os.sep + "logs" #定义report目录的路径 _report_path = BASE_DIR + os.sep + "report" def get_report_path(): """ 获取report绝对路径 :return: """ return _report_path def get_data_path(): return _data_path
def get_db_config_file(): return _db_config_file def get_config_path(): return _config_path def get_config_file(): return _config_file def get_log_path(): """ 获取Log文件路径 :return: """ return _log_path
(3)conf.yml配置文件读取
#2、读取配置文件 #创建类 class ConfigYaml: #初始yaml读取配置文件 def __init__(self): self.config = YamlReader(get_config_file()).data() self.db_config = YamlReader(get_db_config_file()).data() #定义方法获取需要信息 def get_excel_file(self): """ 获取测试用例excel名称 :return: """ return self.config["BASE"]["test"]["case_file"] def get_excel_sheet(self): """ 获取测试用例sheet名称 :return: """ return self.config["BASE"]["test"]["case_sheet"] def get_conf_url(self): return self.config["BASE"]["test"]["url"] def get_conf_log(self): """ 获取日志级别 :return: """ return self.config["BASE"]["log_level"] def get_conf_log_extension(self): """ 获取文件扩展名 :return: """ return self.config["BASE"]["log_extension"] def get_db_conf_info(self,db_alias): """根据db_alias获取该名称下的数据库信息 :param db_alias: :return: """ return self.db_config[db_alias] def get_email_info(self): """ 获取邮件配置相关信息 :return: """ return self.config["email"]