Python не видит подмодулей при работе под покрытием и носом

1

Я получаю ошибку импорта, когда я использую cover.py для запуска набора тестов, где нос является основным тестовым бегуном. Тесты выполняются нормально, если я просто запускаю под Python.

coverage run run_tests.py
ERROR

======================================================================
ERROR: <nose.suite.ContextSuite context=nova.tests>
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/lorin/nova/hpc-trunk/.nova-venv/lib/python2.6/site-packages/nose/suite.py", line 208, in run
    self.setUp()
  File "/Users/lorin/nova/hpc-trunk/.nova-venv/lib/python2.6/site-packages/nose/suite.py", line 291, in setUp
    self.setupContext(ancestor)
  File "/Users/lorin/nova/hpc-trunk/.nova-venv/lib/python2.6/site-packages/nose/suite.py", line 314, in setupContext
    try_run(context, names)
  File "/Users/lorin/nova/hpc-trunk/.nova-venv/lib/python2.6/site-packages/nose/util.py", line 478, in try_run
    return func()
  File "/Users/lorin/nova/trunk/nova/tests/__init__.py", line 43, in setup
    from nova import context
ImportError: cannot import name context

Это не похоже на ошибку пути, вместо этого кажется, что подмодули модуля "nova" не видны, когда я запускаю тест, выполняя "прогон покрытия". Я нашел это, добавив следующий код к методу, который не срабатывал:

import nova; print nova.__path__
print dir(nova)

Когда я запускаю это как python run_tests.py, я вижу следующий вывод:

['/Users/lorin/nova/hpc-trunk/nova']
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 
 'api', 'auth', 'compute', 'console', 'context', 'crypto', 'db', 'exception', 
 'fakerabbit', 'flags', 'image', 'ipv6', 'log', 'manager', 'network', 'objectstore', 
 'quota', 'rpc', 'scheduler', 'service', 'test', 'tests', 'twistd', 'utils', 'version', 
 'virt', 'vnc', 'volume', 'wsgi']

Однако, когда я запускаю это как coverage run run_tests.py, я вижу следующий вывод:

['/Users/lorin/nova/hpc-trunk/nova']
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 
 'api', 'tests']

Кажется, что он находит модуль nova в одном и том же месте в каждом случае, но в случае, когда я запускаю его с покрытием, Python не видит большую часть подмодулей: (auth, compute,...).

Обратите внимание, что эта проблема не возникает, когда я использую плагин для носа, но в этом конкретном случае я не хочу использовать плагин.

Теги:
nose
coverage.py
python-coverage

1 ответ

2
Лучший ответ

Это была проблема с cover.py. Когда он вставил текущий каталог в список sys.path, он не использовал абсолютный путь, который каким-то образом вызвал эту проблему. Coverage.py теперь исправлено: https://bitbucket.org/ned/coveragepy/changeset/811ed58de8a3

Ещё вопросы

Сообщество Overcoder
Наверх
Меню