如何确保仅在 pytest 中明确询问时才运行带有标记的测试?

Ste*_*ini 4 python pytest

我有一些测试我用适当的标记标记。如果我运行 pytest,默认情况下它们会运行,但我想默认跳过它们。我知道的唯一选择是在 pytest 调用时明确说“不标记”,但我不希望它们默认运行,除非在命令行明确询问标记。

hoe*_*ing 10

对根据命令行选项控制跳过测试中的示例稍作修改:

# conftest.py

import pytest


def pytest_collection_modifyitems(config, items):
    keywordexpr = config.option.keyword
    markexpr = config.option.markexpr
    if keywordexpr or markexpr:
        return  # let pytest handle this

    skip_mymarker = pytest.mark.skip(reason='mymarker not selected')
    for item in items:
        if 'mymarker' in item.keywords:
            item.add_marker(skip_mymarker)
Run Code Online (Sandbox Code Playgroud)

示例测试:

import pytest


def test_not_marked():
    pass


@pytest.mark.mymarker
def test_marked():
    pass
Run Code Online (Sandbox Code Playgroud)

使用标记运行测试:

$ pytest -v -k mymarker
...
collected 2 items / 1 deselected / 1 selected
test_spam.py::test_marked PASSED
...
Run Code Online (Sandbox Code Playgroud)

或者:

$ pytest -v -m mymarker
...
collected 2 items / 1 deselected / 1 selected
test_spam.py::test_marked PASSED
...
Run Code Online (Sandbox Code Playgroud)

没有标记:

$ pytest -v
...
collected 2 items

test_spam.py::test_not_marked PASSED
test_spam.py::test_marked SKIPPED
...
Run Code Online (Sandbox Code Playgroud)


use*_*865 5

您可以将以下内容添加到 pytest.ini 中,而不是在 pytest 调用时明确地说“不是标记”

[pytest]
addopts = -m "not marker"
Run Code Online (Sandbox Code Playgroud)