避免在python

避免在python

问题描述:

以前我的工作没有单元测试使用的子文件夹时导入的路径和我有这个结构,我的项目:避免在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

更优雅的方法是from folderFunctions.folderTest import testFunctionA并确保folderTest目录中有一个__init__.py文件。你也可以看看这个question

如果你希望你的库/应用程序变得更大和易于打包,我不建议将源代码与测试代码分开,因为测试代码不应该打包在二进制发行版中(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