gpt4 book ai didi

pytest - 使用 pytest 动态控制测试顺序

转载 作者:行者123 更新时间:2023-12-04 23:53:05 26 4
gpt4 key购买 nike

我想使用逻辑来控制我的测试的顺序,这将在它们已经运行时动态重新排序它们。

我的用例是这样的:我正在使用 xdist 并行化我的测试,并且每个测试都使用来自公共(public)和有限池的外部资源。一些测试比其他测试使用更多的资源,因此在任何给定时间,当只有一小部分资源可用时,一些测试拥有运行所需的资源,而另一些则没有。

我想优化资源的使用,所以我想根据当前可用的资源动态选择接下来要运行的测试。我会在收集阶段计算一个最佳排序,但我事先不知道每次测试需要多长时间,所以我无法预测哪些资源何时可用。

我还没有找到使用插件实现此行为的方法,因为收集阶段似乎与运行阶段不同,而且除了收集钩子(Hook)之外,我不知道修改要运行的测试列表的另一种方法。

非常感谢任何建议,无论是实现此方法的方法还是优化资源利用的替代想法。我的替代方法是编写自己的简单测试运行程序,但我不想放弃 pytest 提供的其他功能。

谢谢!

最佳答案

不是对您的问题的完整答案,而是对您在 pytest 上的问题的完整答案,并且几乎没有提示。

要更改 pytest 中测试的顺序(只是 pytest,而不是 pytest-xdist),您可以通过安装此钩子(Hook)包装器来随时更改测试项的顺序:
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:] .在这个例子中,我只是打乱了项目,但是你可以对剩余的特征列表做任何你想做的事情。

请记住:这可能会影响 fixture 的设置和拆卸方式(范围在“功能”之上的那些)。最初,pytest 对测试进行排序,以便他们能够以最有效的方式利用固定装置。具体来说, nextitem参数在内部用于跟踪 fixture 是否应该完成。由于您每次都有效地更改它,因此效果可能无法预测。

使用 pytest-xdist,一切都变得完全不同。您必须阅读 how pytest-dist distributes the tests across the slaves .

首先,每个从站以完全相同的顺序收集所有相同的测试。如果顺序不同,pytest-xdist 会失败。所以你不能在收集时重新排序它们。

其次,主进程将收集到的列表中的测试索引作为下一个要执行的测试发送。因此,集合必须始终保持不变。

三、可以重新定义 pytest_xdist_make_scheduler 钩。有 few sample implementations在 pytest-xdist 本身中。您可以在 schedule() 中定义自己的测试安排逻辑。方法,使用添加/删除的节点和通过相应方法收集的测试。

第四,那太容易了。 .schedule()方法仅在 slave_collectionfinish 中调用从机发送的事件。我很难过这样说,但是您必须一直杀死并重新启动从属进程才能触发此事件,并重新安排剩余的测试。

如您所见,pytest-xdist 的实现将是巨大而复杂的。但我希望这会给你一些提示。

关于pytest - 使用 pytest 动态控制测试顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46953577/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com