繁体   English   中英

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

[英]Select pytest tests dynamically at the beginning of test run

我正在使用pytest为我的Python应用程序编写单元测试。 我在单元测试编写方面的大部分经验都来自Javacript框架(例如Jasmine),您可以在其中将单个标记测试标记为在下一个测试回合中使用单词“ fit”运行,或者将标记测试排除为单词“ xit”。 当我只想运行非常具体的测试子集以减少运行时间并导致结果输出混乱时,“ fit”在开发过程中很好。 Xit已经用mark.skip装饰器实现,但我想适合。

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

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

我知道我可以使用-m标志选择要在命令行中运行的测试,但是我想动态地检测可运行测试的子集,因此在开发过程中,我不必使用两个不同的命令来运行测试。具有-m标志,其他不具有该标志。

我想conftest.py可能是添加此逻辑的地方,但是我找不到关于它的配置的太多信息。

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,请参考: 如何克隆或复制列表?

这个想法很简单:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM