2014-09-21 28 views
3

有没有人注意到pytest和xdist的下列奇怪行为。py.test与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

Addit有理注:

对于某些旧版本(xdist 1.8和pytest 2.4.X或2.5.X不完全记得了)的xdist被提前

assert collection == col 

感谢停在声明中dsession.py任何帮助如何解决它或至少解决它:)

+0

也许一些代码加载你的.py文件超过一次,然后它不是从第一负载找到测试参数(因为它们是随机的不同)? – 2014-09-21 12:32:36

+0

@ArminRigo从我的调查看来,每个子进程都在收集测试,然后xdist正在检查每个子进程是否收集到相同的一组测试(在随机参数的情况下,我们为每个子进程获得不同的参数集) – Marek 2014-09-22 18:06:18

回答

1

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

+0

嘿谢谢提示。我已经为给定的例子做了一个解决方法。它可能有点肮脏(例如,似乎所有的测试都是采用相同的一组参数收集的:(并且在测试中,实际的参数值是随机选择的)。 – Marek 2014-09-23 06:44:56

1

因此,这里是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 with xdist is not executing tests parametrized with random values