单元测试的Python相对路径

时间:2017-03-08 17:56:12

标签: python unit-testing

给定目录结构:

/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 PackagesPython: relative imports without packages or modules,但第一个问题并没有真正回答我的问题(或者我不理解它),第二个依赖于符号链接来破解它一起(分别)。

1 个答案:

答案 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:

  1. 执行python并加载模块unittest
  2. 告诉单元测试运行TestFoo类中包含的测试,该测试位于测试目录中的文件foo_test.py中。
  3. Python能够找到它,因为每个目录中的__init__.py都将它们提升为python和unittest可以使用的包。

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

    from src import Foo
    

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