不是对您的问题的完整答案,而是对您在 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
改变已经执行的内容是没有意义的,而只改变剩下的——因此,[idx+1:]
. 在这个例子中,我只是打乱了项目,但是你可以对剩余的特征列表做任何你想做的事情。
请记住:这可能会影响夹具的设置和拆卸方式(范围在“功能”之上的那些)。最初,pytest 对测试进行排序,以便他们能够以最有效的方式利用固定装置。具体来说,该nextitem
参数在内部用于跟踪夹具是否应该完成。由于您每次都有效地更改它,因此效果可能无法预测。
使用 pytest-xdist,一切都变得完全不同。您必须阅读pytest-dist 如何在 slaves 之间分发测试。
首先,每个从站以完全相同的顺序收集所有相同的测试。如果顺序不同,pytest-xdist 会失败。所以你不能在收集时重新排序它们。
其次,主进程将收集到的列表中的测试索引作为下一个要执行的测试发送。因此,集合必须始终保持不变。
第三,你可以重新定义pytest_xdist_make_scheduler
钩子。pytest -xdist 本身的示例实现很少。schedule()
您可以使用添加/删除的节点以及通过相应方法收集的测试来定义自己的方法来安排测试的逻辑。
第四,那太容易了。该.schedule()
方法仅在slave_collectionfinish
从从站发送的事件中调用。我很难过这样说,但是您必须一直杀死并重新启动从属进程才能触发此事件,并重新安排剩余的测试。
如您所见,pytest-xdist 的实现将是巨大而复杂的。但我希望这会给你一些提示。