2012-08-12 39 views
3

目前有以下文件層次:的Python:單元測試模塊和相對導入

\package 
    __init__.py 
    run_everything.py 

    \subpackage 
     __init__.py 
     work.py 
     work1.py 
     work2.py 

    \test 
     __init__.py 
     test_work.py 
     test_work1.py 

我的第一個問題是關於相對進口。假設在\ subpackage \ work.py我有一個名爲custom_function()的函數,我想在test_work.py中測試該函數。出於某種原因,我無法弄清楚如何從一個模塊導入到另一個模塊。嘗試from .. subpackage.work1 import custom_function()似乎沒有工作,併產生錯誤Attempted relative import in non-package有沒有什麼辦法來解決這個問題?

2) 我想運行run_everything.py中的所有測試文件和一個函數,在每個test_work * .py文件中添加一個suite()函數,將每個unit_testing類添加到suite.addTest(unittest。 makeSuite(TestClass)),最後將它們導入到頂級run_everything.py中,這是Python2.7中最常用的方式嗎?

+0

我強烈建議不要使用相對導入,尤其是在測試中。 – Amber 2012-08-12 04:03:03

+0

那麼他們會去哪裏?將測試模塊放在子包中會強制相同導入語句no? – zhuyxn 2012-08-12 04:18:15

+0

通常情況下,您不會將測試放在包中,而是放在單獨的目錄樹中。 – Amber 2012-08-12 04:21:39

回答

0

這是一個黑客*
插入路徑的爲「分裝」和「測試」你的Python路徑中使用run_everything:

 
    import sys 
    sys.path.insert(0, '/path/to/package/subpackage') 
    sys.path.insert(0, '/path/to/package/test')

然後,你可以導入使用香草導入您的所有文件run_everything:

 
    import work, work1, work2 
    import test_work, test_work1 

*這不會永久影響您的PYTHONPATH。 *不要忘記投我硬編碼:(

+0

很多人都喜歡將新路徑放在'PYTHONPATH'的開頭,例如'sys。插入(0,'/ path/to/pkg')'這樣,如果軟件包也安裝到site-packages中,你的測試將從'/ path/to /'導入模塊的版本 – snim2 2014-03-13 14:29:42

+1

我想你的意思是' sys.path.insert(0,'/ path/to/pkg')' – 2014-03-14 20:39:42

+0

@ snim2重要觀察!更新答案以反映。 – 2014-12-10 19:01:39