我正在移植一个〜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,或者要调整工人的数量以优化结果。