py.test с xdist не выполняет тесты, параметризованные случайными значениями

Кто-нибудь заметил следующее странное поведение для 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
  • тест 2.6.2
  • pytest-xdist 1.11

Дополнительное примечание:

В некоторых более старых версиях (xdist 1.8 и pytest 2.4.X или 2.5.X точно не помню) xdist останавливался при утверждении в dsession.py

assert collection == col

Заранее спасибо за любую помощь, как решить эту проблему или, по крайней мере, обойти ее :)


person Marek    schedule 21.09.2014    source источник
comment
Может быть, какой-то код загружает ваш файл .py более одного раза, а затем не находит параметры теста с первой загрузки (потому что они случайным образом различаются)?   -  person Armin Rigo    schedule 21.09.2014
comment
@ArminRigo из того, что я исследовал, кажется, что каждый подпроцесс собирает тесты, а затем xdist проверяет, собрал ли каждый подпроцесс один и тот же набор тестов (в случае случайных параметров мы получаем разные наборы параметров для каждого подпроцесса)   -  person Marek    schedule 22.09.2014


Ответы (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 с xdist не выполняет тесты, параметризованные случайными значениями

person Marek    schedule 23.09.2014

Обходным путем может быть параметризация воспроизводимыми (но бессмысленными) значениями, такими как все числа от 0 до PARAMS_NUMBER-1. Затем каждый тест может индивидуально выбирать случайное значение при запуске. Чтобы узнать, какое случайное значение он выбрал (чтобы воспроизвести в случае сбоя), каждый тест должен сначала напечатать его. По крайней мере, это то, что я делаю с некоторыми тестами, отличными от xdist; Я надеюсь, что это работает и с xdist, то есть отпечатки правильно распространяются на родительский процесс и отображаются только в случае сбоя отдельного теста (или py.test запускается с -s).

person Armin Rigo    schedule 23.09.2014
comment
Эй, спасибо за подсказку. Я сделал обходной путь для данного примера. Это может быть немного грязно (например, кажется, что все тесты были собраны с одним и тем же набором параметров :( а внутри теста случайным образом выбираются реальные значения параметров). - person Marek; 23.09.2014