Pytest 结合数据驱动 - YAML
简介
数据驱动测试(Data-Driven Testing,DDT)是一种测试方法,它将测试数据与测试逻辑分离,使用外部数据源提供测试输入数据,并驱动测试执行。这样,测试用例的设计和执行不依赖于硬编码的数据,而是通过动态加载不同的数据集来自动执行多次测试。数据驱动测试可以帮助提高测试效率、扩展性,并减少重复工作。
简单来说,就是参数化的应用。数据量小的测试用例可以使用代码的参数化来实现数据驱动,数据量大的情况下建议大家使用一种结构化的文件如 CSV 文件、Excel 表格、JSON 文件或 YAML 文件等)来对数据进行存储,然后在测试用例中读取这些数据。
数据驱动应用场景
- App、Web、接口自动化测试
- 测试步骤的数据驱动
- 测试数据的数据驱动
- 配置的数据驱动
YAML 简介
YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化格式,用于配置文件和数据交换。它的设计目标是通过使用缩进来表示数据结构,以便人类可以轻松阅读和编写。YAML 语法简洁,适合于配置文件和数据的表示。
YAML 文件的数据存储规则:
- 对象:键值对的集合,用冒号 “:” 表示。
- 数组:一组按次序排列的值,前加 “-”。
- 纯量:单个的、不可再分的值。
- 字符串
- 布尔值
- 整数
- 浮点数
- Null
- 时间
- 日期
YAML 文件的优点
- 可读性高:语法非常接近自然语言,使用缩进代替括号,数据层次关系清晰。
- 格式简洁:无需使用引号包裹字符串(除非有特殊字符)。
- 支持复杂数据结构:支持列表、字典(映射)、嵌套数据等。
- 支持注释:使用
#
来添加注释,非常适合在配置文件中解释各个参数的含义,方便开发者理解和维护。 - 数据类型自动识别:可以自动识别多种数据类型,包括字符串、整数、浮点数、布尔值等,无需显式定义类型。
操作 YAML 文件
- 安装:
pip install pyyaml
- 读取方法:
yaml.safe_load(f)
- 写入方法:
yaml.safe_dump(f)
读取 YAML 文件
yaml.safe_load(f)
:将 yaml 格式数据转化为 python 对象。
import yaml
# 指定要读取的 YAML 文件路径
file_path = './my.yaml'
# 使用 with 语句打开文件以进行读取
with open(file_path, 'r', encoding='utf-8') as f:
# 使用 yaml.safe_load 从文件中加载 YAML 数据
data = yaml.safe_load(f)
写入 YAML 文件
yaml.safe_dump(f)
:将 python 对象转化为 yaml 格式,写入 yaml 文件。
import yaml
# 定义一个字典,其中包含一些数据
data = {
'name': 'John',
'age': 30,
'city': 'New York'
}
# 打开一个文件来写入 YAML 数据
with open('data.yaml', 'w') as file:
# 使用 yaml.safe_dump 将数据写入文件
yaml.safe_dump(data, file)
YAML 实现数据驱动测试
工程目录结构
- src 目录:存放被测函数文件。
- data 目录:存放 yaml 数据文件。
- tests 目录:存放测试用例文件。
# 工程目录结构
.
├── data
│ └── data.yaml
├── src
│ ├── __init__.py
│ └── operation.py
└── tests
├── __init__.py
└── test_add.py
代码示例
# data.yaml 文件内容
-
- 1
- 1
- 2
-
- 3
- 6
- 9
-
- 100
- 200
- 300
# operation.py 文件内容
def my_add(x, y):
result = x + y
return result
# test_add.py 文件内容
import pytest
import yaml
def get_yaml():
'''
读取 yaml 文件数据
:return: python 对象数据
'''
with open("../data/data.yaml", encoding="utf-8") as f :
data = yaml.safe_load(f)
return data
class TestWithYaml:
@pytest.mark.parametrize('x,y,expected', get_yaml())
def test_add(self, x, y, expected):
assert my_add(int(x), int(y)) == int(expected)
测试结果:
总结
- yaml 文件操作。
- yaml 实现数据驱动测试。