![](/img/trans.png)
[英]Why I become able to import module in debuger after adding __init__.py to tests folder of pytest
[英]Pytest: how to work around missing __init__.py in the tests folder?
我將所有pytest文件存儲在項目根目錄下的tests
子目錄中。 該目錄或更高版本中沒有__init__.py
. pytest tests/test_a.py
, pytest tests/test_a.py
按預期工作。 我也可以直接從tests
文件夾中運行pytest test_a.py
。
|--<project_root>
+---[tests]
test_a.py
base.py
config.py
conftest.py
在測試類test_a.py
從繼承base.py
。 現在,問題是由於缺少__init__.py
,IDE工具不起作用,無法解析導入。 在tests
下添加__init__.py
可以解決IDE中的所有導入錯誤,但是測試將不再使用pytest test_a.py
運行,因為py.test無法導入conftest.py
。
在我的conftest.py
我有以下導入:
from config import HOST_URL_DEFAULT, USER, PASSWORD
這導致:
ModuleNotFoundError: No module named 'config'
ERROR: could not load /project_root/tests/conftest.py
有沒有辦法解決這個問題,以便IDE工具和 pytest
正常工作? 如果可能的話,我想避免使用點導入。
更新:看完這個答案后,我想我終於開始了解python導入的工作方式。
添加__init__.py
並在conftest.py
使用相對或絕對導入:
# relative
from .config import HOST_URL_DEFAULT, USER, PASSWORD
# absolute
from tests.config import HOST_URL_DEFAULT, USER, PASSWORD
在包中(由__init__.py
標識),您需要明確的導入路徑。 使用非限定導入( from config import ...
)取決於PYTHONPATH
或sys.modules
包括您的包根) - 這通常不健壯,應該避免,因為它繞過了包基礎結構。
你在這里(其他模塊使用的config.py
) 是一個包。 把它視為一體。
pytest
不勸阻與使用測試包的__init__.py
! 有一些名副其實的用例 - 例如你的用例。
pytest
不鼓勵在同一源根目錄中使用源包和測試包。 但是,這意味着您應該移動源包 ,而不是您的測試包!
mysource/ # root directory for both mypackage and mytests
+- mypackage/ # should be src/mypackage instead!
+- __init__.py
+- abcd.py
+- mytests
+- __init__.py
+- tests_abcd.py # ``from mypackage import abcd`` imports from source
問題是運行mytests
意味着mypackage
也可以從源代碼導入。 也就是說,您的測試正在處理源包 ,而不是您安裝的包。 如果您的安裝過程中有任何錯誤,測試將無法捕獲它。 有關詳細信息,請參閱pytest
文檔中鏈接的博客 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.