📜  Pytest-参数化测试(1)

📅  最后修改于: 2023-12-03 15:18:51.675000             🧑  作者: Mango

Pytest 参数化测试

Pytest 是一款流行的 Python 测试框架。Pytest 提供了参数化测试(Parameterized Testing)的功能,它可以方便的对一组相似的测试用例进行测试,减少了编写测试用例的时间和代码冗余度。

基本用法
使用 @pytest.mark.parametrize 装饰器

我们可以使用 @pytest.mark.parametrize 装饰器来配置参数化测试。这个装饰器可以将多个参数值作为元组组成的列表传递给测试用例。

假设我们有一个名为 multiply 的函数,它接收两个参数 ab,然后返回它们的乘积:

def multiply(a, b):
    return a * b

我们可以通过以下方式对该函数进行参数化测试:

import pytest

@pytest.mark.parametrize("a, b, expected", [
    (1, 2, 2),
    (3, 4, 12),
    (-2, 5, -10),
])
def test_multiply(a, b, expected):
    assert multiply(a, b) == expected

在这个示例中,我们指定 @pytest.mark.parametrize 装饰器所需传递的参数名称和参数值。我们将这些参数传递给测试函数 test_multiply,这个函数会多次运行,每次运行传入不同的参数组合。

这个测试用例中,我们传递了三组参数,每组参数都是一个元组,包括两个整数和它们的乘积,这些参数组合初始化了三个测试用例。

带有参数名称的参数化

如果我们希望在测试用例日志中使用有意义的参数名称,我们可以使用一个列表或一个字典来指定参数名称,将它们传递给 parametrize 装饰器。

@pytest.mark.parametrize(
    "a, b, expected",
    [
        (1, 2, 2),
        (3, 4, 12),
        pytest.param(-2, 5, -10, id="negative"),
    ],
)
def test_multiply_with_param_names(a, b, expected):
    assert multiply(a, b) == expected

在这个示例中,我们将参数值存储在一个三元组中,并使用参数名称指定参数名称。我们通过 pytest.param 函数为单个参数组配置一个 ID。

在本示例中,第三个参数组包括 -25 作为参数,这个参数组的 ID 是 "negative"。我们可以使用这个 ID 来标识哪个测试用例失败了。

参数化测试与 pytest.fixture 结合使用

参数化测试可以轻松地与 pytest.fixture 结合使用,让您能够在许多测试用例中重复使用相同的测试代码。将 fixture 和参数化组合使用时,fixture 将会针对每个传递的参数运行测试。

@pytest.fixture
def number():
    return 4

@pytest.mark.parametrize("a, b, expected", [
    (1, 2, 2),
    (3, 4, 12),
    (-2, 5, -10),
])
def test_multiply_with_fixture(number, a, b, expected):
    assert multiply(number, a, b) == expected

在这个示例中,我们创建了一个名为 number 的 fixture。我们将这个 fixture 运用在我们的测试函数中,其中我们也使用了参数化测试。在我们的测试函数中,fixture number 会针对每个不同的参数组进行测试。

结语

Pytest 参数化测试提供了一种优雅的方式来对一组相似的测试用例进行测试。结合 pytest.fixture 的使用,可以更轻松地编写更加灵活的测试用例,减少了代码重复的可能,提高了代码的可维护性和可测试性。