首页 > 技术文章 > Yaml的使用

brf-test 2022-01-20 22:17 原文

一、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。现在核心的自动化测试技术时测试框架的设计和研发。


 

推荐阅读