我将一个大约2000的方法测试套件从nose移植到pytest,因为django-nose不太支持并行化。把鼻子换成pytest似乎效果很好,在pytest.ini中添加了python_files之后,它几乎找到了我们所有的测试。
最大的缺点是,当我使用-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插件,但没有任何更改。
发布于 2020-08-30 15:09:46
阅读https://github.com/pytest-dev/pytest-xdist/blob/master/OVERVIEW.md,您就会猜到为什么它在特定情况下会相当慢。
当并行化时可能会更慢:
发布于 2021-01-17 18:59:47
确保你正确地控制了测试并行性的使用方式,遵循Is there a way to control how pytest-xdist runs tests in parallel?上的答案来验证你确实正确地使用了参数,特别是注意dist参数的设置方式。我建议将其设置为--dist=loadfile。
发布于 2021-07-07 16:40:56
如果您的测试还不是很长,那么使用xdist的运行时比使用串行的运行时要慢很容易,这一点在https://github.com/pytest-dev/pytest-xdist/issues/346上是已知的并有文档记录。
AFAIK,没有明确的解决方案,应该由您决定哪个项目从xdist中受益,或者调整工作人员的数量以优化结果。
https://stackoverflow.com/questions/42288175
复制相似问题