我正在尝试使用Python单元测试和相对导入,但我似乎无法理解它。我知道有很多相关的问题,但到目前为止,这些问题都没有帮助。如果这是重复的,我很抱歉,但我真的很感激任何帮助。我试图使用PEP328 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
我所有的初始化.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
再次感谢。
发布于 2014-03-03 22:48:53
根据我的经验,如果你的项目根目录不是一个包,这是最简单的,如下所示:
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
然而,从Python3.2开始,unittest模块提供了-t
选项,它允许您设置顶级目录,因此您可以(从package/
):
python -m unittest discover -t ..
更多细节请访问unittest docs。
发布于 2017-10-27 02:49:51
我遇到了同样的问题,凯的答案解决了它。我只是想用test.py
的内容来补充他的回答(正如@gsanta所问的那样)。我只在Python 2.7上测试过:
from packages.tests import test_a, test_b
import unittest
# for test_a
unittest.main(test_a, exit=False)
# for test_b
unittest.main(test_b)
然后你就可以
../project $ python test.py
发布于 2020-01-23 08:51:18
在测试和包位于同级级别的布局中:
/project
/tests
/package
一种方法是在包目录中开始,使用-s仅在测试中发现,并使用-t设置顶级:
../package $ python3 -m unittest discover -s ../tests -t ..
https://stackoverflow.com/questions/21490860
复制相似问题