2012-04-20 35 views
89

我用在Mac上的easy_install安裝pytest,並開始了與文件結構的項目編寫測試很喜歡這樣:PATH問題與pytest「導入錯誤:沒有名爲模塊YadaYadaYada」

repo/ 
repo/app.py 
repo/settings.py 
repo/models.py 
repo/tests/ 
repo/tests/test_app.py 

運行py.test而在回購目錄,一切都表現爲你所期望

但是當我嘗試在Linux或Windows(兩者都具有pytest 2.2.3對他們的)它吠叫時,它達到了其的東西第一進口從我的應用程序的路徑同樣的事情。舉例來說from app import some_def_in_app

我需要編輯我的PATH才能在這些系統上運行py.test嗎?有沒有人經歷過這個?

+1

[這裏](http://docs.pytest.org/en/latest/goodpractices.html#integrating-with-setuptools-python-setup-py -test-pytest-runner)是用setuptools修復它的方法。 – ederag 2016-10-14 21:27:25

回答

49

是的,源文件夾不在Python路徑中,如果你cd到測試目錄。你有2個選擇:

a。手動添加路徑測試文件,是這樣的:

import sys, os 
myPath = os.path.dirname(os.path.abspath(__file__)) 
sys.path.insert(0, myPath + '/../') 

灣使用env var PYTHONPATH=../運行測試。

+5

當我'cd'到目錄?我從我的根目錄運行'py.test'。除非我錯了,你的意思是pytest在我的文件夾中散步 – MattoTodd 2012-04-20 21:46:08

+0

如果它是一個'cd'問題,我不會在Mac上打它嗎? – MattoTodd 2012-04-20 21:46:51

+0

哦,我誤讀了,並認爲它不能在測試目錄中工作。建議1中的技巧仍然有效。我只使用Linux,所以我無法解釋其他操作系統上的行爲。 – 2012-04-20 21:50:08

62

我有同樣的問題。我通過在我的tests目錄中添加一個空的__init__.py文件來修復它。

+47

請注意,在測試目錄中,* NOT *建議使用py.test:'avoid「__init__.py」文件。通過這種方式,您的測試可以輕鬆地對照已安裝的mypkg版本運行,而不受已安裝的軟件包的影響,如果它包含測試或不包含測試。「#SRC:http://pytest.org/latest/goodpractises.html – 2014-05-30 21:52:48

+13

我來到這裏問題,並發現從我的測試目錄中刪除'__init __。py'解決了我的問題。 – 101 2015-10-13 00:24:04

+2

@ K. -MichaelAye如果測試目錄不是包,你應該如何在測試中導入模塊? – mafrosis 2015-11-03 15:11:59

27

您可以在項目的根與PYTHONPATH運行

PYTHONPATH=. py.test 

或使用PIP安裝爲可編輯的進口

pip install -e . # install package using setup.py in editable mode 
+1

對於我而言,'test'目錄不在'src'目錄結構中,並且從包含'test'和'src'目錄的目錄調用。 – Zelphir 2016-03-13 22:53:39

99

我不知道爲什麼py.test不會在增加當前目錄PYTHONPATH本身,但這裏有一個解決方法(從您的存儲庫根執行):

python -m pytest tests/ 

它因爲Python會爲您添加PYTHONPATH中的當前目錄。

+1

這是一個非常整潔的解決方法,例如用於測試不是軟件包/可安裝的腳本和模塊! – Christoph 2016-05-30 08:41:38

+1

它需要將相對導入重寫爲絕對導入,如果您具有運行應用程序的代碼而不是在執行命令的級別。例如:'project/test/all-my-tests'和'project/src/app.py',並且由於這種改變,需要使用'__main __。py'文件間接調用'app.py' 'project/src',這樣就可以使用調用'python -m src'。據我所知,相當雜亂的東西。 – Zelphir 2016-09-26 15:44:19

+2

@ Zelphir:使用絕對進口是一種推薦的做法。 Habnabit's有一篇關於打包最佳實踐的好文章:http://blog.habnab.it/blog/2013/07/21/python-packages-and-you/,PEP8說:「隱式相對進口不應該被使用,已在Python 3中刪除。「請參閱:https://www.python.org/dev/peps/pep-0008/。 – Apteryx 2016-11-04 20:23:13

13

我創建這個作爲你的問題和我自己的困惑的答案。我希望它有幫助。請注意py.test命令行和tox.ini中的PYTHONPATH。

https://github.com/jeffmacdonald/pytest_test

具體做法是:你要告訴py.test和TOX在哪裏可以找到要包括的模塊。

有了你可以做到這一點py.test:

PYTHONPATH=. py.test 

並與TOX,添加到您的tox.ini:

[testenv] 
deps= -r{toxinidir}/requirements.txt 
commands=py.test 
setenv = 
    PYTHONPATH = {toxinidir} 
+1

您能否簡單介紹一下您鏈接的項目? – 2016-07-15 14:06:23

+1

也許它只是我,但項目上的README非常詳細,我對stackoverflow的評論說明了爲什麼我創建了回購。 – 2016-07-15 14:10:19

+3

儘管並非嚴格必要,但通常的政策是在答案本身中包含答案的主要內容,因爲它確保答案在從現在開始x年內可以理解,當時鏈接資源可能早已消失。 – 2016-07-15 14:13:04

2

,我開始越來越怪異「ConftestImportFailure:導入錯誤(「不模塊名爲...「錯誤時,我不小心將__init__.py文件添加到我的src目錄(這不應該是一個Python包,只是一個所有源的容器)

1

我越來越這個錯誤是由於更簡單的東西(你甚至可以說是微不足道的)。我沒有安裝pytest模塊。所以一個簡單的apt install python-pytest修復了我。

'pytest'將作爲測試依賴項列在setup.py中。確保你也安裝了測試要求。

2

運行pytest本身爲具有模塊: python -m pytest tests

相關問題