#python #nose #coverage.py #python-coverage
#python #nose #coverage.py #python-покрытие
Вопрос:
Я получаю ошибку импорта при использовании coverage.py для запуска набора тестов, в которых nose является базовым тестировщиком. Тесты выполняются нормально, если вместо этого я просто запускаю под управлением 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, …) console.
Обратите внимание, что эта проблема не возникает, когда я использую плагин coverage для nose, но в данном конкретном случае я не хочу использовать плагин.
Ответ №1:
Это была проблема с coverage.py . Когда он вставлял текущий каталог в список sys.path, он не использовал абсолютный путь, что каким-то образом вызвало эту проблему. Coverage.py теперь исправлено:https://bitbucket.org/ned/coveragepy/changeset/811ed58de8a3