我有不同的测试套件。
有正常测试,有慢速测试,还有后端测试(以及任意更多的“特殊”测试,除非另有说明,否则可能需要跳过)。
除非通过了 --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)
谢谢!
答案 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)
默认情况下,这将跳过所有标记为 slow
或 backend
的测试。如果添加命令行选项 --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
,但默认行为是运行所有测试。