覆盖 pytest 参数化函数名称
Posted
技术标签:
【中文标题】覆盖 pytest 参数化函数名称【英文标题】:Override a pytest parameterized functions name 【发布时间】:2016-10-01 05:40:27 【问题描述】:我的参数决定了我的参数化 pytest 的名称。我将为这些测试使用一些随机参数。为了不让 junit 中的报告名称混乱,我想为每个参数化测试创建一个静态名称。
有可能吗?
JUnit好像有个参数:Changing names of parameterized tests
class TestMe:
@pytest.mark.parametrize(
("testname", "op", "value"),
[
("testA", "plus", "3"),
("testB", "minus", "1"),
]
)
def test_ops(self, testname, op, value):
我尝试覆盖request.node.name
,但是我只能在测试执行期间重命名它。
我几乎可以肯定我需要编写插件或夹具。您认为解决此问题的最佳方法是什么?
【问题讨论】:
【参考方案1】:您正在寻找 pytest.mark.parametrize
的 ids
参数:
字符串 id 列表,或可调用的。如果是字符串,每个都是对应的 到 argvalues,使它们成为测试 id 的一部分。如果可调用,它 应该接受一个参数(单个 argvalue)并返回一个字符串或 返回无。
你的代码看起来像
@pytest.mark.parametrize(
("testname", "op", "value"),
[
("testA", "plus", "3"),
("testB", "minus", "1"),
],
ids=['testA id', 'testB id']
)
def test_industry(self, testname, op, value):
【讨论】:
我将如何解决单个测试用例pytest -k test_industry[testA id]
不起作用...
或者使用lambda函数生成一些ID ids=lambda t: str(t).lstrip()[0:8],
【参考方案2】:
您还可以使用来自:https://github.com/singular-labs/parametrization 或 pypi 的 pytest 参数化包装器
pip install pytest-parametrization
您的代码如下所示:
from parametrization import Parametrization
class TestMe:
@Parametrization.autodetect_parameters()
@Parametrization.case(name="testA", op='plus', value=3)
@Parametrization.case(name="testB", op='minus', value=1)
def test_ops(self, op, value):
...
等于:
class TestMe:
@pytest.mark.parametrize(
("op", "value"),
[
("plus", "3"),
("minus", "1"),
],
ids=['testA', 'testB']
)
def test_ops(self, op, value):
...
【讨论】:
以上是关于覆盖 pytest 参数化函数名称的主要内容,如果未能解决你的问题,请参考以下文章
python 参数化pytest测试用例,包含参数字典和人类可读的测试用例名称
python 参数化pytest测试用例,包含参数字典和人类可读的测试用例名称