2017-08-11 114 views
0

以前我的工作沒有單元測試使用的子文件夾時導入的路徑和我有這個結構,我的項目:避免在python

-main.py 
    -folderFunctions: 
     -functionA.py 

只需使用folderFunctions init文件,並導入

from folderFunctions import functionA 

一切都很好。

現在我也wihch我以這種方式組織單元測試:

-main.py 
-folderFunctions: 
    -functionA.py 
    -folderTest: 
     -testFunctionA.py 

所以我不得不添加(才能運行testFunctionA.py)在這兩個functionA.py和testFunctionA.py這些2線導入路徑:

myPath = os.path.dirname(os.path.abspath(__file__)) 
sys.path.insert(0, myPath + '../..') 

以這種方式測試正常工作。 但它對我來說很醜,我猜也不是很pythonic。 有沒有辦法讓它更優雅?

+0

創建一個名爲在同一水平上,其中'main.py'是'tests'文件夾,並把所有的測試在那裏。 – orangeInk

+0

@orangelnk我讀到的通常是測試文件夾處於與功能相同的層次或更深層次的功能。主要還是pythonic? – Joe

+0

我不得不承認,在包裝方面我遠非專家,但在99%的時間裏,當我看到一個包時,我看到'setup.py'所在的同一級別的'tests'文件夾意味着高於所有實際代碼的1個等級)。 – orangeInk

回答

0

更優雅的方法是from folderFunctions.folderTest import testFunctionA並確保folderTest目錄中有一個__init__.py文件。你也可以看看這個question

1

如果你希望你的庫/應用程序變得更大和易於打包,我不建議將源代碼與測試代碼分開,因爲測試代碼不應該打包在二進制發行版中(egg或輪)。

您可以按照樹形結構:

+-- src/ 
| +-- main.py 
| \-- folder_functions/ # <- Python package 
|  +-- __init__.py 
|  \-- function_a.py 
\-- tests/ 
    \-- folder_functions/ 
     +-- __init__.py 
     \-- test_function_a.py 

注:根據PEP8,Python包和模塊的名稱應該是「蛇案」(小寫+下劃線)。

src目錄可以避免,如果你有(你應該)一個主包。

正如在其他意見解釋的那樣,setup.pŸ文件應該站在旁邊的SRC測試文件夾(根級)。

閱讀Python Packaging User Guide

編輯

下一步是創建一個setup.py,例如:

from setuptools import find_packages 
from setuptools import setup 

setup(
    name='Your-App', 
    version='0.1.0', 
    author='Your Name', 
    author_email='[email protected]', 
    url='URL of your project home page', 
    description="one line description", 
    long_description='long description ', 
    classifiers=[ 
     'Development Status :: 4 - Beta', 
     'Intended Audience :: Developers', 
     'License :: OSI Approved :: Python Software Foundation License', 
     'Operating System :: MacOS :: MacOS X', 
     'Operating System :: Microsoft :: Windows', 
     'Operating System :: POSIX', 
     'Programming Language :: Python', 
     'Topic :: Software Development', 
    ], 
    platforms=["Linux", "Windows", "OS X"], 
    license="MIT License", 
    keywords="keywords", 
    packages=find_packages("src"), 
    package_dir={'': 'src'}, 
    entry_points={ 
     'console_scripts': [ 
      'cmd_name = main:main', 
     ], 
    }) 

一旦你的項目配置,您可以創建一個virtualenv並在裏面安裝你的應用程序:

virtualenv your-app 
source your-app/bin/activate 
pip install -e . 

您可以使用unitests標準模塊運行測試。

要導入您的模塊test_function_a。PY,只是照常進行:

from folder_functions import function_a 
+0

感謝您的幫助!所以有了這個樹結構,我怎麼才能在test_function_a.py中導入function_a.py? – Joe