Pytest 结合数据驱动 - JSON
同学们大家好,这个章节我们来学习如何结合 JSON 文件实现数据驱动。
简介
数据驱动测试(Data-Driven Testing,DDT)是一种测试方法,它将测试数据与测试逻辑分离,使用外部数据源提供测试输入数据,并驱动测试执行。这样,测试用例的设计和执行不依赖于硬编码的数据,而是通过动态加载不同的数据集来自动执行多次测试。数据驱动测试可以帮助提高测试效率、扩展性,并减少重复工作。
简单来说,就是参数化的应用。数据量小的测试用例可以使用代码的参数化来实现数据驱动,数据量大的情况下建议大家使用一种结构化的文件如 JSON 文件、CSV 文件、Excel 表格或 YAML 文件等)来对数据进行存储,然后在测试用例中读取这些数据。
还是先来了解一下什么是数据驱动测试。数据驱动测试也可以叫做 DDT,是通过外部数据源比如 JSON 文件提供测试输入数据,并驱动测试执行的方式。它的优点是将测试逻辑与数据分开管理,不需要硬编码数据,测试用例可以通过动态加载数据集来执行多次。对于小数据量的测试,可以通过代码的参数化实现数据驱动,而当数据量较大时,使用结构化文件比如 JSON 来存储和读取数据会更方便。
数据驱动应用场景
- App、Web、接口自动化测试
- 测试步骤的数据驱动
- 测试数据的数据驱动
- 配置的数据驱动
数据驱动测试在很多种自动化测试场景中都适用,包括 App、Web、接口自动化测试,测试步骤、测试数据、配置的数据驱动等等。它能提高代码的重用性、降低维护成本。
JSON 简介
JSON(JavaScript Object Notation)文件是一种文本文件,用于存储和交换数据。它的设计目标是提供一种轻量级、易于阅读和编写的数据交换格式,适用于各种编程语言和应用领域。
下面来了解一下什么是 JSON 数据。JSON 其实是 JavaScript Object Notation 的缩写,是一种轻量级的数据交换格式。它设计简洁,易于人类阅读和编写,同时也易于机器解析。JSON 在各种编程语言中都能支持使用,因此非常适合作为测试数据的存储格式。
JSON 语法
由两种主要数据结构组成:
- 对象(Object):对象是一组键值对,其中每个键都是一个字符串,而值可以是字符串、数字、布尔值、数组、嵌套的对象等。键和值之间用冒号分隔,键值对之间用逗号分隔,整个对象用花括号 {} 包围。例如:
{"key": value}
- 数组(Array):数组是一个有序的值列表,可以包含字符串、数字、布尔值、对象、数组等。数组元素之间用逗号分隔,整个数组用方括号 [] 包围。例如:
[value1, value2 ...]
咱们先来学习一下 JSON 的语法。JSON 主要有两种数据结构:对象和数组。对象是键值对的集合,键值对之间用冒号分隔,每个键值对用逗号隔开,整个对象用花括号包围;数组是值的有序列表,元素之间用逗号隔开,整个数组用方括号包围。例如,一个简单的 JSON 对象可以是 花括号"name"冒号"John", "age": 30花括号。
JSON 文件内容示例
{
"name:": "hogwarts ",
"detail": {
"course": "python",
"city": "北京"
},
"remark": [1000, 666, 888]
}
这里给了大家一个简单的 JSON 文件示例,其中包含一个名为 name 的键,其值为字符串 hogwarts,还有一个名为 detail 的对象,其中包含课程和城市信息。最后,remark 是一个包含数字的数组。
操作 JSON 文件
- 内置函数
open()
- 内置库
json
- 读取方法:
json.loads()
- 写入方法:
json.dumps()
import json
# 打开JSON文件
with open('example.json', 'r') as json_file:
# 使用json.load()函数加载JSON数据
data = json.load(json_file)
# 现在,"data"包含了从JSON文件中读取的数据,它是一个Python字典
print(data)
# 如果需要将Python数据结构转换为JSON格式的字符串,可以使用json.dumps()
json_string = json.dumps(data)
# 将JSON数据写入新文件
with open('output.json', 'w') as output_file:
json.dump(data, output_file)
# 如果你有JSON格式的字符串,可以使用json.loads()将其转换为Python数据结构
json_str = '{"name": "John", "age": 30}'
parsed_data = json.loads(json_str)
如果我们想要 python 来操作 JSON 文件可以怎么做呢?其实 python 已经内置了 json 库,可以用它来读取和写入 JSON 文件。我们可以使用 json点load 方法将 JSON 文件的内容加载为 python 数据结构,也可以使用 json点dumps 方法将 python 数据结构转换为 JSON 格式的字符串。如果我们需要将数据写回 JSON 文件,可以使用 json点dump。
JSON 实现数据驱动测试
下面我们来看看如何通过 JSON 实现数据驱动测试。
工程目录结构
- src 目录:存放被测函数文件。
- data 目录:存放 json 数据文件。
- tests 目录:存放测试用例文件。
# 工程目录结构
.
├── data
│ └── params.json
├── src
│ ├── __init__.py
│ └── operation.py
└── tests
├── __init__.py
└── test_add.py
先来看看如果要实现数据驱动,项目的目录结果如何管理比较好。这里给了大家一个示例,大家可以参考。项目下可以创建这些目录。其中 src 目录存放代码文件,data 文件夹存放 JSON 数据文件,tests 目录存放测试用例。
代码示例
# params.json 文件内容
{
"case1": [1, 1, 2],
"case2": [3, 6, 9],
"case3": [100, 200, 300]
}
# operation.py 文件内容
def my_add(x, y):
result = x + y
return result
# test_add.py 文件内容
import json
import pytest
def get_json():
'''
读取 json 数据
:return: 返回 [[]] 格式数据
'''
with open('../data/params.json', 'r') as f:
data = json.loads(f.read())
return list(data.values())
class TestWithJSON:
@pytest.mark.parametrize('x,y,expected', get_json())
def test_add(self, x, y, expected):
assert my_add(int(x), int(y)) == int(expected)
下面给大家一个具体的例子。在 params点json 文件中,包含了几个测试数据,例如加法计算的数据:case1、case2 和 case3,这些数据将被用来驱动测试。然后 operation点py 文件包含加法函数,是我们的被测对象。test add点py 文件则编写了被测对象的测试用例。测试文件中首先定义了 excel 文件的读取方法 get json,这个方法可以读取 JSON 文件中的数据,并返回一个二维列表。然后在测试用例上方通过 @pytest点mark点parametrize 读取 JSON 文件数据并运行测试。
测试结果:
运行后,@pytest点mark点parametrize 会把这个二维列表传递给测试函数 test add,并依次执行多次测试。对于每一组参数,test_add 会被调用一次。每次执行时,test add 会调用 my add 函数,并将 x 和 y 转换为整数,计算它们的和,然后与 expected 进行比较。如果计算结果与 expected 相等,则测试通过;否则测试失败。
下面给大家演示一下具体操作。好,进入项目之后的话,我们在 data 下面已经准备好了一个叫做 params点json,然后在这个里面有三组数据,然后在 src 目录下面我们已经准备好了被测的对象,那所以说接下来在 tests 下面我们来创建一个测试文件,比如说就叫 test add by json。好,那在这个文件里面的话,我们先来定义一个读取 json 文件的这样的一个方法啊。然后先使用 with open 打开刚才的那个 JSON 文件,在 data 下面的 params点json,然后的话它的模式是读取,然后去打开一个文件流,打开文件流之后的话,先把我们的这个文件读取出来,调用 loads 方法,然后在 loads 方法中需要用打开的文件流去调用 read 方法。好,因为我们最终想要的是一个列表,所以用 list 去转一下 data点values 的格式。ok,那这样的话我们就能够获取到想要的数据了。
./assets/Pytest结合数据驱动-JSON.mp4
那接下来我们来定义一个测试类,比如说就叫 test with json。好,那在这个里面的话我们来定义一个测试方法,比如说就叫 test add,然后也是需要一个 x,需要一个 y,然后需要一个预期结果,叫 expected。好,那然后在这个里面我们用 result 去调用一个叫做 my add 的这个方法,然后 my add 的方法我们去给它导入进来,然后把我们的这个 x 和 y 传进来,然后去断言一下我们的预期结果,它是等于最终算出来的这个实际结果的。那接下来的话我们来完成一下这个参数化,用 @pytest点mark点parametrize。第一步先把我们所需要的这些数据先给它放到这个字符串当中,然后接下来的话去调用一下 get json 的这个方法。好,下面我们来执行一下。执行完之后大家可以看到我们这些数据已经可以成功地实现数据驱动了。
./assets/Pytest结合数据驱动-JSON.mp4
总结
- 操作 JSON 文件。
- JSON 实现数据驱动测试。
最后我们来总结一下。这个章节我们学习了如何通过使用 json 库读取和写入 JSON 文件,进而实现数据驱动的自动化测试。好了,关于 JSON 实现数据驱动测试先介绍到这里。