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


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

чтобы дублировать 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 ============================
4   51   2012-09-25 15:58:43

4 ответа:

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

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

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

как это рекомендуется процесс работы с пы.тест: установите разрабатываемый пакет с помощью pip install -e, а затем проверить его.

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

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

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

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

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

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

py.test

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

export PYTHONDONTWRITEBYTECODE=1