4

有人注意到 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

提前感谢任何帮助如何解决它或至少解决它:)

4

2 回答 2

2

所以这是阿明斯提示后的代码:)

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 with xdist is not execution tests parametrized with random values

于 2014-09-23T06:59:33.733 回答
1

一种解决方法是使用可重现(但无意义)的值进行参数化,例如 0 和PARAMS_NUMBER-1. 然后每个测试在运行时可以单独选择一个随机值。为了知道它选择了哪个随机值(在崩溃的情况下重现),每个测试都应该首先打印它。至少这就是我对一些非 xdist 测试所做的;我希望它也适用于 xdist,即打印正确传播到父进程,并且仅在单个测试失败(或 py.test 使用 -s 运行)时显示。

于 2014-09-23T06:30:34.317 回答