我想使用逻辑来控制测试的顺序,这些逻辑将在测试已经运行时即时对其进行排序。
我的用例是这样的:我将我的测试与xdist并行化,并且每个测试都使用来自公共池和有限池的外部资源。一些测试比其他测试使用更多的资源,因此在任何给定的时间,当只有一部分资源可用时,某些测试具有运行所需的资源,而其他则不需要。
我想优化资源的使用,因此我想根据当前可用资源动态选择下一步运行的测试。我会在收集阶段计算出最佳排序,但我事先不知道每个测试将花费多长时间,因此我无法预测何时可以使用哪些资源。
我没有找到一种使用插件来实现此行为的方法,因为收集阶段似乎与运行阶段不同,并且我不知道另一种方法来修改测试列表以运行除收集挂钩之外的其他方法。
非常感谢任何建议,无论是实施此建议的方法还是可以优化资源利用的替代方案。我的选择是编写自己的简单测试运行程序,但我不想放弃pytest提供的其余功能。
谢谢!
并不是您问题的完整答案,而是关于pytest的问题以及一些提示。
要更改pytest中的测试顺序(只是pytest,而不是pytest-xdist),您可以通过安装以下钩子包装程序随时更改测试项的顺序:
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
Run Code Online (Sandbox Code Playgroud)
更改已经执行的内容没有任何意义,而仅更改剩余的内容,因此[idx+1:]。在此示例中,我只是对项目进行了混洗,但是您可以对其余功能列表进行任何操作。
请记住:这会影响固定装置的设置和拆卸方式(“功能”上方的范围)。最初,pytest订购测试,以便他们可以以最有效的方式利用固定装置。特别是,该nextitem参数在内部用于跟踪夹具是否应该完成。由于您每次都有效地更改它,因此效果可能无法预测。
使用pytest-xdist,这一切完全不同。您必须阅读pytest-dist如何在从站之间分布测试。
首先,每个从站都以相同的顺序收集所有相同的测试。如果顺序不同,则pytest-xdist将失败。因此,您无法在收藏时重新排序。
其次,主进程在该收集列表中发送测试索引,作为下一个要执行的测试。因此,集合必须始终保持不变。
第三,您可以重新定义pytest_xdist_make_scheduler挂钩。有几样实现在pytest-xdist本身。您可以schedule()使用添加/删除的节点以及通过相应方法收集的测试来定义自己的方法,以按计划安排测试的逻辑。
第四,那太容易了。.schedule()仅在slave_collectionfinish从站发送事件时才调用该方法。我很伤心地说,但你必须杀死并重新启动从处理所有的时间来触发该事件,并重新安排剩下的测试。
如您所见,pytest-xdist的实现将是巨大而复杂的。但我希望这会给您一些提示,以供您参考。
| 归档时间: |
|
| 查看次数: |
699 次 |
| 最近记录: |