如何在pytest中仅运行未标记的测试

时间:2016-10-04 07:10:36

标签: python pytest

我的python测试代码中有几个标记:

@pytest.mark.slowtest
@pytest.mark.webtest
@pytest.mark.stagingtest

我能够使用例如pytest -m slowtest

选择性地使用标记运行测试

如何在不诉诸pytest -m "not (slowtest or webtest or stagingtest)"的情况下运行无标记的测试?

您可以想象,我们将来可能会使用其他标记......

4 个答案:

答案 0 :(得分:0)

pytest-unmarked plugin旨在完成此任务。

PyPi到项目主页的链接已断开。这是正确的链接https://github.com/alyssabarela/pytest-unmarked

有关在https://docs.pytest.org/en/latest/plugins.html使用插件的更多信息

答案 1 :(得分:0)

您可以在顶级conftest.py中使用以下代码段。

def pytest_runtest_setup(item):
    envmarker = item.get_marker()
    if envmarker:
        pytest.skip("Skipping as the test has a marker")

请记住,参数化也是一个标记。如果您正在使用参数化,则可以在envmarker中进行检查并有条件地跳过。

如果您想使用命令行参数跳过所有未标记的测试,则可能需要在此处https://github.com/pytest-dev/pytest/blob/5d2d64c19063c177f91d9b4a6d85ac7d092e2da8/src/_pytest/mark/legacy.py#L70中找到一个计算结果为True的表达式。 如您所见,它使用python eval方法,您可以给python表达式执行该比赛。

答案 2 :(得分:0)

在conftest中添加以下内容将为所有未标记的测试添加特定的标记,从而为您解决此问题,这样您就可以运行类似pytest -m unmarked的东西

def pytest_collection_modifyitems(items, config):
    for item in items:
        if not any(item.iter_markers()):
            item.add_marker("unmarked")

与pytest-unmarked相比,它具有优势,因为您仍然可以指定其他标记,例如pytest -m 'webtest or unmarked'。 pytest-unmarked看上去也没有维护,并发出警告。

答案 3 :(得分:0)

我发现另一个有用的选项是使用pytest.ini添加默认选项。我们显式地编写要跳过的标记。它需要使pytest.ini中跳过的标记列表成为主流。换句话说,不是OP要求的100%,但这是我在查找默认标记时发现的最佳SO问题。希望这可以帮助其他人。

来自docs


addopts

    Add the specified OPTS to the set of command line arguments as if they had been specified by the user. Example: if you have this ini file content:

    # content of pytest.ini
    [pytest]
    addopts = --maxfail=2 -rf  # exit after 2 failures, report fail info

    issuing pytest test_hello.py actually means:

    pytest --maxfail=2 -rf test_hello.py

    Default is to add no options.

我添加到pytest.ini中的内容

[pytest]
addopts = -m "not slow"
markers =
    slow: marks tests as slow (deselect with '-m "not slow"')

使用

﮸$ grep 'mark.slow' tests/*.py | wc -l
3

$ pytest -s
======================================================= test session starts ========================================================
platform linux -- Python 3.8.2, pytest-6.0.1, py-1.9.0, pluggy-0.13.1
rootdir: /tests, configfile: pytest.ini
collected 66 items / 3 deselected / 63 selected                                                                                    

../tests/test_app.py ...............................................................

================================================= 63 passed, 3 deselected in 8.70s =================================================