我正在尝试为我的项目进行单元测试,但我在弄清楚绝对导入要测试的模块方面的错误所在时遇到问题。我使用 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
任何帮助将不胜感激!我觉得有一个非常简单的解决方案,但我一直忽略。我知道以前曾在这里提出过非常类似的问题,但我所看到的所有确定的解决方案都是我已经尝试过或目前正在做的。因此,如果这是一个重复的问题,我深表歉意。谢谢!
原因:
这是因为
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)
面板中的Python Test Log
通道中获取结果。OUTPUT
如果您调试(F5)测试,您可以将其添加到 launch.json 文件中:
“env”:{“PYTHONPATH”:“$ {workspaceFolder}”},
如果您在终端中使用命令运行测试。您应该修改测试文件中的
sys.path
:
sys.path.append("the path to the project_folder folder")
您必须将其添加到 test_reader.py 的开头
# test_reader.py
import sys
sys.path.append('/.../project_folder/code_files')
import reader
将
...
替换为具体路径,因此如果它位于 Windows 的桌面中,那么它将是 'C:/Users/USERNAME/Desktop/project_folder' 等等...