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

标签 pytest pytest-django

我正在从 nose 移植一个 ~2000 方法测试套件至 pytest因为 django-nose没有很好地支持并行化。将 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

除了少数异常(exception),整个日志几乎总是“开始测试,从工作人员那里获得通过”。这让我相信有些东西正在序列化测试,但我对什么感到困惑。

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

最佳答案

阅读 https://github.com/pytest-dev/pytest-xdist/blob/master/OVERVIEW.md你会猜测为什么在特定情况下它会慢得多。
并行化时可能会更慢:

  • 总测试时间很慢(不到 2 分钟)-引导 pytest 工作人员会增加额外的时间,如果这大于 yield ...
  • 您的测试已经占用了共享的有限资源,例如磁盘或网络,因此并行运行可能会使速度变慢
  • 关于pytest - 为什么 pytest-xdist 使我的测试运行得更慢,而不是更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42288175/

    相关文章:

    python - Pytest Django 发现 Fixture 但在运行时显示 "Not Found"

    python - 使用 pytest-django 客户端的 Django 响应上下文始终为 None

    python - "Apps aren' t 已加载”尝试运行 pytest-django 时

    python - 从 Python 2.7 中的父目录导入模块

    python - 你如何使用 Hypothesis @given 参数化一个 pytest 类?

    python-3.x - Pytest assert_has_calls 用法

    pytest - 使用标记收集 py.test 测试信息

    python - 如何使用 pytest 在 Django 中测试重定向?

    python - 连接到测试数据库的 Pytest 错误

    python - 具有pytest-dependency的文件之间的依赖关系?