【问题标题】:Why does pytest-xdist make my tests run slower, not faster?为什么 pytest-xdist 让我的测试运行得更慢,而不是更快?
【发布时间】:2017-02-17 02:08:16
【问题描述】:

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

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

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

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

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 插件,但没有任何变化。

【问题讨论】:

  • 我看到了类似的问题。在您的案例中,您是否能够深入了解这个问题?
  • 使用--trace-config 标志运行测试。它将显示固定装置的设置。 xdist 仅在测试独立时加速测试执行。从外观上看,您的测试似乎取决于其他测试的执行。如果您在测试之间共享数据或对象,请查看它们。更改用户定义的固定装置的范围也应该给你更多的洞察力。

标签: pytest pytest-django


【解决方案1】:

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

当并行化可能会更慢:

  • 总测试持续时间很慢(不到 2 分钟) - 引导 pytest 工作人员会增加额外的时间,如果这大于好处...
  • 您的测试已经占用了磁盘或网络等共享有限资源,因此并行运行可能会使其变慢

【讨论】:

    【解决方案2】:

    确保你正确控制了测试并行度的使用方式,按照Is there a way to control how pytest-xdist runs tests in parallel?上的回答来验证你是否正确地使用了参数,尤其要注意 dist 参数的设置方式。我建议将其设置为--dist=loadfile

    【讨论】:

      【解决方案3】:

      如果您的测试还不是很长,使用 xdist 很容易导致运行时间比使用串行更慢,这在 https://github.com/pytest-dev/pytest-xdist/issues/346 上已知并记录在案

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

      【讨论】:

        猜你喜欢
        • 2011-04-22
        • 2012-02-15
        • 1970-01-01
        • 1970-01-01
        • 2023-01-07
        • 2015-07-21
        • 2012-09-22
        • 2015-01-16
        • 1970-01-01
        相关资源
        最近更新 更多