我有一个由Gradle管理的相对复杂的项目。大多数模块都是基于Java的,所以我使用IntelliJ(而不是PyCharm)作为IDE。 Python插件适用于一个Python模块,除了我无法使单元测试工作。
目录结构大致如下:
project_root
|- aJavaModule
| |- ...
|- anotherJavaModule
| |- ...
|- python_module/
| |- src/
| |- __init__.py
| |- util.py
| |- test/
| |- __init__.py
| |- util.py
| ...
test/util.py
文件是这样的:
import unittest
from util import util_func
class TestUtilities(unittest.TestCase):
def test_util_func(self):
...
为Python模块设置了一个特定的虚拟环境。这在Project Structure -> Facets -> python_module
中配置为Python解释器。我相信这是按预期工作的,因为在IDE中工作时,它可以正确地查找相关文件,依赖库等。
事实上,如果我在test/util.py
,IDE会识别from util import util_func
:我可以点击查看正确的等等。
如果我右键单击测试类并Create Run/Debug Configuration
我可以设置所有这些。在此模式中,它包含Add content roots to PYTHONPATH
和Add source roots to PYTHONPATH
,因此可能会找到src
和test
目录。 (请注意,python_module/src
在项目结构模式中被标记为源根。)我尝试选择特定的脚本作为测试,文件夹中的所有内容等等。我也尝试移动{{1在test
目录之外的目录,并将其标记为测试目录。同样,IDE可以在编辑文件时找到类,但是当我运行测试时它无法进行。
具体来说,当我运行测试时,我得到了这个:
src
如何让IDE测试运行器识别正确的环境和路径变量,我需要做些什么? (简单地切换到PyCharm不是一种选择。)
输出系统路径(Testing started at 5:39 PM ...
Traceback (most recent call last):
File "/Users/nathanielford/Library/Application Support/IntelliJIdea2016.3/python/helpers/pycharm/utrunner.py", line 172, in <module>
module = loadSource(a[0])
File "/Users/nathanielford/Library/Application Support/IntelliJIdea2016.3/python/helpers/pycharm/utrunner.py", line 65, in loadSource
module = imp.load_source(moduleName, fileName)
File "/Users/nathanielford/virtualenvironments/ideenv/lib/python3.5/imp.py", line 172, in load_source
module = _load(spec)
File "<frozen importlib._bootstrap>", line 693, in _load
File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 665, in exec_module
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "/Users/nathanielford/repos/project_root/python_module/src/tests/util.py", line 2, in <module>
from util import util_func
ImportError: cannot import name 'util_func'
Process finished with exit code 1
)我得到以下内容:
sys.path
这似乎表明System path=['/Users/nathanielford/repos/project_root/python_module/src/tests', '/Users/nathanielford/repos/project_root/python_module/src', '/Users/nathanielford/repos/project_root/python_module', '/Users/nathanielford/Library/Application Support/IntelliJIdea2016.3/python/helpers/pycharm', '/Users/nathanielford/virtualenvironments/ideenv/lib/python35.zip', '/Users/nathanielford/virtualenvironments/ideenv/lib/python3.5', '/Users/nathanielford/virtualenvironments/ideenv/lib/python3.5/plat-darwin', '/Users/nathanielford/virtualenvironments/ideenv/lib/python3.5/lib-dynload', '/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5', '/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin', '/Users/nathanielford/virtualenvironments/ideenv/lib/python3.5/site-packages']
目录实际上已被发现?那么该目录中的所有内容都应该可用?
答案 0 :(得分:1)
问题是由Python中的命名空间引起的。由于您的测试和正在测试的文件都被命名为&#39; util.py&#39;,Python从Python路径中遇到的第一个导入。
由于测试目录位于该路径变量中的父目录之前,因此它将尝试从测试本身导入,而该测试本身并未定义该函数。
只需将测试重命名为&#34; test_util.py&#34;将解决命名空间问题