YAML+PyYAML笔记 1 | YAML简介和基础知识了解

1 什么是YAML?

  • 全称为:YAML Ain’t Markup Language,它不是标记语言,是一种轻量级数据交换格式;
  • 是一个易读易理解的数据序列化格式;
  • 面向文本,不同的语言中有相应的解析器和生成器,比如Python中的PyYAML
  • 可常用于各种语言的配置文件。

2 YMAL语法了解

  • 使用空白符、缩进和一些符号表示数据结构;
  • 使用缩进表示数据结构的层次;
  • YMAL中字符串使用单引号、双引号均可;
  • 注释或备注使用#号;

2.1 数据类型

# 基本数据类型
str: "Hello World"              # 字符串类型
int: 123                        # 整数类型
float: 3.14                     # 浮点数类型
bool: true                      # 布尔类型
null: null                      # 空值类型

2.2 列表

  • 分有序列表和无序列表;
  • 有序列表以破折号表示,每个元素占一行;
# 数组类型
array:
 - item1                           # 元素1
 - item2                           # 元素2
 - item3                           # 元素3
  • 无序列表使用星号表示:
* item1
* item2
* item3

2.3 对象

  • 即“字典”,为键值对形式
# 映射类型
map:
  key1: value1                      # 键值对1
  key2: value2                      # 键值对2
  key3: value3                      # 键值对3

2.4 多行字符串

  • 即可跨越多行的字符串;
  • 用竖线或大于符号来表示;
  • 竖线表示保留换行,大于号表示将多行合并成一行。
input_des: |
  My name
  is
  noamanelson.

output_d: >
  My name
  is
  noamanelson.

3 YAML的应用场景有哪些?

3.1 作为配置文件

  • 比如自动化测试中的config.yaml,可以写一些环境配置信息,或者用来管理接口数据等;
  • 比如开发项目中的配置文件,可以写数据库相关信息,域名,端口等信息;
  • 示例:
Project: autotest
URl: xxx
env: 
  test: yyy
  pro: zzz
mysql:
  port: 8888
  username: test1
  password: 123456

3.2 作为数据交互

  • 可标识接口的请求和响应,和管理接口数据道理一样;
  • 示例:
# 请求
method: POST
path: /login
params:
  username: NoamaNelson
  password: 123456

# 响应
status: 200
mes: success
token: fdshfsdhfsdfiereiopojfdjfjd
body:
 - userid: 1
    name: NoamaNelson

3.3 其它场景

  • 作为编排语言,用于容器编排工具中,如KubernetesDocker
  • 作为通用配置文件格式,用于自动化工具,如SaltStack

4 不同语言的解析和生成

  • Pythonpyyaml 库;
  • Rubypsych 库;
  • Javasnakeyaml 库;
  • JavaScriptjs-yaml 库。

5 使用pyyaml库解析

  • 安装:
pip install pyyaml
  • 新建一个config.yaml文件,如下:
# test

# 基本数据类型
str: "Hello World"              # 字符串类型
int: 123                        # 整数类型
float: 3.14                     # 浮点数类型
bool: true                      # 布尔类型
null: null                      # 空值类型

# 数组类型
array:
  - item1                           # 元素1
  - item2                           # 元素2
  - item3                           # 元素3

# 映射类型
map:
  key1: value1                      # 键值对1
  key2: value2                      # 键值对2
  key3: value3                      # 键值对3

input_des: |
  My name
  is
  noamanelson.

output_d: >
  My name
  is
  noamanelson.

Project: autotest
URl: xxx
env:
  test: yyy
  pro: zzz
Mysql:
  port: 8888
  username: test1
  password: 123456

# 请求
method: POST
path: /login
params:
  username: NoamaNelson
  password: 123456

# 响应
status: 200
mes: success
body:
  - userid: 1
    name: NoamaNelson

  • 新建一个yaml_read.py,代码如下:
# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/7/27 
# 文件名称:yaml_read.py
# 作用:yaml读取
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

