我想知道如何使用pytest自定义标记选择测试的子集

一个简单的测试按预期工作:

带有一个标记参数的代码

import pytest

@pytest.mark.parametrize('a', [pytest.mark.my_custom_marker(0), 1])
@pytest.mark.parametrize('b', [0, 1])
def test_increment(a, b):
    pass

如果我只想运行标有“my_custom_marker”的测试

输出
$ pytest test_machin.py -m my_custom_marker --collect-only
platform linux2 -- Python 2.7.12, pytest-3.0.5, py-1.4.32, pluggy-0.4.0
rootdir: /home/mvelay/workspace/sandbox, inifile:
plugins: hypothesis-3.6.0, html-1.12.0, xdist-1.15.0, timeout-1.0.0
collected 4 items
<Module 'test_machin.py'>
  <Function 'test_increment[0-0]'>
  <Function 'test_increment[0-1]'>

但是,一旦我尝试测试多个标记的参数,我就面临一个问题

带有两个标记参数的代码
import pytest

@pytest.mark.parametrize('a', [pytest.mark.my_custom_marker(0), 1])
@pytest.mark.parametrize('b', [pytest.mark.my_custom_marker(0), 1])
def test_increment(a, b):
    pass

输出
$ pytest -m my_custom_marker test_machin.py --collect-only
platform linux2 -- Python 2.7.12, pytest-3.0.5, py-1.4.32, pluggy-0.4.0
rootdir: /home/mvelay/workspace/sandbox, inifile:
plugins: hypothesis-3.6.0, html-1.12.0, xdist-1.15.0, timeout-1.0.0
collected 4 items
<Module 'test_machin.py'>
  <Function 'test_increment[0-0]'>
  <Function 'test_increment[0-1]'>
  <Function 'test_increment[1-0]'>

预计只有[0-0]组合能跑。

有没有办法优雅地做到这一点?

最佳答案

您可以使用两个不同的标记,如下所示:

import pytest

@pytest.mark.parametrize('a', [pytest.mark.marker_a(0), 1])
@pytest.mark.parametrize('b', [pytest.mark.marker_b(0), 1])
def test_increment(a, b):
    pass

并指定一个标记表达式:
$ pytest test_machin.py -m "marker_a and marker_b" --collect-only
============= test session starts ===============================
platform darwin -- Python 2.7.10, pytest-3.0.5, py-1.4.32, pluggy-0.4.0
rootdir: /Users/yangchao/Code, inifile:
collected 4 items
<Module 'test_machin.py'>
  <Function 'test_increment[0-0]'>
============= 3 tests deselected =================================
============= 3 deselected in 0.00 seconds =======================

关于python - 如何使用参数上的自定义标记在pytest中选择测试的子集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41248127/

10-16 22:55