Pytest教程:Pytest参数化测试

Pytest参数化测试是指使用Pytest框架中的参数化功能来多次运行同一个测试函数,但使用不同的输入数据。这使得可以轻松地测试同一个函数在多组输入下的行为,并生成清晰的测试报告。

通过参数化测试,可以避免编写大量重复的测试代码,同时覆盖更多的测试场景,包括边界值测试、错误处理测试等。参数化测试的基本思想是将测试数据与测试逻辑分离,使得测试用例更加灵活、易于维护。

在Pytest中,参数化测试通常使用@pytest.mark.parametrize装饰器来实现。该装饰器允许你为测试函数提供多组参数,每组参数都会作为独立的测试用例来执行。这样,你就可以在一次测试运行中覆盖多种情况,而不需要编写大量的重复代码。

除了直接在装饰器中提供参数化的数据外,还可以从列表、元组、字典或外部数据文件中获取参数化的数据。这使得参数化测试非常灵活,并适用于各种测试场景。

1. 参数化测试的基本用法

1.1 使用 @pytest.mark.parametrize 装饰器

Pytest 提供了 @pytest.mark.parametrize 装饰器来实现参数化测试。你可以将测试函数标记为参数化,并为每组参数提供一个列表或元组。

python 复制代码
import pytest

@pytest.mark.parametrize("input1, input2, expected", [
    (2, 3, 5),
    (4, 5, 9),
    (10, 20, 30)
])
def test_addition(input1, input2, expected):
    result = input1 + input2
    assert result == expected

在上面的示例中,test_addition 函数被 @pytest.mark.parametrize 装饰器标记为参数化测试,参数化的数据以元组的形式传递给装饰器。每个元组表示一组参数,其中 input1 和 input2 是输入参数,expected 是期望的输出结果。

1.2 运行参数化测试

当你运行上述的参数化测试时,Pytest 会为每组参数生成一个独立的测试用例,并执行测试函数。测试结果将在测试报告中显示。

2. 多种参数数据来源示例

除了直接在装饰器中提供参数化的数据,还可以从多种数据来源中获取参数化的数据。下面是几个常见的示例:

2.1 从列表或元组中获取参数化数据

你可以从列表或元组中获取参数化的数据。例如,下面的示例从一个列表中获取参数化的数据:

python 复制代码
import pytest

data = [
    (2, 3, 5),
    (4, 5, 9),
    (10, 20, 30)
]

@pytest.mark.parametrize("input1, input2, expected", data)
def test_addition(input1, input2, expected):
    result = input1 + input2
    assert result == expected
2.2 从字典中获取参数化数据

你还可以从字典中获取参数化的数据。例如,下面的示例从一个字典中获取参数化的数据:

python 复制代码
import pytest

data = [
    {"input1": 2, "input2": 3, "expected": 5},
    {"input1": 4, "input2": 5, "expected": 9},
    {"input1": 10, "input2": 20, "expected": 30}
]

@pytest.mark.parametrize("input1, input2, expected", [pytest.param(**params) for params in data])
def test_addition(input1, input2, expected):
    result = input1 + input2
    assert result == expected
2.3 从外部数据文件中获取参数化数据

如果参数化的数据量较大,可以将数据存储在外部文件中,然后在测试函数中读取并使用。例如,下面的示例从一个 CSV 文件中获取参数化的数据:

python 复制代码
import csv
import pytest

def read_csv_data(file_path):
    with open(file_path, 'r') as file:
        csv_reader = csv.reader(file)
        next(csv_reader)  # 跳过标题行
        data = [(int(row[0]), int(row[1]), int(row[2])) for row in csv_reader]
    return data

data = read_csv_data('data.csv')

@pytest.mark.parametrize("input1, input2, expected", data)
def test_addition(input1, input2, expected):
    result = input1 + input2
    assert result == expected

在上述示例中,我们定义了一个 read_csv_data 函数来读取 CSV 文件中的数据,并返回一个包含参数化数据的列表。

3. 参数化测试的深度分析

参数化测试在自动化测试中非常有用,因为它可以用较少的代码覆盖更多的测试场景。以下是一些你可能会遇到的用例场景以及如何使用参数化测试解决它们的示例:

3.1 边界值测试

边界值测试是一种测试方法,用于测试一个函数或系统在输入参数接近最小或最大边界时的行为。通过使用参数化测试,你可以方便地测试各种边界值情况。

python 复制代码
import pytest

@pytest.mark.parametrize("value", [
    0,
    1,
    9999,
    10000
])
def test_boundary(value):
    assert value >= 0 and value <= 10000
3.2 错误处理测试

你可以使用参数化测试来测试函数或系统在不同错误处理情况下的行为。例如,下面的示例测试一个除法函数在除数为零时的行为。

python 复制代码
import pytest

@pytest.mark.parametrize("numerator, denominator", [
    (10, 2),
    (100, 5),
    (50, 0)
])
def test_division(numerator, denominator):
    if denominator == 0:
        with pytest.raises(ZeroDivisionError):
            result = numerator / denominator
    else:
        result = numerator / denominator
        assert result == numerator / denominator

在上述示例中,我们使用 pytest.raises 上下文管理器来捕获除数为零时引发的异常。


通过参数化测试,你可以用不同的参数运行同一个测试函数,并生成清晰的测试报告。你可以从列表、元组、字典或外部数据文件中获取参数化的数据。此外,你还可以使用参数化测试来解决边界值测试和错误处理测试等各种用例场景,希望本文能对你有所帮助,欢迎关注、私信交流。

相关推荐
海绵宝宝转agent7 小时前
learn-claude-code第1-5章开源学习笔记分享
人工智能·笔记·python·学习
小奇不哭7 小时前
ROS2 单节点,RGB-D 深度相机局部路径提取 + B 样条平滑路径 + YOLOv8 障碍物检测 + 深度测距,用于移动机器人视觉局部循迹。
python·yolov8·ros2·cv2·路径探索循迹
小小龙学IT7 小时前
Python scikit-learn 机器学习库深度解析
python·机器学习·scikit-learn
2601_962071578 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
卷无止境8 小时前
独立开发者的"富矿地带":哪些垂直领域值得你押注一辈子?
后端·python
Java后端的Ai之路9 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数
计算机毕业编程指导师9 小时前
计算机毕设选题推荐:基于Hadoop与Spark的Steam游戏数据分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·spark·毕业设计·steam游戏
计算机毕业编程指导师9 小时前
【计算机毕设选题推荐】基于Hadoop+Spark的白鹿抖音评论大数据分析与可视化系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·spark·毕业设计·抖音评论
Zootopia6269 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
Y3815326629 小时前
搜索 API 延迟优化:并发数、超时与超时的真实代价
python·搜索引擎