Ошибка обнаружения теста, когда тесты в разных каталогах называются одинаковыми

Используя py.test, два теста, называемых одинаковыми в разных каталогах, приводят к ошибке py.test. Почему это? Как я могу изменить это без переименования всех тестов?

Чтобы дублировать do:

; cd /var/tmp/my_test_module
; mkdir -p ook/test           
; mkdir -p eek/test
; touch ook/test/test_proxy.py
; touch eek/test/test_proxy.py
; py.test
============================= test session starts ==============================
platform linux2 -- Python 2.7.3 -- pytest-2.2.4
collected 0 items / 1 errors 

==================================== ERRORS ====================================
___________________ ERROR collecting ook/test/test_proxy.py ____________________
import file mismatch:
imported module 'test_proxy' has this __file__ attribute:
  /home/ygolanski/code/junk/python/mymodule/eek/test/test_proxy.py
which is not the same as the test file we want to collect:
  /home/ygolanski/code/junk/python/mymodule/ook/test/test_proxy.py
HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules
=========================== 1 error in 0.01 seconds ============================

Ответ 1

Помещение __init__.py - один из способов разрешения конфликта. В отличие от носа, текущий pytest не пытается выгрузить тестовые модули, чтобы импортировать тестовые модули с тем же именем импорта. Раньше я думал, что делать это автоматически не импортирующим немного волшебно, и это может испортить ожидания людей от того, что делает механизм импорта; иногда люди полагаются на глобальное состояние тестового модуля, и при автоматической выгрузке вы теряете его (тестовый модуль, импортирующий из другого тестового модуля, может затем сделать неожиданные вещи). Но, возможно, это не практическая проблема, и, таким образом, Pytest может добавить подобный взлом...

Ответ 2

Это актуальная функция py.test. Вы можете найти причину такого поведения, изложенную в pytest.org - Хорошие методы интеграции - Выбор правил тестового макета/импорта:

  • избегать __init__.py файлов в тестовых каталогах. Таким образом, ваши тесты могут легко запускаться против установленной версии mypkg, независимо от того, установлен ли установленный пакет тестов или нет.

В качестве рекомендуемого рабочего процесса работы с py.test: установите пакет под разработку pip install -e, затем проверьте его.

Из-за этого я сам выбираю уникальные имена тестов в соглашении по конфигурации. Это также гарантирует, что вы не получите неоднозначные имена тестов в результатах тестового прогона.

Если вам нужно сохранить имена тестов и не заботиться о вышеупомянутых функциях, вы должны быть в порядке с помещением __init__.py.

Ответ 3

У меня была та же ошибка, но решение не имело ничего общего ни с файлами инициализации, ни с именем в тестовых файлах. У меня были разные версии Python на моем MacBook и в контейнере Docker. Я запустил тесты один раз в bash из macbook в корне проекта, а не в bash контейнера.

Решение состояло в том, чтобы удалить неправильно созданные файлы, запустив (из bash контейнера):

find -name '*.pyc' -delete
find -name __pycache__ -delete

Затем снова запустите тест (все еще из bash контейнера), и все заработало просто отлично:

py.test

Ответ 4

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

export PYTHONDONTWRITEBYTECODE=1