以前我在没有单元测试的情况下工作,我的项目有这个结构:
-main.py
-folderFunctions:
-functionA.py
只需在文件夹中使用初始化文件函数,然后导入
from folderFunctions import functionA
一切都很好。
现在我也有以这种方式组织的单元测试:
-main.py
-folderFunctions:
-functionA.py
-folderTest:
-testFunctionA.py
所以我必须在 functionA.py 和 testFunctionA.py 这两行中添加(为了运行 testFunctionA.py(以导入路径:
myPath = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, myPath + '../..')
这样,测试就可以正常工作。 但这对我来说很丑陋,我想也不是很蟒蛇。 有没有办法让它更优雅?
如果您希望您的库/应用程序变得更大且易于打包,我几乎不建议将源代码与测试代码分开,因为测试代码不应该打包在二进制发行版(鸡蛋或轮子(中。
您可以遵循以下树结构:
+-- 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.py 文件应位于src和tests文件夹(根级别(旁边。
阅读 Python 打包用户指南
编辑
下一步是创建一个setup.py,例如:
from setuptools import find_packages
from setuptools import setup
setup(
name='Your-App',
version='0.1.0',
author='Your Name',
author_email='your@email',
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 your-app
source your-app/bin/activate
pip install -e .
您可以使用 unitests 标准模块运行测试。
要在test_function_a.py中导入模块,只需照常进行:
from folder_functions import function_a
更优雅的方法是from folderFunctions.folderTest import testFunctionA
并确保在folderTest
目录中有一个__init__.py
文件。你也可以看看这个问题