Я не могу заставить среду тестирования носа распознавать модули под моим тестовым скриптом в файловой структуре. Я привел простейший пример, демонстрирующий проблему. Я объясню это ниже.
Вот структура файла пакета:
./__init__.py
./foo.py
./tests
./__init__.py
./test_foo.py
foo.py содержит:
def dumb_true():
return True
tests / test_foo.py содержит:
import foo
def test_foo():
assert foo.dumb_true()
Оба файла init .py пусты
Если я запускаю nosetests -vv
в основном каталоге (где находится foo.py), я получаю:
Failure: ImportError (No module named foo) ... ERROR
======================================================================
ERROR: Failure: ImportError (No module named foo)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/loader.py", line 379, in loadTestsFromName
addr.filename, addr.module)
File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 39, in importFromPath
return self.importFromDir(dir_path, fqname)
File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 86, in importFromDir
mod = load_module(part_fqname, fh, filename, desc)
File "/home/user/nose_testing/tests/test_foo.py", line 1, in <module>
import foo
ImportError: No module named foo
----------------------------------------------------------------------
Ran 1 test in 0.002s
FAILED (errors=1)
Та же ошибка возникает при запуске из каталога tests /. В соответствии с документацией и примером, который я нашел, носитель должен добавлять все родительские пакеты в путь, а также каталог, из которого он вызывается, но в моем случае этого не происходит.
Я запускаю Ubuntu 8.04 с Python 2.6.2. Я собрал и установил нос вручную (не с помощью setup_tools), если это важно.
источник
Вы в виртуальном мире? В моем случае это
nosetests
был тот/usr/bin/nosetests
, который использовал/usr/bin/python
. Пакеты в virtualenv определенно не будут в системном пути. Следующее исправило это:источник
nosetests
был кешированbash
в системный/usr/local/bin
(покаwhich nosetests
давал правильный результат). Я использовал это, чтобы очистить его.Для тех из вас, кто позже найдет этот вопрос: я получаю сообщение об ошибке импорта, если у меня нет
__init__.py
файла в моем каталоге тестов.Моя структура каталогов была такой:
Если я пробежал носовые тесты:
Это даст то,
ImportError
что видят все остальные. Если я добавлю пустой__init__.py
файл, он будет работать нормально:источник
Другая потенциальная проблема - дефисы / тире в дереве каталогов. Недавно я исправил ошибку ImportError в носу, переименовав каталог с
sub-dir
вsub_dir
.источник
Конечно, это может быть вызвано синтаксической ошибкой в импортируемом модуле. Для меня проблема возникла, когда у меня была резервная копия файла тестов с таким путем, как module / tests.bak.py, в том же каталоге, что и tests.py. Кроме того, чтобы разобраться с init проблемой пакета / модуля в приложении Django, вы можете запустить следующее (в оболочке bash / OSX), чтобы убедиться, что у вас нет никаких файлов init .pyc:
источник
Я получил это сообщение об ошибке, потому что запустил
nosetests
команду из неправильного каталога.Глупо, но бывает.
источник
nosetests
в каталоге без каких-либо тестов приведет кRan 0 tests
ошибке импорта. В нынешнем виде этот ответ бесполезен.Я только что столкнулся с еще одной вещью, которая могла вызвать эту проблему: именование тестов в форме
testname.test.py
. Это лишнее.
сбивает с толку и приводит к тому, что он импортирует то, чего не следует. Я полагаю, что может быть очевидно, что использование нетрадиционных соглашений об именах тестов сломает ситуацию, но я подумал, что это стоит отметить.источник
Например, со следующей структурой каталогов, если вы хотите работать
nosetests
вm1
,m2
илиm3
проверить некоторые функции вn.py
, вы должны использоватьfrom m2.m3 import n
вtest.py
.источник
Просто завершу вопрос: если вы боретесь с такой структурой:
И, возможно, вы хотите запустить тест из пути за пределами проекта, включив путь к проекту в свой PYTHONPATH.
вставьте его в свой .profile. Если вы находитесь в виртуальной среде, вставьте его в активировать в корень venv.
источник