【问题标题】:"ModuleNotFoundError: No module named ..." when trying to make unit tests in Python尝试在 Python 中进行单元测试时出现“ModuleNotFoundError: No module named ...”
【发布时间】:2021-07-30 00:58:21
【问题描述】:

问题

我正在尝试为我的项目进行单元测试,但在确定我的错误与绝对导入模块以进行测试有关的问题时遇到了问题。我使用 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

最后的评论

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

【问题讨论】:

  • Run the tests from project_folder,不要直接调用tests中的模块!
  • 只是一个快速提示:您可以将代码块放在代码围栏中而不是代码示例中

标签: python python-3.x unit-testing visual-studio-code directory


【解决方案1】:

原因:

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

指定模块搜索路径的字符串列表。 从环境变量 PYTHONPATH 初始化,加上一个 安装依赖的默认值。

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

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

test_reader.py 位于tests 文件夹下时,tests 文件夹将添加到sys.path。当test_reader.py 位于project_folder 文件夹下时,project_folder 文件夹将添加到sys.path。然后python解释器可以找到code_files包。

解决方案:

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

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

提示:

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

如果你调试(F5)测试,你可以在launch.json文件中添加这个:

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

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

sys.path.append("the path to the project_folder folder")

【讨论】:

  • @Levino 希望听到您的回复。
  • 虽然您提供的解决方案是正确的,但在我的情况下它不起作用,因为我在通过测试面板运行测试时仍然遇到问题(Python:Discover Tests 无法找到测试 -我也应该在我的原始帖子中提到这一点)。最终为我工作的是在我的测试文件的开头放置:“sys.path.append(”..“)”,然后使用“from code_files.reader import Reader”导入我的代码。你给出的理由非常有帮助,这让我走上了正确的轨道,找到了我正在寻找的答案。谢谢!
【解决方案2】:

您必须将它添加到 test_reader.py 的开头

# test_reader.py
import sys
sys.path.append('/.../project_folder/code_files')
import reader

... 替换为具体路径,因此如果它在 Windows 上的桌面中,那么它将是 'C:/Users/USERNAME/Desktop/project_folder' 等等...

Here is a link to further information

【讨论】:

  • 这只是一个解决方案,如果你只想在你的机器上运行它。一旦部署到 CI/CD 服务器,这将无法正常工作。
猜你喜欢
  • 2023-03-03
  • 2013-03-09
  • 1970-01-01
  • 2022-12-19
  • 2020-02-15
  • 2022-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多