gpt4 book ai didi

python - 在 pytest 参数化中标记输入

转载 作者:行者123 更新时间:2023-12-04 16:46:03 29 4
gpt4 key购买 nike

我有一个测试,我想作为两个不同测试套件的一部分运行,这些测试套件具有基于测试套件的不同参数输入。测试套件使用 pytest 标记进行标识。

有没有办法标记参数化条目,以便它们仅在该特定测试套件期间运行?

这是我想要做的:

@pytest.mark.suiteA # include the test in Suite A
@pytest.mark.suiteB # include the test in Suite B
@pytest.mark.parametrize("inputParameter", [
(10), # use this input for Suites A and B
pytest.mark.suiteB(12)]) # only use this input for Suite B
def test_printInputParameter(inputParameter):
print inputParameter

运行这样的代码不会产生我想要的结果——两个输入都用于两个套件。

我已经看到 pytest 将允许在参数化中使用 xfail 或跳过(请参阅 http://pytest.org/latest/skipping.html 上的“带参数化的跳过/xfail”)如果有一种方法可以编写仅在运行套件 B 时评估为真的条件语句,也会完成我所需要的。

在此先感谢您的帮助。

最佳答案

你在正确的轨道上。部分问题是您已将测试函数标记为suiteA 和suiteB,因此该函数被视为两者的一部分。
您使用的参数标记样式可能在 '14 中有效(并且在 pytest 3 后期仍然有效),但在最新的 pytest 版本 (5.x) 中无效。
这些示例使用最新的样式,至少可以追溯到 pytest 3.x。
来自 the pytest docs :

When using parametrize, applying a mark will make it apply to each individual test. However it is also possible to apply a marker to an individual test instance:

import pytest


@pytest.mark.foo
@pytest.mark.parametrize(
("n", "expected"), [(1, 2), pytest.param(1, 3, marks=pytest.mark.bar), (2, 3)]
)
def test_increment(n, expected):
assert n + 1 == expected

在上面的例子中,使用标记 foo 将运行该测试的所有参数(包括 bar)。使用标记 酒吧将仅使用 1 个标记参数运行该测试。
因此,对于您的示例,您可以执行以下操作(请原谅,我将所有名称(标记除外)更新为 PEP8 标准):
@pytest.mark.parametrize("input_parameter", [
# use this input for Suite A and Suite B
pytest.param(10, marks=[pytest.mark.suiteA, pytest.mark.suiteB]),
# use this input only for Suite B
pytest.param(12, marks=pytest.mark.suiteB),
# this input will run when no markers are specified
(13),
])
def test_print_input_parameter(input_parameter):
print(input_parameter)
您必须摆脱函数上方的两个标记装饰器。你只需要这个参数装饰器。
根据评论,输入 10 被标记以确保它只能与suiteA 或suiteB 一起运行。如果需要其中之一或两者,它将执行。
输入 12 绑定(bind)到单个标记套件 B。它只会在调用suiteB 时执行。
我还添加了输入值 13 作为默认未标记测试运行的示例。正常情况下,这不会对suiteA 或suiteB(或suiteC 或任何其他标记过滤器)执行,但如果未指定标记,则会运行(其余的也一样)。
或者,你可以这样做:
@pytest.mark.suiteB # this function is a part of suiteB
@pytest.mark.parametrize("input_parameter", [
# use this input for Suite A and Suite B
pytest.param(10, marks=pytest.mark.suiteA),
# use this input only for Suite B
(12),
# this input is also part of Suite B thanks to the function decorator, as well as suiteC and suiteD
pytest.param(13, marks=[pytest.mark.suiteC, pytest.mark.suiteD]),
])
def test_print_input_parameter(input_parameter):
print(input_parameter)
使用原始的两个参数,您确实有一个完整的suiteB 测试,其中一个参数仅用于suiteA。
在这种情况下,函数装饰器在suiteB 下运行整个测试。如果指定了suiteA,则只会执行10 个。
因为使用了函数装饰器,所以我编造的参数 13 和这个函数的所有参数一样,也是suiteB 的一部分。我可以根据需要将它添加到任意数量的其他标记中,但函数装饰器确保此测试将使用suiteB 下的所有参数运行。
这种替代方法适用于您的示例,但如果您有任何不重叠的参数(例如 13 不在套件 B 下运行),则您必须像中间示例一样单独指定每个参数。

关于python - 在 pytest 参数化中标记输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24698359/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com