为什么pytest-xdist会使我的测试运行速度较慢,而不是更快



我正在移植一个〜2000方法测试套件从鼻子到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本身,pytest-xdist和pytest-django,没有更改。

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

当平行化可能较慢时:

  • 总测试持续时间非常慢(2分钟以下) - 启动pytest工人会增加额外的时间,如果这比福利大...
  • 您的测试已经猪已经猪,例如磁盘或网络等共享有限资源,因此并行运行可能会使它变慢

确保您正确地控制了使用并行性测试的方式,请按照答案,是否有一种方法可以控制Pytest-Xdist如何并行运行测试?要验证您正确使用参数,特别是要注意设置DIST参数的方式。我建议将其设置为--dist=loadfile

如果您的测试还不是很长,则使用XDIST的运行时间较慢,与使用serial相比,最终的运行时很容易,该序列已在https://github.com/pytest--dev/pytest-xdist/essess/346

afaik,没有明确的解决方案,应该由您决定哪些项目受益于XDIST,或者要调整工人的数量以优化结果。

最新更新