Skip to content

Pytest 结合数据驱动 - JSON


简介

数据驱动测试(Data-Driven Testing,DDT)是一种测试方法,它将测试数据与测试逻辑分离,使用外部数据源提供测试输入数据,并驱动测试执行。这样,测试用例的设计和执行不依赖于硬编码的数据,而是通过动态加载不同的数据集来自动执行多次测试。数据驱动测试可以帮助提高测试效率、扩展性,并减少重复工作。

简单来说,就是参数化的应用。数据量小的测试用例可以使用代码的参数化来实现数据驱动,数据量大的情况下建议大家使用一种结构化的文件如 JSON 文件、CSV 文件、Excel 表格或 YAML 文件等)来对数据进行存储,然后在测试用例中读取这些数据。


数据驱动应用场景

  • App、Web、接口自动化测试
  • 测试步骤的数据驱动
  • 测试数据的数据驱动
  • 配置的数据驱动

JSON 简介

JSON(JavaScript Object Notation)文件是一种文本文件,用于存储和交换数据。它的设计目标是提供一种轻量级、易于阅读和编写的数据交换格式,适用于各种编程语言和应用领域。


JSON 语法

由两种主要数据结构组成:

  1. 对象(Object):对象是一组键值对,其中每个键都是一个字符串,而值可以是字符串、数字、布尔值、数组、嵌套的对象等。键和值之间用冒号分隔,键值对之间用逗号分隔,整个对象用花括号 {} 包围。例如:{"key": value}
  2. 数组(Array):数组是一个有序的值列表,可以包含字符串、数字、布尔值、对象、数组等。数组元素之间用逗号分隔,整个数组用方括号 [] 包围。例如:[value1, value2 ...]

JSON 文件内容示例

{
  "name:": "hogwarts ",
  "detail": {
    "course": "python",
    "city": "北京"
  },
  "remark": [1000, 666, 888]
}

操作 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)

JSON 实现数据驱动测试

工程目录结构

  • src 目录:存放被测函数文件。
  • data 目录:存放 json 数据文件。
  • tests 目录:存放测试用例文件。
# 工程目录结构
.
├── data
│   └── params.json
├── src
│   ├── __init__.py
│   └── operation.py
└── tests
    ├── __init__.py
    └── test_add.py

代码示例

# 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)

测试结果:


总结

  • 操作 JSON 文件。
  • JSON 实现数据驱动测试。