Yaml的使用
一、Yaml介绍:
YAML 是一种较为人性化的数据序列化语言,可以配合目前大多数编程语言使用。YAML 的语法比较简洁直观,特点是使用空格来表达层次结构,其最大优势在于数据结构方面的表达,所以 YAML 更多应用于编写配置文件,其文件一般以 .yml 为后缀。一种置标语言,类似于xml。
官方介绍:
YAML 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。
YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。
YAML 的配置文件后缀为 .yml,如:runoob.yml 。
为什么要使用Yaml:
- 在自动化测试领域,数据是需要和代码分离的,当我们的数据与代码分离后,如果出现有数据的变动,只需要修改数据文件,而不需要修改代码。
数据驱动:基于数据来驱动自动化测试的内容。应用最为广泛的为两类:Excel、Yaml。选择数据驱动类型都是基于测试框架来定义的,也是基于企业的实际框架来应用决定的。(Yaml的使用会比Excel使用起来会更方便些)
二、环境搭建
1、第一步:PyYaml安装
pip install pyyaml
2、 第二步:Pycharm中导入
点击:feil - setting - Project:项目名称
输入:pyyaml,选择“PyYAML,点击 install Package
安装成功后显示:
3、yaml基本语法规则:
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- #表示注释,从这个字符一直到行尾,都会被解析器忽略,这个和python的注释一样
- 一个测试用例,使用一个yaml文件,如果多个测试用例使用同一个yaml文件,管理yaml文件时就会没有那么好管理
- yaml文件中参数使用传入的值,而不是固定值,可在yaml中value定义为空,在进行赋值给它
4、yaml支持的数据结构有三种:
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 纯量(scalars):单个的、不可再分的值。字符串、布尔值、整数、浮点数、Null、时间、日期
5、python中,文件后缀名为.yaml
yml与.yaml的文件表示作用相同,即yaml文件;一般来说,最常用的使用.yml作为yaml文件后缀名。例如:
6、一个在线网站,用于校验yaml文件格式是否正确:http://www.bejson.com/validators/yaml/
7、创建Yaml文件
- 缩进来进行管理
- 能够实现各类数据的展示
(1)列表list
import yaml #读取文件 file = open('../data/data1.yaml','r',encoding='utf-8') print('file===',type(file)) data = yaml.load(stream=file,Loader=yaml.FullLoader) print('data===',type(data)) print('data',data)
结果:
file=== <class '_io.TextIOWrapper'> data=== <class 'list'> data [1, 2, 3, 4, 5]
取值: data[0]--->1
list嵌套list
- #下标1 - 1 - 2 - 3 - a #下标2 - b #下标3 - c #下标4 结果:[[1, 2, 3], 'a', 'b', 'c']
(2)字典dict
- key的值需要时唯一,value可以时相同的
name: baizi age: 18 sex: 男 结果:{'name': 'baizi', 'age': 18, 'sex': '男'}
key重复:
name: baizi age: 18 sex: 男 name: 哈哈 结果:{'name': '哈哈', 'age': 18, 'sex': '男'} #当key重复时,读取的只是末尾的key
字典嵌套字典:
student: name: baizi age: 18 sex: 男 student2: name: 小刘 age: 21 sex: 男 结果:{'student': {'name': 'baizi', 'age': 18, 'sex': '男'}, 'student2': {'name': '小刘', 'age': 21, 'sex': '男'}}
取值:print(data['student'][name])--->baizi
列表中嵌套字典:
- student: name: baizi age: 18 sex: 男 - student: name: 大寒 age: 18 sex: 男 结果:[{'student': {'name': 'baizi', 'age': 18, 'sex': '男'}}, {'student': {'name': '大寒', 'age': 18, 'sex': '男'}}] 取值【baizi】:data[0]['student']['name']
(3)强制转换
- yaml是可以进行强制转换的,用 !! 实现,如下:
str: !!str 3.14 int: !!int "123" #结果 {'int': 123, 'str': '3.14'}
(4)分段
在同一个yaml文件中,可以用 — 来分段,这样可以将多个文档写在一个文件中
--- name: James age: 20 --- name: Lily age: 19
三、Yaml使用
传统的测试数据内容一般而言是各种数据类型的内容,如果要批量填入一整套内容,一般一整套的内容我们会通过list或是字典的形式将其保存,会更加的方便。
- 可以完美结合DDT进行使用
目录:
- data1.yaml
- name: baizi age: 18 sex: 男 - name: 大寒 age: 18 #18是int类型,需要是str,需要是:'18' sex: 男
- cases.py
import unittest from ddt import ddt, file_data # file_data解析Yaml内容 @ddt class CaseDemo(unittest.TestCase): @file_data('../data/data1.yaml') def test_01(self, **kwargs): # **kwargs:接收dict print(kwargs.get('name')) if __name__ == '__main__': unittest.main()
结果:
-
Yaml中使用url、参数
data1.yaml
- url: http://www.baidu.com txt: 乔峰 - url: http://www.baidu.com txt: 杨过
cases.py
——读取Yaml文件内容,打开百度,输入url,在搜索输入框输入Yaml中txt
import unittest from ddt import ddt, file_data # file_data解析Yaml内容 from selenium import webdriver from time import sleep import warnings @ddt class CaseDemo(unittest.TestCase): @file_data('../data/data1.yaml') def test_01(self, **kwargs): # **kwargs:接收dict warnings.simplefilter('ignore', ResourceWarning) #解决报错 driver = webdriver.Chrome() driver.get(kwargs['url']) driver.find_element_by_id('kw').send_keys(kwargs['txt']) sleep(2) if __name__ == '__main__': unittest.main()
-
模拟接口调用
data2.yaml
- method: post url: http://url/api01 params: id: 1 str: 2 name: 3 headers: ContentType: txt/json
cases.py
import unittest from ddt import ddt, file_data # file_data解析Yaml内容 @ddt class CaseDemo(unittest.TestCase): @file_data('../data/data2.yaml') def test_01(self, **kwargs): # **kwargs:接收dict print(kwargs['url']) print(kwargs['params']) if __name__ == '__main__': unittest.main()
结果:
- 模拟调用登录参数
login.yaml
- username: 1 pwd: 1 - username: 1 pwd: 2 - username: 2 pwd: 2
cases.py
import unittest from ddt import ddt, file_data # file_data解析Yaml内容 @ddt class CaseDemo(unittest.TestCase): @file_data('../data/login.yaml') def test_01(self, **kwargs): # **kwargs:接收dict print(kwargs['username']) #调用username print(kwargs['pwd']) #调用pwd if __name__ == '__main__': unittest.main()
结果:
现在的自动化技术,不是selenium,不是appium,也不是requests。现在核心的自动化测试技术时测试框架的设计和研发。
本文来自博客园,作者:他还在坚持嘛,转载请注明原文链接:他还在坚持嘛 https://www.cnblogs.com/brf-test/p/15828327.html