首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用pytest动态控制测试顺序

用pytest动态控制测试顺序
EN

Stack Overflow用户
提问于 2017-10-26 11:50:33
回答 1查看 2.2K关注 0票数 5

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

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

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

我还没有找到用插件实现此行为的方法,因为集合阶段似乎与运行阶段不同,而且我也不知道如何修改测试列表以运行集合挂钩以外的其他测试。

将非常感谢任何建议,无论是实施这一方法,还是一种能优化资源利用的替代想法。我的选择是编写我自己的简单测试运行程序,但我不想放弃pytest提供的其余内容。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-28 19:38:56

对你的问题不是一个完整的答案,而是对你关于pytest的问题的回答,而且很少有提示。

要更改pytest中测试的顺序(只是pytest,而不是pytest-xdist),只需安装这个钩子包装器,就可以更改测试项的顺序:

conftest.py

代码语言:javascript
复制
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:]。在本例中,我只是对项目进行洗牌,但是您可以使用剩余功能的列表来做您想做的任何事情。

请记住:这可能会影响如何设置夹具‘’ed&teardown‘’ed(那些范围高于‘功能’)。最初,pytest对测试进行排序,以便它们能够以最有效的方式使用这些固定装置。具体来说,nextitem参数在内部用于跟踪夹具是否应该完成。因为您每次都有效地更改了它,所以效果可能是不可预测的。

有了pytest-xdist,一切就完全不同了。你必须在pytest-dist如何在奴隶之间分配测试?上阅读。

首先,每个奴隶收集所有相同的测试,并完全按照相同的顺序。如果订单不同,pytest-xdist就会失败。所以您不能在收集时重新订购它们。

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

第三,您可以重新定义pytest_xdist_make_scheduler挂钩。在pytest-xdist本身就有很少有示例实现。您可以使用添加/删除的节点以及通过相应方法收集的测试来定义自己在schedule()方法中调度测试的逻辑。

第四,这太容易了。.schedule()方法仅在从中发送的slave_collectionfinish事件中调用。我很遗憾地说了这一点,但是您必须始终终止并重新启动从进程来触发此事件,并重新调度剩余的测试。

如您所见,pytest-xdist的实现将是庞大而复杂的。但我希望这能给你一些线索。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46953577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档