尝试在 Python 中进行单元测试时出现“ModuleNotFoundError:没有名为 ... 的模块”

Lev*_*ino 9 python directory unit-testing python-3.x visual-studio-code

问题

我正在尝试为我的项目进行单元测试,但是在确定绝对导入要测试的模块时出现错误的位置时遇到问题。我使用 Visual Studio Code 作为我的 IDE。

我的目录如下所示:

project_folder
+ code_files
- reader.py
- __init__.py
+ tests
- test_reader.py
- data.txt
- __init__.py

我的“test_reader.py”文件如下所示:

import unittest
from code_files.reader import Reader

class Test_LineCounter(unittest.TestCase):
def test_empty_file_long(self):
self.assertEqual(Reader.line_counter(self, "data.txt"), 4)

if __name__ == "__main__":
unittest.main()

但是,我不断收到错误:

ModuleNotFoundError: No module named 'code_files'

尝试的解决方案

说实话,当我进入这个项目时,我不太擅长使用目录、包或模块。我在线阅读了许多文章,并阅读了 Stack Overflow 和其他网站上的许多论坛帖子,试图找出可能导致此错误的原因以及如何解决它。通过这个,我觉得我对 Python 如何处理包和模块有了很好的理解。但我似乎仍然无法解决这个问题。

我尝试将“code_files”包放入不同的目录中,看看是否有效:

project_folder
+ app
+ code_files
- reader.py
- __init__.py

然后通过以下方式导入:

from app.code_files.reader import Reader

但后来我得到了错误:

ModuleNotFoundError: No module named 'app'

我唯一一次成功地让“test_reader”工作是当我的目录结构如下时:

project_folder
+ code_files
- reader.py
- __init__.py
+ test_reader.py
+ data.txt
+ __init__.py

最终意见

任何帮助将不胜感激!我觉得有一个非常简单的解决方案,但我一直忽略。我知道以前曾在这里提出过非常类似的问题,但我所看到的所有确定的解决方案都是我已经尝试过或正在做的。因此,如果这是一个重复的问题,我深表歉意。谢谢!

Ste*_*SFT 6

原因:

这是因为 的文件夹project_folder不在sys.path中。

指定模块搜索路径的字符串列表。从环境变量 PYTHONPATH 以及依赖于安装的默认值初始化。

在程序启动时初始化,此列表的第一项 path[0] 是包含用于 调用 Python 解释器的脚本的目录。

这可以解释您遇到的问题。

test_reader.py位于文件夹下时teststests文件夹将被添加到sys.path. 当test_reader.py位于文件夹下时project_folderproject_folder文件夹将被添加到sys.path. 然后python解释器就可以找到这个code_files包了。

解决方案:

你如何进行测试?如果您通过测试面板运行测试,您将不会遇到模块问题:

在此输入图像描述

并且它会自动将工作区文件夹添加到sys.path. 因此,建议以这种方式运行测试。

尖端:

如果你想得到sys.path,可以在pprint(sys.path) 后面加上self.assertEqual(Reader.line_counter(self, "data.txt"), 4)。但只能在Python Test Log面板的通道中得到结果OUTPUT

如果您调试 (F5) 测试,则可以将其添加到 launch.json 文件中:

"env": {"PYTHONPATH":"${workspaceFolder}"},

如果您在终端中使用命令运行测试。您应该修改sys.path测试文件中的:

sys.path.append("the path to the project_folder folder")
Run Code Online (Sandbox Code Playgroud)