Ошибка импорта Nosetests

Я пытаюсь использовать носовые тесты для запуска своих тестов в такой структуре каталогов.

src
    - file1.py
    - ...
test
    - helper.py
    - test_file1.py

Как видите, в test_file1.py есть несколько функций, которые проверяют file1.py, поэтому он импортирует file1.py следующим образом:

# In file1.py
import file1
import helper

# Tests go here...

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

# In helper.py 
import file1

# Use stuff in file1.py

У меня проблемы с пониманием того, как нос импортирует эти вещи с помощью своего пользовательского импортера. Мне удалось заставить мой тестовый файл импортировать file1.py, запустив nosetest ../tests в каталоге src, но в настоящее время я получаю сообщение об ошибке, похожее на:

File helper.py:
ImportError: cannot import name file1 

Как Нос выполняет импорт и есть ли способ заставить его объединить все мои файлы test/src вместе, чтобы они могли импортировать друг друга, пока я храню их в отдельных папках?


person ImpGuard    schedule 03.10.2014    source источник
comment
Используйте import src.file1 в header.py или переместите всю папку test в папку src   -  person J0HN    schedule 03.10.2014
comment
Первый вариант не работает. Второй тоже не работает. Похоже, что фактический тестовый файл test_file1.py может импортировать file1.py, а вспомогательный файл, который импортирует ИТ-специалист, - нет.   -  person ImpGuard    schedule 03.10.2014
comment
Всего один глупый вопрос. Почему вы импортируете их как file1.py, а не file1?   -  person J0HN    schedule 03.10.2014
comment
Ах, извините, это просто опечатка здесь. Я исправлю это!   -  person ImpGuard    schedule 03.10.2014


Ответы (2)


Видя, что вы выполняете тесты с помощью nosetests ../tests, я предполагаю, что они выполняются из самой папки tests. Поэтому файлы из каталога src не добавляются в sys.path, отсюда и ошибка.

Чтобы исправить это, можно:

  • запускать тесты из родительского каталога — nosetests сможет самостоятельно идентифицировать каталоги src и test (или tests) и добавит их в sys.path перед запуском тестов

  • добавить путь к каталогу src в PYTHONPATH перед запуском носовых тестов (export PYTHONPATH=../src; nosetests)

Обратите внимание, что вы также можете опустить последний аргумент для Nosetests, так как по умолчанию он запускает тесты из текущего каталога. В противном случае, если тесты находятся не в каталоге, из которого вы запускаете nosetests, вы можете указать его местоположение с помощью параметра --where=<path-to-tests> (или просто -w). Так, например, вы можете выполнять тесты из каталога src и даже не устанавливая PYTHONPATH (поскольку текущий каталог будет добавлен в sys.path по умолчанию), например: nosetests -w ../tests.


Наконец, хотя это само по себе очень сомнительно, и все же: наиболее распространенный способ организации исходного кода Python — это иметь файлы и пакеты python, запускаемые непосредственно в каталоге проекта, и иметь тесты в «тестовых» подпакетах пакетов. они проверяют. Итак, в вашем случае это будет:

/file1.py
/test/helper.py
/test/test_file1.py

или лучше:

/myproject/__init__.py
/myproject/file1.py
/myproject/test/__init__.py
/myproject/test/helper.py
/myproject/test/test_file1.py

(последнее, при условии, что вы также используете правильный импорт в своих тестовых источниках, например, from .. import file1).

В этом случае тесты запускаются из корневого каталога проекта просто с nosetests без каких-либо аргументов.

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

Подробнее о структуре проекта см. Какова наилучшая структура проекта для приложение Python?

person Timur    schedule 03.10.2014
comment
Спасибо. Ваше первое предложение заключалось в том, как я предположил, что Nousetest работает после прочтения документации. Однако проблема возникает, когда тесты в моем каталоге tests импортируют другие тестовые приспособления/файлы и файлы src. Nosetests запутается и либо позволит мне импортировать другие тестовые модули, либо позволит мне импортировать файлы src, но не оба. - person ImpGuard; 05.11.2014
comment
Да, в том-то и дело - обычно носовые тесты позволяют вам это сделать, если вы запускаете их из родительского каталога как в 'src', так и в 'test'. В этом случае носовые тесты добавят как в sys.path, так и обычно можно импортировать исходники из тестов И тесты из других тестов. В любом случае, если это все равно не работает - предлагаю распечатать sys.path из разных тестов и изучить его на наличие аномалий. И, что еще хуже, можно экспортировать PYTHONPATH, чтобы принудительно добавить определенные каталоги в sys.path. (Хотя, я думаю, что более правильный способ - это иметь структуру каталогов, которая хороша для носа). - person Timur; 06.11.2014
comment
Второй пункт, export PYTHONPATH=./, решил мою проблему, теперь подкаталоги могут «видеть» друг друга при запуске носовых тестов. - person Rickka; 24.08.2017

Обычно это похоже на проблему, с которой я столкнулся при тестировании носа:

Импорт с помощью тестов Python и Nose

Обходной путь, который я нашел, заключался в том, чтобы вставить блок try..except, чтобы ОБА команды python и Nosetest работали в одном и том же каталоге следующим образом:

(1) В вашем основном файле в самом верху перед чем-либо еще добавьте:

# In file1.py
   try:
       # This will allow you to do python file1.py inside the src directory
       from file2 import *
       from helper import *
   except:
       # This will allow you to run nosetests in the directory just above
       # the src and test directories.
       from src.file1 import *
       from src.helper import *

(2) Внутри вашего файла test.py добавьте:

  from src.file2 import *
  from src.helper import * 
person Jeeves    schedule 31.03.2016