我正在尝试使用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
再次感谢。
答案 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 ..