在测试套件结束时运行缓慢的 Pytest 命令

Joh*_*etz 4 python pytest

假设我有以下 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现在将重新使用这些物品。

  • 我必须将“by_slow_marker”更改为“return 1 if item.get_closest_marker('slow') is None else 0”才能使其正常工作。 (2认同)