给定目录结构:
/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包含单元测试,如何设置"包"以便在test/
中的单元测试中使用的相对导入可以加载src/
中的类?
类似的问题:Python Relative Imports and Packages和Python: relative imports without packages or modules,但第一个问题并没有真正回答我的问题(或者我不理解它),第二个依赖于符号链接来破解它一起(分别)。
答案 0 :(得分: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并告诉它执行unittest模块,然后通过使用command line options 指定模块,指定我希望它执行哪些测试p>
python -m unittest tests.foo_test.TestFoo
这告诉python:
Python能够找到它,因为每个目录中的__init__.py
都将它们提升为python和unittest可以使用的包。
最后,foo_test.py
必须包含一个导入语句,如:
from src import Foo
因为我们是从顶级目录执行的,并且我们为每个子目录设置了包,所以src包在命名空间中可用,并且可以通过测试加载。