簡體   English   中英

Py.test 沒有名為 * 的模塊

[英]Py.test No module named *

我有這樣的文件夾結構

App
--App
  --app.py       
--Docs
--Tests
  --test_app.py

在我的test_app.py file中,有一行用於導入我的應用程序模塊。 當我在根文件夾上運行 py.test 時,我收到關於沒有名為 app 的模塊的錯誤。 我應該如何配置這個?

使用 Python 3 並在類似的項目布局上遇到相同的錯誤,我通過向我的tests模塊添加一個__init__文件來解決它。

$ touch tests/__init__.py

我不擅長打包和導入,但我認為這有助於pytest確定目標App模塊所在的位置。

我已經在/App/App目錄中有一個__init__.py文件,並希望從項目根目錄運行測試而沒有任何路徑修改魔法:

 python -m pytest tests

輸出立即如下所示:

➟  python -m pytest tests
====================================== test session starts ======================================
platform linux -- Python 3.5.1, pytest-2.9.0, py-1.4.31, pluggy-0.3.1
rootdir: /home/andrew/code/app, inifile: 
plugins: teamcity-messages-1.17
collected 46 items 

... lines omitted ...

============================= 44 passed, 2 skipped in 1.61 seconds ==============================

所以你正在從/App運行py.test 您確定/App/App在您的$PYTHONPATH嗎?

如果不是,嘗試import app代碼將失敗並顯示此類消息。

EDIT0:為了完整性,包括我下面評論中的信息。

導入 app 的嘗試只有在/App/App執行時才會成功,這里不是這種情況。 您可能希望通過將__init__.py放入其中來使/App/App成為一個包,並將您的導入更改為from App import app限定為from App import app

EDIT1:根據要求,從我下面的第二條評論中添加進一步的解釋。

通過將__init__.py放在/App/App ,該目錄成為一個包。 這意味着您可以從中導入,只要它 - 目錄 - 在$PYTHONPATH可見。 也就是說,如果/App$PYTHONPATH中,您可以從App import app /App 您當前的工作目錄會自動添加到$PYTHONPATH ,因此當您從/App運行腳本時,導入將起作用。

我遇到了類似的問題,不得不從根目錄中刪除__init__.py並將__init__.py添加到tests文件夾中。

在為我的應用程序運行測試用例時,我也遇到了同樣的錯誤,如下所示

myproject
  --app1
    --__init.py__
    --test.py
  --app2
    --__init.py__
    --test.py
  --__init.py__

我刪除了myproject 的init.py文件來運行我的測試用例。

長話短說

您也可以將一個空的conftest.py文件添加到您的根應用程序文件夾中。

(如果你看一下問題文件夾結構,那將與“測試”文件夾處於同一級別,而不是在其中)

更多信息:

Pytest 在所有項目文件夾中查找conftest.py文件。

conftest.py為 pytest 在其中找到它的文件樹提供配置。因為 pytest 以某種方式掃描從 conftest.py 文件夾開始的所有子目錄,它應該在測試文件夾之外找到包/模塊(只要 conftest.py 文件在您的應用程序中)根文件夾)。

最后,您可能想在空的 conftest.py 中編寫一些代碼,專門用於在不同的測試文件之間共享 fixture,以避免重復代碼。 畢竟,在編寫測試時也應該遵循 DRY 原則(不要重復自己)。

__init.py__添加到測試文件夾也應該有助於 pytest 在整個應用程序中查找模塊。 但是,請注意 Python 3.3+ 具有隱式命名空間包,允許它創建沒有__init__.py文件的包。 也就是說,為此特定目的創建__init__.py文件似乎更像是 pytest 的解決方法,而不是 python 要求。 更多相關信息: Is __init__.py not required for packages in Python 3.3+

使用python -m pytest命令運行pytest有助於解決這個問題。

由於您當前的包尚未在您的$PYTHONPATHsys.path - pytest 收到此錯誤。

通過使用python -m pytest您會自動將工作目錄添加到sys.path以運行pytest 他們的文檔還提到:

這幾乎相當於調用命令行腳本pytest

我得到了類似的問題。 在嘗試了包括在虛擬環境上安裝 pytest 和從包中添加/刪除__init__.py文件在內的多種方法之后,沒有一個對我有用。

對我有用的解決方案是(Windows 解決方案):將項目文件夾(不是包文件夾)添加到 python 路徑(設置 PYTHONPATH=%PYTHONPATH%;%CD%)

從項目文件夾和繁榮運行我的腳本,它起作用了。

我有這樣的文件夾結構

App
--App
  --app.py       
--Docs
--Tests
  --test_app.py

在我的test_app.py file ,有一行要導入我的應用程序模塊。 在根文件夾上運行py.test時,出現此錯誤,提示沒有名為app的模塊。 我應該如何配置呢?

這對我有用:轉到父應用程序,然后pip install -e . (安裝本地和可編輯的應用程序)。

對我有用的是:我必須在我的測試文件中進行絕對導入,並在根文件夾中調用python -m test

我遇到了同樣的問題。

my-app
--conf
--my-app
--tests

我設置了__init__.py文件。 我添加了一個conftest.py (用於共享pytest.fixtures )。 我將其添加到我的詩歌文件( pyproject.toml

[tool.pytest.ini_options]
pythonpath = [
  "."

原來這是我使用連字符而不是下划線。 不……

# pytest can't find Module
--my-app

# works
--my_app

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM