2012-04-23 6 views
2

unittestを使用してテストしたいアプリケーションがありますが、いくつか問題があります。 次のように私のディレクトリ構造は次のとおりです。pythonのテストモジュールからsrcをインポートする方法

root_dir 
├── src 
│   ├── cmds 
│   │   ├── baz.py 
│   │   ├── __init__.py 
│   │   └── bar.py 
│   └── foo.py 
└── tests 
    ├── cmds.py 
    └── __init__.py 

私はcmdsからbazbarモジュールをテストしたいと私は

root_dir> python2.7 -m unittest tests.cmds

をやろうとしている。しかしtests.cmdsに、私はcmdsをインポートすることはできません私のsrc dirのパッケージ。

どうすればこの作品を作成できますか?

基本的には、アプリケーションをroot_dirからsrctestsディレクトリで別々にテストしたいと考えています。

私はsys.pathsrcを追加しようとしたが、私はtests/cmds.pyからcmds.bazをインポートするとき、私はまだunittestのからAttributeError: 'module' object has no attribute 'cmds'を取得します。

編集: 私のインポートとsys.path文は次のとおりです。

import sys 
sys.path.append('../src') 
from cmds.baz import about 

トレースバック:

Traceback (most recent call last): 
    File "/usr/lib/python2.7/runpy.py", line 162, in _run_module_as_main 
    "__main__", fname, loader, pkg_name) 
    File "/usr/lib/python2.7/runpy.py", line 72, in _run_code 
    exec code in run_globals 
    File "/usr/lib/python2.7/unittest/__main__.py", line 12, in <module> 
    main(module=None) 
    File "/usr/lib/python2.7/unittest/main.py", line 94, in __init__ 
    self.parseArgs(argv) 
    File "/usr/lib/python2.7/unittest/main.py", line 149, in parseArgs 
    self.createTests() 
    File "/usr/lib/python2.7/unittest/main.py", line 158, in createTests 
    self.module) 
    File "/usr/lib/python2.7/unittest/loader.py", line 128, in loadTestsFromNames 
    suites = [self.loadTestsFromName(name, module) for name in names] 
    File "/usr/lib/python2.7/unittest/loader.py", line 100, in loadTestsFromName 
    parent, obj = obj, getattr(obj, part) 
AttributeError: 'module' object has no attribute 'cmds' 
+2

srcがパッケージではありませんが、テストがあります。何故ですか?あなたはpythonパスを正しく設定しましたか? – pvoosten

+0

正確なインポートと完全なトレースバックを表示します。 – agf

+0

@lbp 'python2.7 -m unittest tests.cmds'を実行するときにインポートする必要があるためです。 – Paul

答えて

5

sys.pathへの相対パスを追加している行うには非常に間違ったこと。 あなたがパスについて確認したい場合は、次のように、それを作る:

# assuming that the code is in test's __init__.py 
import os 
import sys 
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), 
               '../src/'))) 
# now you can be sure that the project_root_dir/src comes first in sys.path 
2

私はあなたがそれはほとんど右だと思います。しかし、ルートディレクトリからテストを実行すると、あなたのパス('../src')は間違っています。たぶん、あなたはこのような何かを行うことができます。

import os 
import sys 

ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..') 
sys.path.append(os.path.join(ROOT, 'src')) 

from cmds.baz import about 
関連する問題