簡體   English   中英

Python 導入以使用鼻子進行測試 - 導入高於當前 package 的模塊的最佳做法是什么

[英]Python imports for tests using nose - what is best practice for imports of modules above current package

這是一個在不同的 forms 中經常被問到的問題,並且經常得到“大聲笑你做得不好”的回答。 很確定這是因為人們(包括我)正在嘗試將其用作實現的常識場景,並且解決方案並不明顯(如果您以前沒有這樣做過)。

會接受“讓飛出瓶子”的答案。

給定

project/
    __init__.py
    /code
        __init__.py
        sut.py
    /tests
        __init__.py
        test_sut.py

tests_sut.py 開始的地方:

import code.sut

在根目錄中運行鼻子測試會導致:

ImportError: No module named code.sut

走過的大道:

a)做一個親戚使用

from ..code import sut

b) 將項目的根目錄添加到 PYTHONPATH

c) 使用

sys.path.append

在每個測試模塊開始處的導入之前添加.. 路徑。

d) 只記得做一個

setup.py 

在項目上將模塊安裝到站點包中,然后再運行測試。


因此,要求是在測試 package 根目錄下進行測試,這些測試可以訪問項目。 以上每一項對我來說都不“自然”,被證明是有問題的,或者看起來太辛苦了!

在 java 中這是可行的,但基本上是通過您的構建工具 / IDE 將所有類放在類路徑上。 也許問題是我期待 Python 的“魔法”? 在 Flask 網絡框架測試中已經注意到,選項 d) 似乎是首選。

無論如何,以下推薦首選解決方案的陳述將消除我自己的“不自然”感覺。

我遇到了同樣的問題,並在我的相關問題工作中找到了答案

只需刪除項目根目錄中的 __init__.py 即可。

您已經很好地回答了您的問題。 D(安裝到系統位置)是可分發代碼的首選。 我通常使用 C(修改 sys.path),因為我不想在系統范圍內安裝數百個自定義庫。 理論上 A(相對導入)似乎更好,但在某些情況下它會失敗。 B (PYTHONPATH) 是正確的,在我看來真的只是為了測試目的。

這幾乎總結了所有選項。 您喜歡的選項(Python 神奇地知道在哪里尋找)實際上不是一個可行的解決方案,因為它可能導致不可預測的結果,例如從不相關的項目中自動查找庫。

在我看來,最好的辦法是把它放在你程序的入口點:

import sys, os
sys.path = [os.path.abspath(os.path.dirname(__file__))] + sys.path

我知道已經檢查了一個答案,我仍然認為這是分享其他替代方案的好理由:)

在調用nosestests時,有一個nose-pathmunge可以讓您控制設置sys.path

暫無
暫無

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

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