Pytest 结合数据驱动 - YAML
同学们大家好,这个章节我们来学习如何结合 yaml 文件实现数据驱动。
简介
数据驱动测试(Data-Driven Testing,DDT)是一种测试方法,它将测试数据与测试逻辑分离,使用外部数据源提供测试输入数据,并驱动测试执行。这样,测试用例的设计和执行不依赖于硬编码的数据,而是通过动态加载不同的数据集来自动执行多次测试。数据驱动测试可以帮助提高测试效率、扩展性,并减少重复工作。
简单来说,就是参数化的应用。数据量小的测试用例可以使用代码的参数化来实现数据驱动,数据量大的情况下建议大家使用一种结构化的文件如 CSV 文件、Excel 表格、JSON 文件或 YAML 文件等)来对数据进行存储,然后在测试用例中读取这些数据。
首先来了解一下什么是数据驱动测试。数据驱动测试又可以叫做 DDT,是一种可以通过外部数据源比如 yaml 文件提供测试数据,并根据这些数据驱动测试执行的方法。这样,测试用例的设计和执行就不再依赖于写死的数据,而是能够通过动态加载不同的数据集,自动执行多次测试。简单来说,就是通过参数化来提高测试的复用性。如果数据量较小,参数化可以通过代码来实现,而对于更大的数据集,像 yaml 文件这样的结构化数据格式会更适合存储和读取数据。
数据驱动应用场景
- App、Web、接口自动化测试
- 测试步骤的数据驱动
- 测试数据的数据驱动
- 配置的数据驱动
数据驱动测试在很多种自动化测试场景中都适用,包括 App、Web、接口自动化测试,测试步骤、测试数据、配置的数据驱动等等。它能提高代码的重用性、降低维护成本。
YAML 简介
YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化格式,用于配置文件和数据交换。它的设计目标是通过使用缩进来表示数据结构,以便人类可以轻松阅读和编写。YAML 语法简洁,适合于配置文件和数据的表示。
下面我们再来认识一下什么是 yaml。yaml 是一种轻量级的、易于人类阅读的数据序列化格式,它的设计目标是让数据结构看起来更清晰,尤其是在配置文件和数据交换中使用。yaml 通过缩进表示层次关系,比起 json,它语法更加简洁,特别适合人类编辑和理解。
YAML 文件的数据存储规则:
- 对象:键值对的集合,用冒号 “:” 表示。
- 数组:一组按次序排列的值,前加 “-”。
- 纯量:单个的、不可再分的值。
- 字符串
- 布尔值
- 整数
- 浮点数
- Null
- 时间
- 日期
接下来看看 yaml 的语法。yaml 文件使用缩进来表示层级结构,其中对象用键值对表示,键和值之间用冒号分隔。数组则用横杠来表示,每一行表示一个元素。纯量是指简单的单一值,如字符串、布尔值、整数、浮点数、Null、日期等等。
YAML 文件的优点
- 可读性高:语法非常接近自然语言,使用缩进代替括号,数据层次关系清晰。
- 格式简洁:无需使用引号包裹字符串(除非有特殊字符)。
- 支持复杂数据结构:支持列表、字典(映射)、嵌套数据等。
- 支持注释:使用
#
来添加注释,非常适合在配置文件中解释各个参数的含义,方便开发者理解和维护。 - 数据类型自动识别:可以自动识别多种数据类型,包括字符串、整数、浮点数、布尔值等,无需显式定义类型。
yaml 为什么是是现在比较推荐的一种管理数据的格式?这是因为 yaml 格式有几个明显的优点。首先它具有高可读性,语法简洁直观,使用缩进代替了花括号和方括号,层次关系清晰。而且它格式简洁,无需使用引号来包裹字符串,除非有特殊字符。支持复杂的数据结构,比如列表、字典和嵌套数据。除此之外,它还支持注释,方便开发者在配置文件中注解各个参数的用途,增强可维护性。并且它也支持自动数据类型识别,可以不需要显式地定义数据类型,yaml 会自动根据内容判断数据类型。
操作 YAML 文件
- 安装:
pip install pyyaml
- 读取方法:
yaml.safe_load(f)
- 写入方法:
yaml.safe_dump(f)
下面我们来学习一下如何在 python 中操作 yaml。这里需要用到一个叫做 pyyaml 的第三方库。通过 pip install pyyaml 命令就可以安装好这个库。然后通过 yaml点safe load 方法可以将 YAML 格式的数据转换成 python 数据结构,而 yaml点safe dump 方法则可以将 python 数据写入到 yaml 文件中。下面我们分别看一个例子。
读取 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)
先来看看如何读取文件。这里我们通过 with open 方法打开一个指定路径的 yaml 文件,然后使用 yaml点safe load 可以将 YAML 数据加载为 python 对象。yaml点safe_load 只会加载基本的 yaml 数据类型,如字典、列表、字符串、整数等。一般来说会根据 yaml 中最外层的格式转换为字典或列表。
写入 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,同样需要先使用 with open 方法指定文件路径打开这个文件,并使用 w 参数指定为写的方式,然后通过 yaml.safe dump 方法就可以将 python 中的数据结构,比如字典、列表转换为 yaml 格式并写入到文件中。这样可以方便地将测试数据保存为 yaml 文件,供后续测试使用。
YAML 实现数据驱动测试
下面我们来看看如何使用 yaml 文件实现数据驱动。
工程目录结构
- src 目录:存放被测函数文件。
- data 目录:存放 yaml 数据文件。
- tests 目录:存放测试用例文件。
# 工程目录结构
.
├── data
│ └── data.yaml
├── src
│ ├── __init__.py
│ └── operation.py
└── tests
├── __init__.py
└── test_add.py
下面我们来看看如何使用 YAML 实现数据驱动测试。先来看看如果要实现数据驱动,项目的目录结果如何管理比较好。这里给了大家一个示例,大家可以参考。项目下可以创建这些目录。其中 src 目录存放代码文件,data 文件夹存储 YAML 数据文件,tests 目录存放测试用例。
代码示例
# 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)
下面给大家一个具体的例子。在 data.yaml 文件中,包含了几个测试数据,每一组数据包含两个加数和它们的期望结果,这些数据将被用来驱动测试。然后 operation点py 文件包含加法函数,是我们的被测对象。test_add点py 文件则编写了被测对象的测试用例。测试文件中首先定义了 Excel 文件的读取方法 get_yaml,这个方法可以读取 JSON 文件中的数据,并返回一个二维列表。然后在测试用例上方通过 @pytest点mark点parametrize 读取 JSON 文件数据并运行测试。
测试结果:
运行后,@pytest点mark点parametrize 会把这个二维列表传递给测试函数 test add,并依次执行多次测试。对于每一组参数,test_add 会被调用一次。每次执行时,test add 会调用 my add 函数,并将 x 和 y 转换为整数,计算它们的和,然后与 expected 进行比较。如果计算结果与 expected 相等,则测试通过;否则测试失败。
下面给大家演示一下具体操作。进入项目之后,我们先来安装一下工具,用 pipe install pyyaml。好,安装完了之后,我们在这儿先来创建一个新的目录,叫做 data,然后在 data 的目录下我们来新创建一个 yaml 文件 data点yaml。然后在这个文件里边我们把对应的测试数据给它拿过来哎。这是一个列表嵌套的这样的一种格式,然后的话我们再重新创建一个,这回要创建一个包,我们去创建一个叫做 src。然后在 src 下面我们去创建一个 python 文件,在这个文件里定义我们的被测对象。比如说叫 my add,然后它需要两个参数 x y。然后我们来计算一下 x 和 y 的加的结果,然后把这个结果给它返回来,就简单的先写这么多,那然后的话我们再来创建一个叫做 tests 的包。那么在 tests 的包下面我们来创建一个测试文件,叫做 tests params by yaml,通过这个来完成我们的这个数据驱动啊。然后我们先来定义一个读取 yaml 文件的这样的一个方法,然后使用 with open,把我们 yaml 文件的这个路径传进来,在 data 下面有个叫 data点yaml,然后指定一下它的这个字符集是 utf杠8。然后的话我们的这个数据它应该就需要用 yaml,然后去调用它里面的这个方法,先把这个 yaml 导进来,然后去调用我们的这个 safe load 的这样的一个方法,然后把这个文件流给它传过去,然后把数据 return 回来就可以了。
./assets/Pytest结合数据驱动-YAML.mp4
那接下来的话我们再来定义一个测试类,比如说就叫 Test With Yaml。好,那然后在这个里面我们来定义一个这个测试函数,这个测试函数需要一个 x,需要一个 y,需要一个预期结果。好,那么在这里面的话,我们计算的这个结果其实就需要去调用一下 my add 的这个方法,那这个方法的话我们也需要给它去导入进来,那导入进来之后的话,我们把 x 和 y 传进来,那然后的话去断言一下我们的这个预期结果,它应该等于实际算出来的这个结果。OK,那接下来的话我们来通过数据驱动来完成参数化,先用 @pytest点mark点parametrize。好,那我们的参数都需要什么呢?是不是应该就是这边的这些参数?好,那然后的话接下来我们就直接调用我们的这个 get yaml 方法,它就会去读取这个文件里面的数据啊。设置好之后我们来执行一下,看看结果啊。可以看到我们刚才这个 yaml 文件里头的数据已经可以成功地执行了。
./assets/Pytest结合数据驱动-YAML.mp4
总结
- yaml 文件操作。
- yaml 实现数据驱动测试。
最后我们来总结一下。这个章节我们学习了如何通过 pyyaml 库读取和写入 YAML 文件。然后学习了 YAML 如何结合 pytest 实现数据驱动测试,简化测试数据的管理和维护。好了,关于 YAML 实现数据驱动测试先介绍这么多。