首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么pytest-xdist会让我的测试运行得更慢,而不是更快?

为什么pytest-xdist会让我的测试运行得更慢,而不是更快?
EN

Stack Overflow用户
提问于 2017-02-17 10:08:16
回答 3查看 1.3K关注 0票数 17

我将一个大约2000的方法测试套件从nose移植到pytest,因为django-nose不太支持并行化。把鼻子换成pytest似乎效果很好,在pytest.ini中添加了python_files之后,它几乎找到了我们所有的测试。

最大的缺点是,当我使用-n 4运行时,测试套件会比没有-n标志时变得更慢。在整个套件的大约10%的子集上运行,它似乎有大约20%-30%的平稳减速,尽管我采取的计时相当嘈杂。这对于开销来说是有一定意义的,但是无论我选择多少进程,计时都不会下降。

使用--durations=20运行显示,每个设置阶段每个进程都需要多花几秒钟的时间,并且每个其他测试都会稍微变慢。

使用-vvv在测试运行时列出测试,输出几乎完全序列化:

代码语言:javascript
复制
api/tests/VERSION_NUMBER.py::ATestCase::test_forbidden_methods <- api/testcases.py
[gw1] PASSED api/tests/VERSION_NUMBER.py::ATestCase::test_access_token <- api/testcases.py
api/tests/VERSION_NUMBER.py::ATestCase::test_create <- api/testcases.py
[gw1] PASSED api/tests/VERSION_NUMBER.py::ATestCase::test_create <- api/testcases.py
api/tests/VERSION_NUMBER.py::ATestCase::test_delete <- api/testcases.py
[gw1] PASSED api/tests/VERSION_NUMBER.py::ATestCase::test_delete <- api/testcases.py
api/tests/VERSION_NUMBER.py::ATestCase::test_patch <- api/testcases.py
[gw1] PASSED api/tests/VERSION_NUMBER.py::ATestCase::test_patch <- api/testcases.py
api/tests/VERSION_NUMBER.py::ATestCase::test_put <- api/testcases.py
[gw1] PASSED api/tests/VERSION_NUMBER.py::ATestCase::test_put <- api/testcases.py
api/tests/VERSION_NUMBER.py::ATestCase::test_retrieve <- api/testcases.py
[gw1] PASSED api/tests/VERSION_NUMBER.py::ATestCase::test_retrieve <- api/testcases.py
api/tests/VERSION_NUMBER.py::BTestCase::test_access_token <- api/testcases.py
[gw0] PASSED api/tests/VERSION_NUMBER.py::ATestCase::test_forbidden_methods <- api/testcases.py
api/tests/VERSION_NUMBER.py::ATestCase::test_list <- api/testcases.py
[gw0] PASSED api/tests/VERSION_NUMBER.py::ATestCase::test_list <- api/testcases.py
api/tests/VERSION_NUMBER.py::BTestCase::test_delete <- api/testcases.py
[gw1] PASSED api/tests/VERSION_NUMBER.py::BTestCase::test_access_token <- api/testcases.py
api/tests/VERSION_NUMBER.py::BTestCase::test_create <- api/testcases.py
[gw1] PASSED api/tests/VERSION_NUMBER.py::BTestCase::test_create <- api/testcases.py
api/tests/VERSION_NUMBER.py::BTestCase::test_list <- api/testcases.py
[gw1] PASSED api/tests/VERSION_NUMBER.py::BTestCase::test_list <- api/testcases.py
api/tests/VERSION_NUMBER.py::BTestCase::test_patch <- api/testcases.py
[gw1] PASSED api/tests/VERSION_NUMBER.py::BTestCase::test_patch <- api/testcases.py
api/tests/VERSION_NUMBER.py::BTestCase::test_put <- api/testcases.py
[gw1] PASSED api/tests/VERSION_NUMBER.py::BTestCase::test_put <- api/testcases.py
[gw0] PASSED api/tests/VERSION_NUMBER.py::BTestCase::test_delete <- api/testcases.py
api/tests/VERSION_NUMBER.py::BTestCase::test_forbidden_methods <- api/testcases.py
api/tests/VERSION_NUMBER.py::BTestCase::test_retrieve <- api/testcases.py
[gw0] PASSED api/tests/VERSION_NUMBER.py::BTestCase::test_forbidden_methods <- api/testcases.py
[gw1] PASSED api/tests/VERSION_NUMBER.py::BTestCase::test_retrieve <- api/testcases.py

除了少数例外,对于整个日志,几乎总是“启动一个测试,从一个工人那里获得通过”。这让我相信有什么东西在序列化测试,但我对什么感到困惑。

我试着禁用了除pytest本身、pytest-xdist和pytest-django之外的所有pytest插件,但没有任何更改。

EN

回答 3

Stack Overflow用户

发布于 2020-08-30 15:09:46

阅读https://github.com/pytest-dev/pytest-xdist/blob/master/OVERVIEW.md,您就会猜到为什么它在特定情况下会相当慢。

当并行化时可能会更慢:

  • 总测试持续时间非常慢(不到2分钟)-如果这比benefit...
  • your测试占用共享的有限资源(如磁盘或网络)的时间更长,则会增加额外的时间,因此并行运行可能会使其速度变慢
票数 2
EN

Stack Overflow用户

发布于 2021-01-17 18:59:47

确保你正确地控制了测试并行性的使用方式,遵循Is there a way to control how pytest-xdist runs tests in parallel?上的答案来验证你确实正确地使用了参数,特别是注意dist参数的设置方式。我建议将其设置为--dist=loadfile

票数 0
EN

Stack Overflow用户

发布于 2021-07-07 16:40:56

如果您的测试还不是很长,那么使用xdist的运行时比使用串行的运行时要慢很容易,这一点在https://github.com/pytest-dev/pytest-xdist/issues/346上是已知的并有文档记录。

AFAIK,没有明确的解决方案,应该由您决定哪个项目从xdist中受益,或者调整工作人员的数量以优化结果。

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

https://stackoverflow.com/questions/42288175

复制
相关文章

相似问题

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