pytest 多个命令行跳过选项

时间:2021-01-29 13:48:37

标签: python pytest

我有不同的测试套件。

有正常测试,有慢速测试,还有后端测试(以及任意更多的“特殊”测试,除非另有说明,否则可能需要跳过)。

除非通过了 --run-slow 和/或 --run-backend CLI 选项,否则我希望始终跳过慢速测试和后端测试。

如果仅通过 --run-slow,我将运行所有正常测试加上“慢”测试(例如标记为 @pytest.mark.slow 的那些测试)。 --run-backend 也一样;如果两个 CLI 选项都通过,则运行所有正常测试 + 慢速测试 + 后端测试。

我遵循了文档中的 pytest Control skipping of tests according to command line option pattern,但发现自己对 pytest 还不够了解,无法将其扩展为多个跳过 CLI 选项。

有人可以帮我吗?

参考代码片段:

def pytest_addoption(parser):
    parser.addoption("--run-slow",    action="store_true", default=False, help="run slow tests")
    parser.addoption("--run-backend", action="store_true", default=False, help="run backend tests")


def pytest_configure(config):
    config.addinivalue_line("markers", "slow: mark test to run slow")
    config.addinivalue_line("markers", "backend: mark test as backend")


def pytest_collection_modifyitems(config, items):
    if config.getoption("--run-slow") or config.getoption("--run-backend"): # <-- this line logic is bad!
        return
    skip = pytest.mark.skip(reason="need '--run-*' option to run")
    for item in items:
        if "slow" in item.keywords or "backend" in item.keywords:
            item.add_marker(skip)

谢谢!

1 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,那么您是在询问 pytest_collection_modifyitems 中的逻辑。您可以将代码更改为:

conftest.py

def pytest_collection_modifyitems(config, items):
    run_slow = config.getoption("--run-slow")
    run_backend = config.getoption("--run-backend")
    skip = pytest.mark.skip(reason="need '--run-*' option to run")
    for item in items:
        if (not run_slow and "slow" in item.keywords or 
            not run_backend and "backend" in item.keywords):
            item.add_marker(skip)

默认情况下,这将跳过所有标记为 slowbackend 的测试。如果添加命令行选项 --run-slow 和/或 --run-backend,则不会跳过相应的测试。

另一个选项(如评论中所述)将按标记过滤。在这种情况下,您不必添加自己的命令行选项,而只需 filter tests by markers,例如使用 pytest -m "not (slow or backend)" 不使用这些标记运行测试,如果您只想跳过一个标记的测试,请使用 pytest -m "not slow"pytest -m "not backend"。在这种情况下,您不必实现 pytest_collection_modifyitems,但默认行为是运行所有测试。