在Intellij中为Python配置Unittest

时间:2017-01-24 01:41:49

标签: python intellij-idea

我有一个由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 PYTHONPATHAdd source roots to PYTHONPATH,因此可能会找到srctest目录。 (请注意,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'] 目录实际上已被发现?那么该目录中的所有内容都应该可用?

1 个答案:

答案 0 :(得分:1)

问题是由Python中的命名空间引起的。由于您的测试和正在测试的文件都被命名为&#39; util.py&#39;,Python从Python路径中遇到的第一个导入。

由于测试目录位于该路径变量中的父目录之前,因此它将尝试从测试本身导入,而该测试本身并未定义该函数。

只需将测试重命名为&#34; test_util.py&#34;将解决命名空间问题