Попытка понять сбои pytest-xdist для параметризованных тестов

У меня есть параметризованные тесты, в которых используется прибор, определенный в conftest. Мои тесты не работают, когда используется pytest-xdist, но проходят со стандартным pytest. Прибор создает каталог, который затем используется тестом, и я получаю ошибки IOErrors.

Исходя из выходных данных, похоже, что два параметризованных теста с ошибкой либо собираются, либо запускаются несколько раз. Обратите внимание на вывод ниже, что test_save_load [obj2] и test_save_load [obj0] не работают, и они появляются дважды, поэтому я предполагаю, что они выполняются несколько раз. Я могу написать тест иначе, чтобы не параметризовать; но было любопытно разобраться в этой проблеме. Мы будем очень благодарны за любые идеи о том, что происходит или как работает pytest-xdist, чтобы помочь понять проблему.

Спасибо!

Вот фрагмент моего вывода:

platform darwin -- Python 2.7.6 -- pytest-2.5.1 -- 
plugins: xdist
[gw0] darwin Python 2.7.6 cwd: /tests/unit_tests
[gw1] darwin Python 2.7.6 cwd: /tests/unit_tests
[gw2] darwin Python 2.7.6 cwd: /tests/unit_tests
[gw3] darwin Python 2.7.6 cwd: /tests/unit_tests
[gw0] Python 2.7.6 (v2.7.6:3a1db0d2747e, Nov 10 2013, 00:42:54)  -- [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
[gw2] Python 2.7.6 (v2.7.6:3a1db0d2747e, Nov 10 2013, 00:42:54)  -- [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
[gw1] Python 2.7.6 (v2.7.6:3a1db0d2747e, Nov 10 2013, 00:42:54)  -- [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
[gw3] Python 2.7.6 (v2.7.6:3a1db0d2747e, Nov 10 2013, 00:42:54)  -- [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
gw0 [30] / gw1 [30] / gw2 [30] / gw3 [30]
scheduling tests via LoadScheduling

test_save_load.py:17: test_exceptions 
test_save_load.py:135: test_save_load[obj0] 
test_save_load.py:45: test_gnome_obj_reference 
test_save_load.py:135: test_save_load[obj2] 
[gw3] PASSED test_save_load.py:17: test_exceptions 
[gw1] PASSED test_save_load.py:45: test_gnome_obj_reference 
test_save_load.py:31: test_reference_object 
[gw3] PASSED test_save_load.py:31: test_reference_object 
test_save_load.py:73: test_savloc_created 
test_save_load.py:135: test_save_load[obj4] 
[gw1] PASSED test_save_load.py:73: test_savloc_created 
test_save_load.py:135: test_save_load[obj5] 
[gw3] PASSED test_save_load.py:135: test_save_load[obj4] 
test_save_load.py:135: test_save_load[obj6] 
[gw2] FAILED test_save_load.py:135: test_save_load[obj2] 
[gw0] FAILED test_save_load.py:135: test_save_load[obj0] 

person jasmine    schedule 13.02.2015    source источник


Ответы (1)


Вывод xdist немного отличается от стандартного pytest, потому что тесты выполняются параллельно. Когда ты видишь:

test_save_load.py:135: test_save_load[obj0]

это означает, что тест был отправлен на выполнение на один из узлов.

Когда ты видишь:

[gw0] FAILED test_save_load.py:135: test_save_load[obj0] 

это просто означает, что тест завершен в узле 0.

При этом ваши тесты выполняются только один раз. Ваше описание сбоя теста, похоже, указывает на то, что тесты совместно используют некоторый дисковый ресурс (например, все они пытаются записывать в одно и то же имя файла).

Вы должны убедиться, что ваши тесты, работающие с файлами, работают в отдельных каталогах, поэтому каждый тест полностью изолирован от других; это можно сделать с помощью фикстуры tmpdir.

Если вы опубликуете дополнительную информацию о самом тесте, возможно, люди смогут дать более конкретный совет.

Ваше здоровье,

person Bruno Oliveira    schedule 14.02.2015
comment
Спасибо @Bruno. Моя первая попытка состояла в том, чтобы создать новый каталог для каждого теста, используя объект запроса pytest: request._pyfuncitem._genid для создания уникального каталога. У Бу все еще была эта ошибка, и он хотел получить разъяснения по поводу того, как работает xdist - спасибо за объяснение. Посмотрю на это еще раз и посмотрю, смогу ли я во всем разобраться. - person jasmine; 15.02.2015
comment
Не забудьте проверить tmpdir приспособление, это может быть то, что вам нужно. - person Bruno Oliveira; 01.03.2015