一个用于创建命名测试套件的简单pytest扩展。
项目描述
Pytest (Parametrize) Suite
一个用于在pytest中编写简洁、易于阅读的参数化测试的小插件。
为什么?
Pytest的parametrize
是一种强大的方式,可以编写输入输出测试,快速扩展您的测试覆盖率,同时最大限度地减少您必须编写的测试断言数量。不幸的是,随着测试套件复杂性的增加,很难跟踪单独的测试用例。
一种获得更干净测试输出的方法是为每个参数化用例分配描述性的ids
和argnames
。然而,目前可用的方法会导致设置非常冗长,或者难以跟踪的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.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | f3e11143d38694e6ddc55876070018351c570df25ce45041eec590191a907d1f |
|
MD5 | 15106fb4add248e8da417104b048f277 |
|
BLAKE2b-256 | 98aca774673d4a26cd113c4b8e1b9c92a6ef11266db8bd6444be1c9d69c08794 |
关闭
pytest_parametrize_suite-23.1.2-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a3a6258cef97943c8e7321099e903a4f782dac1bb8416d7bef37b9ee334dca2f |
|
MD5 | f021078faa29ef6c77eeb1017d3fdffa |
|
BLAKE2b-256 | 055739f602d4af4f391976e355dc615cdbb0c2a18df1a44af8785d0b69ad49da |