怎么用Python中的Unittest进行相对导入?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (103)

我试图使用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文件当前为空。

提问于
用户回答回答于

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

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 ..

更多详情请参阅单一文档

用户回答回答于

我只在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

扫码关注云+社区

领取腾讯云代金券