2012-04-23 57 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_dirsrctests目錄中的應用程序。

我試圖追加srcsys.path,但是當我輸入cmds.baztests/cmds.py我仍然可以從單元測試的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 2012-04-23 19:40:43

+0

顯示確切的導入和完整的回溯。 – agf 2012-04-23 19:40:50

+0

@lbp因爲我在執行'python2.7 -m unittest tests.cmds'時必須導入它。 – Paul 2012-04-24 11:56:16

回答

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