在测试运行开始时动态选择pytest测试

时间:2016-06-24 09:13:41

标签: python unit-testing pytest

我正在使用pytest为我的Python应用程序编写单元测试。我在单元测试编写方面的大部分经验来自Javacript框架,例如Jasmine,你可以在下一轮测试中用单词“fit”标记单独的标记测试。或者用“xit'”标记要排除的测试。 '配合'在开发期间我很好,因为我只想运行非常特定的测试子集来减少运行时间并导致输出混乱。 Xit已经使用mark.skip装饰器实现了,但我想要适合。

我如何配置pytest来执行以下操作:

  • 收集所有测试
  • 检查是否有任何用decorator @ pytest.mark.only装饰器标记的测试。如果找到任何,只运行那些测试,否则运行所有测试

我知道我可以选择使用带-m标志的命令行运行测试,但是我想动态检测可运行测试的子集,以便在开发过程中我不会有使用两个不同的命令运行测试,其中一个具有-m标志,而另一个没有标志。

我认为conftest.py可能是添加此逻辑的地方,但我无法找到有关其配置的更多信息。

1 个答案:

答案 0 :(得分:3)

Pytest插件pytest_collection_modifyitems似乎是你需要的。 (将以下代码放入conftest.py

def pytest_collection_modifyitems(session, config, items):
    """ called after collection has been performed, may filter or re-order
    the items in-place."""

    found_only_marker = False
    for item in items.copy():
        if item.get_marker('only'):
            if not found_only_marker:
                items.clear()
                found_only_marker = True
            items.append(item)

列表items是收集的测试。

注意: list.copy仅适用于python3,如果您使用的是python2,请参阅:How to clone or copy a list?

这个想法很简单:

收集所有测试(项目)后,只需检查任何测试中是否存在“仅”标记。如果是,请清除列表items并仅添加标记为only的测试,否则,保留项目原样。