【问题标题】:How to parametrize a test with several pytest markers?如何使用多个 pytest 标记对测试进行参数化?
【发布时间】:2021-11-21 20:45:42
【问题描述】:

假设我想用几个 pytest 标记运行相同的测试代码。一种解决方案是复制粘贴带有标记的测试:

@pytest.mark.A
def test_a():
    # same
    # code
    ...

@pytest.mark.B
def test_b():
    # same
    # code
    ...

我发现的一个“hack”是参数化一个虚拟参数并使用 pytest.param 应用不同的标记:

@pytest.mark.parametrize("_", [
    pytest.param(None, marks=pytest.mark.A),
    pytest.param(None, marks=pytest.mark.B),
])
def test(_):
    # same
    # code
    ...

但它很笨拙并且添加了未使用的参数。有没有更简单的方法?

【问题讨论】:

  • 您的意思是您想触发一次test,它会运行两次,还是您希望在使用A 标记或B 标记运行测试时运行测试?
  • 我想运行两次测试,每个标记一次。如果我只选择带有标记 A 的测试,那么只运行一次。

标签: python pytest


【解决方案1】:

您可以创建一个产生pytest.param 的函数并在parametrize 中使用假名(空字符串)以避免向测试发送参数

def add_markers():
    for mark in [pytest.mark.A, pytest.mark.B]:
        yield pytest.param(marks=mark)


@pytest.mark.parametrize('', add_markers())
def test_example():
    # code

【讨论】:

  • 我得到一个错误:“名称的数量(0)必须等于值的数量(1)”
  • @astrojuanlu 你有什么改变吗?
  • 奇怪的是,把它变成一个简单的案例让它再次工作。我将再次查看我的实际代码。
  • 有效!我在其他地方犯了一个错误。谢谢!
猜你喜欢
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
  • 1970-01-01
相关资源
最近更新 更多