1

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を認識しません。

noseにカバレッジプラグインを使用する場合、この問題は発生しないことに注意してください。ただし、この特定のケースでは、プラグインを使用したくありません。

4

1 に答える 1

2

これは、coverage.py の問題でした。現在のディレクトリを sys.path リストに挿入するときに、絶対パスを使用しなかったため、何らかの形でこの問題が発生しました。Coverage.py が修正されました: https://bitbucket.org/ned/coveragepy/changeset/811ed58de8a3

于 2011-05-22T01:25:54.233 に答える