2017-03-08 26 views
0

鉴于目录结构:为单位Python的相对路径测试

/home/user/python/mypacakge/src/foo.py 
/home/user/python/mypacakge/tests 
/home/user/python/mypacakge/tests/fixtures 
/home/user/python/mypacakge/tests/fixtures/config.json.sample 
/home/user/python/mypacakge/tests/foo_tests.py 
/home/user/python/mypacakge/README.md 

凡SRC包含源代码,测试包含了单元测试,我怎么设置一个“包”,让我相对进口是在位于test/的单元测试中使用可以在src/中加载类?

类似问题:Python Relative Imports and PackagesPython: relative imports without packages or modules,但第一个没有真正回答我的问题(或者我不明白它),第二个依赖于符号链接将它们一起(分别)破解。

+0

你的意思是简单地导入一个像这样的文件:'from .. import src.module'?然后加载模块中的任何类.. – nir0s

+0

也可以'从..src import module.class' btw – nir0s

+0

a)它似乎不是使用相对导入的最佳实践,b)我得到这个:ValueError:试图相对导入超出顶层包 – DrDamnit

回答

0

我想通了。

你必须有__init__.py像这样的文件夹中的每个

/home/user/python/mypackage/src/__init__.py 
/home/user/python/mypackage/src/Foo.py 
/home/user/python/mypackage/tests 
/home/user/python/mypackage/tests/fixtures 
/home/user/python/mypackage/tests/fixtures/config.json.sample 
/home/user/python/mypackage/tests/foo_test.py 
/home/user/python/mypackage/tests/__init__.py 
/home/user/python/mypackage/README.md 
/home/user/python/mypackage/__init__.py 

这告诉Python我们在每个目录包括顶级目录中有“a package”。所以,在这一点上,我有以下软件包:

mypackage 
mypackage.test 
mypackage.src 

所以,因为Python将只走“下到”目录中,我们必须从最顶层的包的根,执行单元测试,其在这种情况下是:

/home/user/python/mypackage/ 

所以,从这里,我可以执行Python,并告诉它执行单元测试模块,然后指定我希望它执行哪些测试通过指定使用command line options

模块
python -m unittest tests.foo_test.TestFoo 

这告诉蟒:

  1. 执行Python和加载模块单元测试
  2. 泰尔单元测试运行包含在类命名为testFoo测试,这是在文件foo_test.py,这是在测试目录。

Python能够找到它,因为__init__.py在这些目录中的每一个都将它们提升为一个python和unittest可以使用的包。

最后,foo_test.py必须包含一个import语句,如:

from src import Foo 

因为我们是从顶层目录执行,我们有包的设置每个子目录,在src包是可用命名空间,并且可以通过测试加载。