首页 文章

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

提问于
浏览
25

我正在尝试使用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?我还在验证这是否有效 .

编辑二:

为了澄清,此时我试图以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

再次感谢 .

2 回答

  • 2

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

    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 .

  • 16

    我运行同样的问题,凯的答案解决了它 . 我只想用 test.py 的内容补充他的答案(正如@gsanta所问) . 我只在Python 2.7上测试过它:

    from packages.tests import test_a, test_b
    import unittest
    
    # for test_a
    unittest.main(test_a)
    
    # for test_b
    unittest.main(test_a)
    

    那么你可以

    ../project $ python test.py
    

相关问题