簡體   English   中英

Pytest:如何解決在tests文件夾中缺少__init__.py的問題?

[英]Pytest: how to work around missing __init__.py in the tests folder?

我將所有pytest文件存儲在項目根目錄下的tests子目錄中。 該目錄或更高版本中沒有__init__.py . pytest tests/test_a.pypytest 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 ... )取決於PYTHONPATHsys.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.

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