py.test с xdist пропускает все тесты с -n › 1

Мои тесты выполняются за 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 секунды было бы изумительным ускорением… хотя я думаю, что никакие тесты не выполняются — некоторые точки появятся, не так ли? Однако, если я выполняю «параллельный» запуск только с одним процессом…

$ 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 ===============================

person liori    schedule 22.09.2014    source источник
comment
Запуск py.test -n4 -vv дает что-нибудь полезное?   -  person Bruno Oliveira    schedule 22.09.2014
comment
@BrunoOliveira: Обновлено.   -  person liori    schedule 23.09.2014


Ответы (2)


Я не использовал рандомизированные значения для параметризации моих тестов, как предложил Марек. Однако его предложение подтолкнуло меня к проверке другой гипотезы, которая кажется верной: 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 предложение выполните xdist параметризацию сортировки для сравнения, чтобы избежать этой проблемы.

person liori    schedule 23.09.2014

Для меня похоже на аналогичную проблему, которую я заметил :)

Ваши тесты как-то случайным образом параметризованы? Если да, взгляните на py .test с xdist не выполняет тесты, параметризованные случайными значениями

И в Вашем, и в моем случае это на самом деле не пропуск (если он действительно пропущен, то у Вас будет пропущено X в резюме)

person Marek    schedule 23.09.2014
comment
Что ж, я явно не использовал random в своих тестах, но виновником, похоже, является недетерминированный порядок тестов на этапе сбора… спасибо за подсказку. - person liori; 23.09.2014