在 Python3 中导入错误 运行 单元测试

Import error running unittest in Python3

我在 Python 3.6 中导入文件时遇到问题。我的目录树如下所示:

project/
    app/
    ├── __init__.py
    ├── a.py
    └── b.py
    test/
    ├── __init__.py
    ├── test_a.py
    └── test_b.py

b.py:

中使用以下导入语句,我的应用程序运行正常(但是,测试没有运行)
from a import *

但是,在 b.py:

from .a import *

所以,我选择from a import *。像 python3 -m unittest 一样执行测试我总是得到以下错误:

E.
======================================================================
ERROR: tests.test_cell (unittest.loader._FailedTest)
----------------------------------------------------------------------
ImportError: Failed to import test module: tests.test_cell
Traceback (most recent call last):
  File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/loader.py", line 428, in _find_test_path
    module = self._get_module_from_name(name)
  File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/loader.py", line 369, in _get_module_from_name
    __import__(name)
  File "/Users/serrodcal/Repositories/project/tests/test_b.py", line 2, in <module>
    from app.b import *
  File "/Users/serrodcal/Repositories/project/app/b.py", line 1, in <module>
    from a import *
ModuleNotFoundError: No module named 'a'


----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (errors=1)

在这种情况下,我在 test_b.py 中的导入语句如下:

from unittest import TestCase
from app.cell import *

有什么办法可以解决这个问题吗?

我对 Python 中的导入以及 python 如何与模块一起工作感到困惑。

project/
    module/
        __init__.py
        a.py
        b.py
    test/
        test_a.py
        test_b.py
    main.py

这是我的新目录树。包含的文件是:

main.py中:

from module.b import Something

b.py中:

from .a import Something

a.py中:

from unittest import TestCase
from module.a import Something

test_b.py中:

from unittest import TestCase
from module.a import Something
from module.b import Something

像这样,很好用,应用和测试。

恕我直言,作为一种用户友好且直观的语言 Python,它的导入系统是我见过的最不友好的系统之一。

虽然丑陋,但我通常会做类似的事情 (python 3.6+):

try:
    from a import class_defined_in_a_py
except (ModuleNotFoundError, ImportError):
    from .a import class_defined_in_a_py

第一次导入适用于应用程序,第二次适用于测试。