假设我有以下 pytest 脚本:
import pytest
def test_one():
pass
def test_two():
pass
@pytest.mark.slow
def test_three():
pass
Run Code Online (Sandbox Code Playgroud)
是否有一个命令可以用来运行slow最后带有标记的所有测试?我知道我可以使用两个 pytest 命令来完成此操作,但使用单个命令来完成此操作会很棒:
pytest -v -m "not slow"
# test_markers.py::test_one PASSED
# test_markers.py::test_two PASSED
pytest -v -m slow
# test_markers.py::test_three PASSED
Run Code Online (Sandbox Code Playgroud)
hoe*_*ing 11
您可以对收集的测试添加自定义排序,并将带有标记的项目放在slow最后。将以下代码放入conftest.py项目或测试根目录的文件中:
from _pytest.mark import Mark
empty_mark = Mark('', [], {})
def by_slow_marker(item):
return item.get_closest_marker('slow', default=empty_mark)
def pytest_collection_modifyitems(items):
items.sort(key=by_slow_marker, reverse=False)
Run Code Online (Sandbox Code Playgroud)
这会将具有标记的项目放置slow在收集的测试序列的末尾。如果您想打开和关闭此功能,请添加自定义命令行标志:
def pytest_addoption(parser):
parser.addoption('--slow-last', action='store_true', default=False)
def pytest_collection_modifyitems(items, config):
if config.getoption('--slow-last'):
items.sort(key=by_slow_marker, reverse=True)
Run Code Online (Sandbox Code Playgroud)
跑步pytest --slow-last现在将重新使用这些物品。