簡體   English   中英

Python庫項目結構最佳實踐:導入和測試

[英]Python library project structure best practice: imports and tests

我想重構一個python庫,我在我的日常工作中使用很多,在github上將它作為開源發布。 在這樣做之前,我希望符合某種python項目結構的最佳實踐。 我將在下面描述想要我想做什么,我將不勝感激您的建議。

這是我的庫(mylib)結構:

mylib/
   /examples/
       simple_example.py
   /mylib/
       __init__.py
       foo.py
       bar.py
   /tests/
       test_foo.py
       test_bar.py

這是文件:

#foo.py
def Foo():
    print("foo.Foo")


#bar.py
import foo

def Bar():
    print("bar.Bar")
    foo.Foo()


#test_bar.py
from ..mylib import bar #doesnt work!

class TestBar(unittest.TestCase):
    def test_1(self):
        bar.Bar()
        self.assertEqual(True, True)

if __name__ == '__main__':
    unittest.main()


#simple_example.py
from .. import foo #doesnt work!
from .. import bar #doesnt work!

if __name__ == '__main__':  
    foo.Foo()
    bar.Bar()

我想做的是:

1-理想情況下從/ mylib / examples /執行simple_example.py:

$cd myapp
$cd examples
$python simple_example.py
Traceback (most recent call last):
  File "simple_example.py", line 2, in <module>
    from .. import foo
SystemError: Parent module '' not loaded, cannot perform relative import

2-理想情況下從/ mylib / tests /執行單個測試文件:

$cd myapp
$cd tests
$python test_bar.py
Traceback (most recent call last):
  File "test_bar.py", line 3, in <module>
    from ..mylib import bar
SystemError: Parent module '' not loaded, cannot perform relative import    

3-從mylib root執行所有測試

$cd myapp
$python -m unittest discover tests #same problem as above!

因此,問題出在simple_example.py和test_bar.py中的import語句中。 修復這些進口的最佳方法是什么?

請注意,我想使用python標准lib unittest進行單元測試。

謝謝

查理

運行測試代碼時,您希望進行絕對導入。 這是因為當您運行單元測試等時,您應該假設您的“庫”以本地開發模式安裝以進行測試 - 不要使用相對導入,因為您不在同一個包中。

以下是在test_foo.py文件中導入的test_foo.py ,例如:

# test_foo.py
from mylib.foo import Foo

# ... your test code here

通常,您應該只使用庫代碼中的相對導入INSIDE,而不是在您的測試中使用=)

我希望這有幫助。

編輯 :您還需要在開發模式下安裝庫,然后才能工作。 您可以通過以下兩種方式之一完成此操作:

$ python setup.py develop

要么

$ pip install -e .

上述任一命令都將檢查項目的setup.py文件,該文件告訴Python如何構建/創建包,並將其本地安裝,以便您可以運行測試/混亂。

暫無
暫無

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

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