我的测试需要2分钟才能运行:
$ py.test
================================================= test session starts =================================================
platform linux2 -- Python 2.7.8 -- py-1.4.24 -- pytest-2.5.2
plugins: cov, xdist
collected 2249 items
«lots of file names»
====================================== 2242 passed, 7 skipped in 120.01 seconds =======================================
...所以我想我会尝试xdist
插件并行运行它们。所以,我做了:
$ pip install pytest-xdist
$ py.test -n 2
================================================= test session starts =================================================
platform linux2 -- Python 2.7.8 -- py-1.4.24 -- pytest-2.5.2
plugins: cov, xdist
gw0 [2249] / gw1 [2249]
scheduling tests via LoadScheduling
================================================== in 2.65 seconds ===================================================
2秒将是一个奇妙的加速...虽然我认为没有测试运行 - 一些点会出现,不是吗?但是,如果我做" parallel"只运行一个过程......
$ py.test -n 1
================================================= test session starts =================================================
platform linux2 -- Python 2.7.8 -- py-1.4.24 -- pytest-2.5.2
plugins: cov, xdist
gw0 [2249]
scheduling tests via LoadScheduling
....«lots and lots of dots»........
====================================== 2242 passed, 7 skipped in 122.27 seconds =======================================
......然后时间恢复正常。
如何让xdist
插件实际运行测试?
更新:
布鲁诺奥利维拉的回答问题:
$ py.test -n 4 -vv
============================= test session starts ==============================
platform linux2 -- Python 2.7.8 -- py-1.4.24 -- pytest-2.5.2 -- /home/liori/proj/.ve/bin/python2
plugins: cov, xdist
[gw0] linux2 Python 2.7.8 cwd: /home/liori/proj/src
[gw1] linux2 Python 2.7.8 cwd: /home/liori/proj/src
[gw2] linux2 Python 2.7.8 cwd: /home/liori/proj/src
[gw3] linux2 Python 2.7.8 cwd: /home/liori/proj/src
[gw0] Python 2.7.8 (default, Aug 23 2014, 21:00:50) -- [GCC 4.9.1]
[gw1] Python 2.7.8 (default, Aug 23 2014, 21:00:50) -- [GCC 4.9.1]
[gw2] Python 2.7.8 (default, Aug 23 2014, 21:00:50) -- [GCC 4.9.1]
[gw3] Python 2.7.8 (default, Aug 23 2014, 21:00:50) -- [GCC 4.9.1]
gw0 [2254] / gw1 [2254] / gw2 [2254] / gw3 [2254]
scheduling tests via LoadScheduling
=============================== in 4.63 seconds ===============================
答案 0 :(得分:1)
对于我来说,我看起来像是类似的问题:)
您的测试是否以某种方式随机参数化? 如果是,请查看py.test with xdist is not executing tests parametrized with random values
在你和我的情况下它实际上都没有跳过(如果它真的被跳过那么你会在摘要中跳过X)
答案 1 :(得分:1)
我没有使用随机值来参数化我的测试,正如Marek所建议的那样。然而,他的建议促使我去检查另一个假设,这似乎是正确的:xdist
要求测试的参数化始终以相同的顺序生成。
在我的特定情况下,我通过迭代set
个字符串来通过参数化生成。但是,此迭代取决于字符串哈希的特定值,并且这些值可能对于每个进程都不同。因此,虽然我总是生成完全相同的参数化,但它们的顺序不同。
一个显示问题的简单测试用例:
import pytest
my_names = {'john', 'kate', 'alfred', 'paul', 'mary'}
@pytest.mark.parametrize('name', list(my_names), ids=list(my_names))
def test_is_name_short(name):
assert len(name) < 7
使用PYTHONHASHSEED=random py.test -n 4
运行以确保为字符串触发随机哈希。
一个简单的解决方法是对测试强制执行特定的排序,例如:通过一些参数对它们进行排序:
my_names = sorted(my_names)
我已经向py.test的bugtracker提交了一个建议make xdist
sort parametrizations进行比较以避免这个问题。