2015-10-10 106 views
1

我有一個目錄結構如下:放置位置蟒蛇單元測試

DirA 
    __init__.py 
    MyClass.py 
    unittests <------------------directory 
     MyClassTest.py 

MyClassTest.py是可執行文件:

import unittest 
from . import MyClass  

class MyClassTestCase(unittest.TestCase): 
    """ Testcase """ 

... 
..... 

if __name__ == '__main__': 
    unittest.main() 

我得到一個錯誤「父模塊'沒有加載,無法執行相對進口「在線:

from . import MyClass 

我想將單元測試放在'unittests'目錄旁邊的模塊正在測試。有沒有辦法做到這一點,並有權訪問我正在測試的父目錄中的所有模塊?

+0

我喜歡把單元測試包層次結構外,在一個單獨的子目錄中的項目的根目錄。這樣他們就不會被包含在構建的分佈中。 – Keith

+0

當然,我也可以做到這一點。這主要是我怎麼會在C++中做到這一點,所以它從那裏:) –

回答

2

您是否嘗試過運行測試,如下所示:

cd DirA 
python -m unittest discover unittests "*Test.py" 

這應該正確地找到你的模塊。見Test Discovery

+0

剛剛嘗試過。它無法找到測試。試了DirA和DirA/unittests。如果我直接運行它python MyClassTest.py我得到相同的「父模塊」'未加載,不能執行相對導入「 –

+0

對不起,我編輯了我的答案,但我認爲這是正確的,然後'python -m unittest發現unittests'這樣做爲你工作?然後在你的測試中,你應該能夠簡單地說'import MyClass' – jayant

+0

好吧,它不會出錯。但它說0測試運行。 –

0

一個建議的結構,就看你的結構是這樣的:

my_app 
    my_pkg 
     __init__.py 
     module_foo.py 
    test 
     __init__.py 
     test_module_foo.py 
    main.py 

my_app內運行的一切,這樣你會使用所有的測試代碼和核心代碼的同一模塊的引用。

1

使用任何你想要的佈局,根據你自己的喜好,你想你的模塊要導入的方式:因爲

要找到您unittests文件夾,該名稱不是常規名稱(單元測試腳本默認查找test文件夾),則可以使用unittest模塊的discover選項來指定LL如何找到您的測試腳本:

python -m unittest discover unittests 

注意,第一unittest是Python模塊,第二unittests(與s)是你的目錄,你已經把你的測試腳本。

另一種方法是使用nosetest模塊(或其他新的單元測試模塊,如pytesttox),它應該會自動查找您的測試腳本,只要你把他們:

nosetests -vv 

並修復您的導入錯誤,你應該使用完整的相對(或絕對)路徑:

from ..MyClass import MyClass # Relative path from the unittests folder 
from MyClass import MyClass # Absolute path from the root folder, which will only work for some unit test modules or if you configure your unit test module to run the tests from the root 
+0

謝謝。我已經更改爲DirA目錄並運行「python -m unittest discover unittests」。我已經將import語句修改爲「from MyClass import MyClass」,這不會引發錯誤。但是也沒有找到測試。我運行了0個測試。我已經使文件名和類名相同:MyClassTestCase.py&MyClassTestCase –

0

Python的相對進口不工作(或者我應該說,他們的工作方式不同)上運行其自己的模塊時。即,當__name__ ==「__main__」,這就是爲什麼你有錯誤無法執行相對導入

你可能有一個看看PEP https://www.python.org/dev/peps/pep-0328/

我用一個比較難看的補丁,但沒有發現到現在好多了,這是在導入時,檢查模塊是否運行「單獨」或如果它是從其他一些python代碼導入的。

隨着我的修補程序,您的代碼MyClassTest.py將成爲

import unittest 
if(__name__ == "__main__"): 
    import sys 
    sys.path.add(1,'path/to/yourClass') 
    import MyClass 
else: 
    from . import MyClass  

class MyClassTestCase(unittest.TestCase): 
    """ Testcase """ 

... 
..... 

if __name__ == '__main__': 
    unittest.main() 

但是當你需要使用絕對路徑要導入模塊,這是不是一個漂亮的修復。 如果有人有更靈活的方法來解決這個問題,我會非常感興趣!

希望這有助於