有没有人注意到pytest和xdist的以下奇怪行为。
当尝试运行使用某些随机选择的值进行参数化的测试时,测试实际上不会运行。如果不使用 xdist,则执行相同的测试没有任何问题。
以下代码可用于重现此问题。
import pytest
import random
PARAMS_NUMBER = 3
PARAMS = []
for i in range(PARAMS_NUMBER):
PARAMS.append(random.randrange(0, 1000))
@pytest.mark.parametrize('rand_par', PARAMS)
def test_random_param(rand_par):
assert 500 > rand_par
没有xdists,它可以正常工作。
使用 xdist 时,根本不执行任何测试,输出如下
============================= test session starts =============================
platform win32 -- Python 2.7.3 -- py-1.4.24 -- pytest-2.6.2
plugins: xdist
gw0 [3] / gw1 [3] / gw2 [3] / gw3 [3]
scheduling tests via LoadScheduling
============================== in 1.93 seconds ===============================
我正在使用的版本:
- 蟒蛇 2.7.3
- pytest 2.6.2
- pytest-xdist 1.11
附加说明:
对于一些旧版本(xdist 1.8 和 pytest 2.4.X 或 2.5.X 不记得确切了(,xdist 在断言时停止了 dsession.py
assert collection == col
提前感谢您提供任何帮助,如何解决它或至少解决它:)
所以这是 Armins 提示之后的代码:)
import pytest
import random
PARAMS_NUMBER = 3
PARAMS = []
for i in range(PARAMS_NUMBER):
PARAMS.append(1000)
@pytest.mark.parametrize('rand_par', PARAMS)
def test_random_param(rand_par):
par_val = random.randrange(0, rand_par)
assert 500 > par_val
它使用随机选择的值运行测试3次。
更新:我为 xdist 项目创建了一个问题,并在为用户返回合理信息的含义中解决了这个问题。
更多信息可以在这里找到 py.test 与 xdist 不执行使用随机值参数化的测试
解决方法是使用可重现(但无意义(的值进行参数化,例如 0 到 PARAMS_NUMBER-1
之间的所有数字。 然后,每个测试都可以在运行时单独选择一个随机值。 为了知道它选择了哪个随机值(在崩溃时重现(,每个测试都应该首先打印它。 至少这是我对一些非 xdist 测试所做的;我希望它也适用于 xdist,即打印被正确传播到父进程,并且仅在单个测试失败时显示(或使用 -s 运行 py.test(。