2017-05-11 85 views
1

我是Python新手,來自Java背景。如何在測試中導入測試模塊?

假設我開發一個Python項目,包hello

hello_python/ 
    hello/ 
    hello.py 
    __init__.py 
    test/ 
    test_hello1.py 
    test_hello2.py 

我相信這個項目結構是正確的。

假設hello.py包含函數do_hello()我想在測試中使用。如何在測試test_hello1.pytest_hello2.py中導入do_hello

+1

導入測試與導入任何其他代碼沒有區別。在你的情況下,你會'從hello.hello導入do_hello'。 –

+0

謝謝。我知道了。現在測試在'PyCharm'中運行Ok。但是,當我在當前目錄test下的命令行'python -m unittest test_hello_server'運行測試時,我得到了'ImportError:No module named hello_server.hello_server'。 – Michael

+0

因爲父目錄不在pythonpath上。相反,你應該從'hello_python'開始,並執行'python -m unittest test.test_hello'或其他任何東西。 –

回答

1

這裏有2個小問題。首先,你從錯誤的目錄運行你的測試命令,其次你沒有把你的項目組織得很好。

通常,當我正在開發一個python項目時,我會盡量將所有內容都集中在項目的根目錄下,在您的案例中,這將是hello_python/。 Python有默認其負載路徑上的當前工作目錄,所以如果你有一個項目是這樣的:

hello_python/ 
    hello/ 
    hello.py 
    __init__.py 
    test/ 
    test_hello1.py 
    test_hello2.py 


# hello/hello.py 
def do_hello(): 
    return 'hello' 

# test/test_hello.py 
import unittest2 
from hello.hello import do_hello 

class HelloTest(unittest2.TestCase): 
    def test_hello(self): 
     self.assertEqual(do_hello(), 'hello') 

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

其次,test是不是一個模塊,現在,因爲你已經錯過了在__init__.py該目錄。你應該有一個看起來像這樣的層次結構:

hello_python/ 
    hello/ 
    hello.py 
    __init__.py 
    test/ 
    __init__.py # <= This is what you were missing 
    test_hello1.py 
    test_hello2.py 

當我嘗試,我的機器上,運行python -m unittest test.hello_test工作正常,我。

您可能會發現這仍然有點麻煩。我強烈建議安裝nose,這將使您只需從項目的根目錄調用nosetests即可自動查找並執行所有測試 - 只要您擁有正確的模塊即可使用__init__.py s。

+0

只注意到你用'-m'開關運行'python'。它現在適合我!非常感謝。 – Michael

+0

你的例子有一個小問題。當我執行單元測試時_no test_實際運行,因爲測試方法'hello_test'不以'test'開始。按照慣例,'TestCase'的實例只運行'test_ *'作爲測試。 – Michael

+0

@Michael哎呀!爲我手工抄錄所有東西,而不是複製粘貼,讓我感到滿意。 – ymbirtt