跳转到主要内容

使用字典和默认值回退的 @pytest.mark.parametrize 的替代语法

项目描述

使用字典和默认值回退作为测试用例的 @pytest.mark.parametrize 的替代语法。

问题

使用 @pytest.mark.parametrize 参数化的测试,当参数数量增长时,很容易变得难以阅读。例如

@pytest.mark.parametrize(
    "a, b, c, d, e, f, expect",
    [
        (3, "one", 4.0, 0x01, 0o5, 9e0, 0b10,),
        (6, "five", 3.0, 0x05, 0o10, 9e0, 0b111,),
    ],
)
def test_my_func(a, b, c, d, e, f, expect):
    assert my_func(a, b, c, d, e, f) == expect

解决方案

pytest-kwparametrize 使用字典而不是元组作为测试用例。这样,每个参数都始终有标签,并且更容易被读者识别。此外,测试函数的参数不需要像 @pytest.mark.parametrize 那样单独声明,并且测试用例不需要被列表括起来

@pytest.mark.kwparametrize(
    dict(a=3, b="one", c=4.0, d=0x01, e=0o5, f=9e0, expect=0b10,),
    dict(a=6, b="five", c=3.0, d=0x05, e=0o10, f=9e0, expect=0b111,),
)
def test_my_func(a, b, c, d, e, f, expect):
    assert my_func(a, b, c, d, e, f) == expect

请参见下面的示例以了解其他功能。

示例

不带默认值的简单语法

@pytest.mark.kwparametrize(
    dict(a=0, b=0, expect=0),
    dict(a=1, b=0, expect=1),
)
def test_my_func(a, b, expect):
    assert my_func(a, b) == expect

为参数定义默认值,以便它可以从测试用例中省略

@pytest.mark.kwparametrize(
    dict(a=0, expect=0),
    dict(a=1, expect=1),
    dict(a=0, b=1, expect=0),
    dict(a=1, b=1, expect=2),
    b=0,
)
def test_my_func(a, b, expect):
    assert my_func(a, b) == expect

您也可以像 @pytest.mark.parametrize 一样提供可迭代的测试用例(例如列表、元组、生成器)

@pytest.mark.kwparametrize(
    [
        dict(a=0, b=0, expect=0),
        dict(a=1, b=0, expect=1),
    ]
)
def test_my_func(a, b, expect):
    assert my_func(a, b) == expect

默认值也可以通过 defaults= 关键字参数作为字典传递(此处所有参数都有默认值)

@pytest.mark.kwparametrize(
    dict(),
    dict(a=1, expect=1),
    dict(b=1),
    dict(a=1, b=1, expect=2),
    defaults=dict(a=0, b=0, expect=0),
)
def test_my_func(a, b, expect):
    assert my_func(a, b) == expect

标记符与 fixtures 和 Pytest 的内置关键字参数一起工作

@pytest.mark.kwparametrize(
    # test cases:
    dict(),
    dict(filename="special.txt", expect=1),
    dict(content="special content"),

    # default parameter values:
    filename="dummy.txt",
    content="dummy content",
    expect=42,

    # example of a Pytest built-in keyword argument:
    ids=["with defaults", "special filename", "speial content"],
)
def test_my_func(tmpdir, filename, content, expect):
    filepath = (tmpdir / filename)
    filepath.write(content)
    assert my_func(filepath) == expect

贡献者 ✨

请参阅 README.rst 了解贡献者列表。

此项目遵循 all-contributors 规范。欢迎任何类型的贡献!

项目详情


下载文件

下载适用于您平台文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

pytest_kwparametrize-0.0.3.tar.gz (8.9 kB 查看哈希值)

上传时间 源代码

构建分发

pytest_kwparametrize-0.0.3-py3-none-any.whl (7.2 kB 查看哈希值)

上传时间 Python 3

由以下支持