7

python setuptoolsでは、pythonsetup.pytestがtestsuiteを実行します。ただし、テストスイートでインポートエラーが発生した場合、取得するエラーメッセージは、テストクラスが欠落していることを示すAttributeErrorだけです。テストスイートを修正できるように、より詳細なエラーメッセージを取得する方法はありますか?

次の例で自分自身をよりよく説明します。pasterで新しく作成されたfooというパッケージがあるとします。次に、テストを追加します

./foo
./foo/__init__.py
./foo/tests
./foo/tests/__init__.py
./foo/tests/mytest.py
./setup.cfg
./setup.py

ここで、mytest.pyに次のコードが含まれているとします。

import unittest
class MyTestClass(unittest.TestCase):
    def testFoo(self):
        self.assertEqual(1,1)

これは機能します。ただし、存在しないモジュールをインポートしようとすると

import unittest
import frombiz
class MyTestClass(unittest.TestCase):
    def testFoo(self):
        self.assertEqual(1,1)

これは私が得るエラーです

Traceback (most recent call last):
  File "setup.py", line 26, in <module>
    test_suite = "foo.tests"
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/core.py", line 152, in setup
    dist.run_commands()
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/dist.py", line 975, in run_commands
    self.run_command(cmd)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/dist.py", line 995, in run_command
    cmd_obj.run()
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/setuptools/command/test.py", line 121, in run
    self.with_project_on_sys_path(self.run_tests)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/setuptools/command/test.py", line 101, in with_project_on_sys_path
    func()
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/setuptools/command/test.py", line 130, in run_tests
    testLoader = loader_class()
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/unittest.py", line 816, in __init__
    self.parseArgs(argv)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/unittest.py", line 843, in parseArgs
    self.createTests()
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/unittest.py", line 849, in createTests
    self.module)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/unittest.py", line 613, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/unittest.py", line 587, in loadTestsFromName
    return self.loadTestsFromModule(obj)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/setuptools/command/test.py", line 34, in loadTestsFromModule
    tests.append(self.loadTestsFromName(submodule))
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/unittest.py", line 584, in loadTestsFromName
    parent, obj = obj, getattr(obj, part)
AttributeError: 'module' object has no attribute 'mytest'

つまり、失敗したインポートへの参照はありません。

4

4 に答える 4

3

を使用します。コードを変更する必要はありません。ただ行う:

$ pip install nose
$ nosetests

ImportErrorがある場合は、次のように表示されます。

ERROR: Failure: ImportError (cannot import name MyModel)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/garyvdm/bwreport/ve/lib/python3.2/site-packages/nose/failure.py", line 37, in runTest
    raise self.exc_class(self.exc_val).with_traceback(self.tb)
  File "/home/garyvdm/bwreport/ve/lib/python3.2/site-packages/nose/loader.py", line 390, in loadTestsFromName
    addr.filename, addr.module)
  File "/home/garyvdm/bwreport/ve/lib/python3.2/site-packages/nose/importer.py", line 39, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "/home/garyvdm/bwreport/ve/lib/python3.2/site-packages/nose/importer.py", line 86, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "/home/garyvdm/bwreport/bwreport/daemon/__init__.py", line 11, in <module>
    from bwreport.models import (
ImportError: cannot import name MyModel
于 2012-03-01T09:42:23.560 に答える
1

問題は、の最初の引数__import__()がモジュールでなければならないことです。点線の名前のオブジェクトに到達する必要がある場合、モジュールがモジュールである部分とそうでない部分がわかりません。オブジェクトを取得する1つの方法module.subnameは、最初にサブモジュールとしてインポートし、失敗した場合はgetattr(module, subname)、のように使用することunittestです。AttributeErrorこれにより、の代わりにが表示される場合がありますImportError。これを行う別の方法は、getattr(module, subname)最初に試行し、失敗した場合にのみインポートを試行することです。ImportErrorこの方法は良くありません:より適切なときにあなたに与えることがありますAttributeError

おそらく、unittestこの場合に最善の方法は、インポートと属性の両方のルックアップが失敗したという独自の例外を発生させることです。この問題のバグレポートを送信してみてください。

于 2009-11-30T13:34:58.927 に答える
0

また、 Distributeを使用してコードを試してみることもできます(setuptoolsはあまり積極的に保守されていないため、setuptoolsのフォークです)。それが何か違うことをするかどうかはわかりませんが、一見の価値があります。

于 2009-11-30T13:41:41.643 に答える
0

ここでの問題は、トレースバックを注意深く調べない限り、Python ImportErrorが実際にエラーが発生したモジュールを教えてくれないことです。これは、unittestモジュールでは行われません。unittestモジュールの実行に使用するツールに関係なく、unittestモジュールでも同じ問題が発生します。

「nose」パッケージを試してみることをお勧めします。setuptoolsプラグインが含まれているため、setuptoolsのデフォルトのテストファインダーを使用する代わりに、setuptoolsプラグインを追加して、テストを検索してインポートすることができます。正しく思い出せば、unittestとは異なる方法でテストコードが読み込まれ、この場合はより適切なエラーメッセージが表示される可能性があります。そうでない場合でも、ユニットテストよりも鼻に追加する方が簡単でしょう。

于 2010-01-29T18:10:34.907 に答える