yaml的应用
前面我们配置Capability时,各个参数都是在代码里面写死的,比如:desired_caps['platformVersion']='5.1.1' 一旦设备和测试的app发生改变则需要去代码里面一个个修改,要么同时根据不同设备不同App来维护多套代码,这样显示是不符合规范而且是低效的!违背了自动化的初衷,那么如何改进这样的现状呢?
针对这种可能频繁变动的部分,可以将数据和代码分离。将数据单独抽离出来放在配置文件里面, 代码直接从配置文件去读取数据,这样能够减少代码冗余,提高效率。PS:类似的Web前端的html标签和css分离。
配置数据该如何管理?这里我们推荐使用yaml来管理配置数据。
Yaml概述
Yaml简介
正如YAML所表示的YAML Ain’t Markup Language,YAML 是一种简洁的非标记语言。YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读。
由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用。列一下现有的语言实现:Ruby,Java,Perl,Python,PHP,JavaScript等。
YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。比如同一段数据Josn和Yaml的表示分别如下:
Json
{ name: 'Tom Smith',age: 37,spouse: { name: 'Jane Smith', age: 25 },children: [ { name: 'Jimmy Smith', age: 15 },{ name: 'Jenny Smith', age: 12 } ] }
yaml
name: Tom Smith age: 37 spouse: name: Jane Smith age: 25 children: - name: Jimmy Smith age: 15 - name: Jenny Smith age: 12
语法特点
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
yaml下载安装
pip install pyyaml
检查是否安装成功
1、输入python
2、再输入:import yaml
报不是内部文件证明没有安装成功,需要重新安装
没有报错,表明安装成功
Yaml数据类型详解
支持数据类型
- 纯量(scalars):单个的、不可再分的值
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
纯量
数据最小的单位,不可以再分割。类似于Python中
flag
list数组
与Python的list数组结构类似,数组元素使用“-”开头,也可以根据缩进进行数组嵌套。
- Jack - Harry - Sunny # 也可以写成一行 [Jack,Harry,Sunny]
对象
对象的一组键值对,使用冒号结构表示。类似Python中的字典数据结构。
platformName: Android platformVersion: 6.0.1 # Yaml 也允许另一种写法,将所有键值对写成一个行内对象。 {platformName: Android,platformVersion: 6.0.1}
注意:冒号后面一定要有空格!对应到python字典的写法如下:
{'platformName': 'Android', 'platformVersion': '6.0.1'}
数据嵌套
yaml数据嵌套表示可以将上面的各类数据根据实际场景进行组合嵌套。
数据场景
Tom Smith 37岁,他有一个妻子叫 Jane Smith,25岁。 另外他有2个孩子,一个叫Jimmy Smith,15岁;另外一个叫Jenny Smith ,12岁。
yaml语法表示如下:
familyInfo.yaml
name: Tom Smith age: 37 spouse: name: Jane Smith age: 25 children: - name: Jimmy Smith age: 15 - name: Jenny Smith age: 12
转化为Python的写法为:
{'name':'Tom Smith','age':37,'spouse':{'name':'Jane Smith','age':25},'childern':[{'name':'Jimmy Smith','age':15},{'name':'Jenny Smith','age':12}]}
Yaml数据操作
数据读取
测试场景
- 读取配置中的所有信息
- 读取yaml数据表中Tom Smith的姓名、年龄、信息
- 单独读取配偶的姓名和年龄信息
- 分别读取两个孩子的姓名、年龄信息
load方法
load(stream, Loader=Loader) 解析文件流中的第一个YAML文档并生成相应的Python对象。
代码实现
yaml_load.py
import yaml file=open('familyInfo.yaml','r') data = yaml.load(file,Loader=yaml.FullLoader) print("data:",data) print(data['name']) print(data['age']) print(data['spouse']['name']) print(data['spouse']['age']) print(data['children'][0]['name']) print(data['children'][0]['age']) print(data['children'][1]['name']) print(data['children'][1]['age']) # 更改姓名 data['name'] = 'Tom' data['children'][1]['age'] = 8 print(data)
data: {'name': 'Kobe Smith', 'age': 37, 'spouse': {'name': 'Jane Smith', 'age': 25}, 'children': [{'name': 'Jimmy Smith', 'age': 25}, {'name': 'Jenny Smith', 'age': 12}]} Kobe Smith 37 Jane Smith 25 Jimmy Smith 25 Jenny Smith 12 {'name': 'Tom', 'age': 37, 'spouse': {'name': 'Jane Smith', 'age': 25}, 'children': [{'name': 'Jimmy Smith', 'age': 25}, {'name': 'Jenny Smith', 'age': 8}]} print(data)
数据修改
如果想改变某个数据,可以使用如下方法:
data['name']='555543d' print(data['name']) print(data)
注意:此处只是变量类型的数据变更,不会真正修改到yaml配置表中的数据。
数据转化
方法:dump()可以将Python对象序列化成YAML流。如果stream为None,则返回生成的字符串。
测试场景
将下面python数据类型转化为yaml数据类型
slogan=['welcome','to','51098'] website={'url':'www.baidu.com.net'} print(data)
代码:
import yaml slogan=['welcome','to','wc098'] website={'url':'www.baidu.com.net'} #python data print(slogan) print(website) #yaml data print(yaml.dump(slogan)) print(yaml.dump(website)) print(data)
['welcome', 'to', 'wc098'] {'url': 'www.baidu.com.net'} - welcome - to - wc098 url: www.baidu.com.net