跳过主要内容

一个用于创建命名测试套件的简单pytest扩展。

项目描述

Pytest (Parametrize) Suite

image image image image Test & Lint Coverage Code style: black

一个用于在pytest中编写简洁、易于阅读的参数化测试的小插件。

为什么?

Pytest的parametrize是一种强大的方式,可以编写输入输出测试,快速扩展您的测试覆盖率,同时最大限度地减少您必须编写的测试断言数量。不幸的是,随着测试套件复杂性的增加,很难跟踪单独的测试用例。

一种获得更干净测试输出的方法是为每个参数化用例分配描述性的idsargnames。然而,目前可用的方法会导致设置非常冗长,或者难以跟踪的ids和名称。

这就是pytest-parametrize-suite的作用。使用这个标记,您可以在传递给测试的值中定义测试ids和名称,使您的标识符紧密耦合到测试用例中,从而鼓励愉快的测试体验。

快速入门

使用pip安装

pip install -U pytest-parametrize-suite

使用Poetry安装

poetry add --group=test pytest-parametrize-suite

使用插件

该插件提供了一个pytest标记的单个入口点,称为suite

suite标记接受任意数量的关键字参数。每个条目应是一个argname->argvalue的映射,并且所有条目应具有相同的形状。

这为开发者提供了以下能力

示例

给定以下模块

# iso8601.py

from __future__ import annotations

import datetime


def iso8601(
    date_obj: datetime.date | datetime.datetime | datetime.time | datetime.timedelta
) -> str:
    """Format a Python date/time object into an ISO8601 string."""

    if isinstance(date_obj, (datetime.date, datetime.time)):
        return date_obj.isoformat()
    if isinstance(date_obj, datetime.timedelta):
        return timedelta_isoformat(date_obj)
    raise ValueError(
        f"Unrecognized value of type: {date_obj.__class__.__name__}: {date_obj}"
    )


def timedelta_isoformat(delta: datetime.timedelta) -> str:
    """Why isn't this part of the stdlib?"""
    usecs = abs(
        (delta.days * 24 * 60 * 60 + delta.seconds) * 1000000 + delta.microseconds
    )
    seconds, usecs = divmod(usecs, 1000000)
    minutes, seconds = divmod(seconds, 60)
    hours, minutes = divmod(minutes, 60)
    days, hours = divmod(hours, 24)
    fmt = f"P{days}DT{hours}H{minutes}M{seconds}.{usecs:06}S"
    return fmt

使用 pytest-parametrize-suite 编写

# test_iso8601.py

from __future__ import annotations

import datetime

import pytest

from example.iso8601 import iso8601


@pytest.mark.suite(
    datetime=dict(
        given_date_obj=datetime.datetime(1970, 1, 1),
        expected_date_str="1970-01-01T00:00:00",
    ),
    date=dict(
        given_date_obj=datetime.date(1970, 1, 1),
        expected_date_str="1970-01-01",
    ),
    time=dict(
        given_date_obj=datetime.time(),
        expected_date_str="00:00:00",
    ),
    timedelta=dict(
        given_date_obj=datetime.timedelta(1, 1, 1),
        expected_date_str="P1DT1.000001S",
    )
)
def test_iso8601(given_date_obj, expected_date_str):
    # When
    date_str = iso8601(given_date_obj)
    # Then
    assert date_str == expected_date_str

不使用 pytest-parametrize-suite 编写

# test_iso8601.py

from __future__ import annotations

import datetime

import pytest

from example.iso8601 import iso8601


@pytest.mark.parametrize(
    argnames=("given_date_obj", "expected_date_str"),
    argvalues=[
        (datetime.datetime(1970, 1, 1), "1970-01-01T00:00:00"),
        (datetime.date(1970, 1, 1), "1970-01-01"),
        (datetime.time(), "00:00:00"),
        (datetime.timedelta(1, 1, 1), "P1DT1.000001S")
    ],
    ids=["datetime", "date", "time", "timedelta"]
)
def test_iso8601(given_date_obj, expected_date_str):
    # When
    date_str = iso8601(given_date_obj)
    # Then
    assert date_str == expected_date_str

运行示例中定义的测试会输出以下内容

 pytest test_iso8601.py -v
=============================== test session starts ===============================
platform darwin -- Python 3.11.0, pytest-7.2.1, pluggy-1.0.0 -- /Users/god/Library/Caches/pypoetry/virtualenvs/pytest-parametrize-suite-TGMGi3Zp-py3.11/bin/python
cachedir: .pytest_cache
rootdir: /Users/god/PycharmProjects/pytest-parametrize-suite
plugins: parametrize-suite-23.1.0, cov-4.0.0
collected 4 items                                                                 

src/pytest_parametrize_suite/example.py::test_iso8601[datetime] PASSED      [ 25%]
src/pytest_parametrize_suite/example.py::test_iso8601[date] PASSED          [ 50%]
src/pytest_parametrize_suite/example.py::test_iso8601[time] PASSED          [ 75%]
src/pytest_parametrize_suite/example.py::test_iso8601[timedelta] PASSED     [100%]

================================ 4 passed in 0.02s ================================

如您所见,我们在最小化理解和发展测试用例的认知负担的同时,为参数化测试提供了开发者友好的输出。

快乐测试!:white_check_mark

项目详情


下载文件

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

源代码发行版

pytest_parametrize_suite-23.1.2.tar.gz (18.1 kB 查看哈希值)

上传时间 源代码

构建发行版

pytest_parametrize_suite-23.1.2-py3-none-any.whl (18.1 kB 查看哈希值)

上传时间 Python 3

由以下组织支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面