我想使用逻辑来控制测试的顺序,当测试已经运行时,逻辑会动态地对它们进行重新排序。
我的用例是这样的:我使用xdist并行化我的测试,每个测试都使用来自一个公共且有限的池的外部资源。有些测试比其他测试使用更多的资源,因此在任何给定的时间,当只有一小部分资源可用时,一些测试都有运行所需的资源,而另一些则没有。
我想优化资源的使用,所以我想根据当前可用的资源动态选择下一次运行哪个测试。我会在收集阶段计算最佳排序,但我事先不知道每次测试需要多长时间,所以我无法预测什么时候可以使用哪些资源。
我还没有找到用插件实现这种行为的方法,因为收集阶段似乎与运行阶段不同,除了收集挂钩之外,我不知道还有其他方法可以修改要运行的测试列表。
非常感谢任何建议,无论是实现这一点的方法,还是优化资源利用率的替代想法。我的选择是编写我自己的简单的测试运行程序,但我不想放弃pytest提供的其余功能。
谢谢!
这并不是你问题的完整答案,而是关于pytest的问题,还有一些提示。
要更改pytest中测试的顺序(只是pytest,而不是pytest-xlist),您可以通过安装以下钩子包装器来随时更改测试项的顺序:
conftest.py
:
import pytest
import random
random.seed()
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_protocol(item, nextitem):
yield
idx = item.session.items.index(item)
remaining = item.session.items[idx+1:]
random.shuffle(remaining)
item.session.items[idx+1:] = remaining
改变已经执行的内容是没有意义的,只改变剩下的内容——因此,[idx+1:]
。在这个例子中,我只是打乱项目,但您可以对剩余功能的列表做任何您想做的事情。
请记住:这可能会影响固定装置的设置方式;teardown‘ed("function"以上范围的)。最初,pytest命令测试,以便他们能够以最有效的方式使用固定装置。具体来说,nextitem
参数在内部用于跟踪夹具是否应该完成。由于你每次都能有效地更改它,所以效果可能是不可预测的。
使用pytest xdist,一切都会完全不同。您必须阅读pytest-dist如何在从属服务器之间分配测试。
首先,每个从设备都以完全相同的顺序收集所有相同的测试。如果顺序不同,pytest xdist将失败。所以你不能在集合中重新排序。
其次,主进程发送收集列表中的测试索引,作为下一个要执行的测试。因此,集合必须始终保持不变。
第三,您可以重新定义pytest_xdist_make_scheduler
钩子。pytest xdist本身中几乎没有示例实现。您可以在schedule()
方法中定义自己的测试调度逻辑,使用添加/删除的节点和通过相应方法收集的测试。
第四,这太容易了。.schedule()
方法仅在从机发送的slave_collectionfinish
事件中调用。我很难过这么说,但你必须一直杀死并重新启动从属进程才能触发此事件,并重新安排剩余的测试。
正如您所看到的,pytest-xlist的实现将是巨大的&复杂的但我希望这能给你一些线索。