import yaml

with open("config.yaml") as f:
    yaml_obj = yaml.load(f, Loader=yaml.Loader)
print(yaml_obj)
  • 输出为:
{'str': 'Hello World', 
'int': 123, 
'float': 3.14, 
'bool': True, 
None: None, 
'array': ['item1', 'item2', 'item3'], 
'map': {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}, 
'input_des': 'My name\nis\nnoamanelson.\n', 
'output_d': 'My name is noamanelson.\n', 
'Project': 'autotest', 
'URl': 'xxx', 
'env': {'test': 'yyy', 'pro': 'zzz'}, 
'Mysql': {'port': 8888, 'username': 'test1', 'password': 123456}, 
'method': 'POST', 
'path': '/login', 
'params': {'username': 'NoamaNelson', 'password': 123456}, 
'status': 200, 
'mes': 'success', 
'body': [{'userid': 1, 'name': 'NoamaNelson'}]}

6 yaml.dump()和yaml.load()

6.1 yaml.dump()

  • Python字典转换为YAML格式;
  • 示例:
dict_data = {'key1': 'value1', 'key2': {'name': 'xiaoming'}, 'key3': [{"name1": "xiaozhang"}]}
yaml_data = yaml.dump(dict_data)
print(yaml_data)
  • 输出:
key1: value1
key2:
  name: xiaoming
key3:
 - name1: xiaozhang

6.2 yaml.load()

  • YAML格式转换为Python字典;
  • 示例:
dict_data = {'key1': 'value1', 'key2': {'name': 'xiaoming'}, 'key3': [{"name1": "xiaozhang"}]}
yaml_data = yaml.dump(dict_data)
print(yaml_data)

yaml_data1 = 'key1: value1\nkey2:\n  name: xiaoli\n'
data = yaml.load(yaml_data1, Loader=yaml.FullLoader)
data1 = yaml.load(yaml_data, Loader=yaml.FullLoader)
print(data)
print(data1)
  • 输出:
key1: value1
key2:
  name: xiaoming
key3:
- name1: xiaozhang

{'key1': 'value1', 'key2': {'name': 'xiaoli'}}
{'key1': 'value1', 'key2': {'name': 'xiaoming'}, 'key3': [{'name1': 'xiaozhang'}]}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
requests是一个优秀的Python HTTP库,可以用于发送HTTP请求和处理响应。yaml是一种轻量级的数据序列化格式,可以被用于存储和传输数据。pytest是一个功能强大的Python测试框架,可以帮助我们编写高效、可维护、可扩展的测试代码。 结合使用这三个工具,我们可以轻松编写出高效、可读性强的接口自动化测试代码。我们可以使用yaml文件定义接口的请求参数和预期结果,然后使用requests发送请求并获取响应,最后使用pytest进行断言和测试结果的输出。 以下是一个简单的示例: 1. 首先,我们需要安装requests、pyyaml和pytest库: ``` pip install requests pyyaml pytest ``` 2. 然后,我们可以创建一个yaml文件来定义接口的请求和预期结果,比如: ```yaml - name: test_get_user url: https://api.example.com/user method: GET headers: Content-Type: application/json Authorization: Bearer token params: id: 123 expected_status_code: 200 expected_response: id: 123 name: John Doe ``` 3. 接着,我们可以编写一个Python脚本来读取yaml文件并发送请求: ```python import yaml import requests def test_api(): with open('test.yaml', 'r') as f: tests = yaml.safe_load(f) for test in tests: response = requests.request( method=test['method'], url=test['url'], headers=test['headers'], params=test['params'] ) assert response.status_code == test['expected_status_code'] assert response.json() == test['expected_response'] ``` 4. 最后,我们可以使用pytest来运行测试脚本: ``` pytest test_api.py ``` 这样,我们就可以使用requests+yaml+pytest来编写高效、可维护、可扩展的接口自动化测试代码了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虫无涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值