在Python中使用unittest进行相对导入

时间:2014-01-31 21:59:25

标签: python python-import python-unittest

我正在尝试使用Python单元测试和相对导入,我似乎无法弄明白。我知道有很多相关的问题,但到目前为止他们都没有帮助。对不起,如果这是重复的,但我真的很感激任何帮助。我试图使用PEP 328 http://www.python.org/dev/peps/pep-0328/的语法,但我一定有错。

我的目录结构是:

project/
    __init__.py
    main_program.py
    lib/
        __init__.py
        lib_a
        lib_b
    tests/
        __init__.py
        test_a
        test_b

我使用以下方式运行测试:

python -m unittest test_module1 test_module2

test_a需要导入lib / lib_a和main_program。这是我试图用于导入的test_a代码:

from ..lib import lib_a as lib
from ...project import main_program

都引发了这个错误:

ValueError: Attempted relative import in non-package

我的所有 init .py文件目前都是空的。

非常感谢任何具体的建议!!

编辑:

这可能就是答案:Python Packages? 我还在核实这是否有效。

编辑II:

为了澄清,此时我试图以3种不同的方式运行我的测试文件:

project/tests $ python -m unittest test_a
project/tests $ python -m test_a
project/tests $ ./test_a

所有三个都失败并出现与上述相同的错误。当我在项目目录中使用相同的三种语法时,我收到此错误:

ValueError: Attempted relative import beyond toplevel package

再次感谢。

3 个答案:

答案 0 :(得分:16)

根据我的经验,如果您的项目根不是包,那么这是最简单的,如下所示:

project/
  test.py
  run.py
  package/
    __init__.py
    main_program.py
    lib/
      __init__.py
      lib_a
      lib_b
    tests/
      __init__.py
      test_a
      test_b

但是,从python 3.2开始,unittest模块提供了-t选项,允许您设置顶级目录,这样就可以(从package/开始):

python -m unittest discover -t ..

unittest docs的更多详情。

答案 1 :(得分:2)

我遇到同样的问题,凯的答案解决了它。我只想用+-------+-------+ | type | count | +-------+-------+ | A3-A2 | 2 | | C2-A3 | 1 | +-------+-------+ (如@gsanta问的话)的内容补充他的回答。我只在Python 2.7上测试过它:

test.py

然后你可以

from packages.tests import test_a, test_b
import unittest

# for test_a
unittest.main(test_a)

# for test_b
unittest.main(test_a)

答案 2 :(得分:0)

test package 位于同级的布局中:

/project
   /tests
   /package

一种方法是在 package 目录中启动,使用 -s 仅在 tests 中发现,然后使用 -t 设置最高级别:

../package $ python3 -m unittest discover -s ../tests -t ..