如何让VSCodePython扩展在运行单元测试用例时识别子模块



问题

我无法让VSCode/unittest识别我为其编写单元测试的子模块(即后台示例中的common.nested_module)。

VSCode发现测试用例并执行test_my_module.py中的测试用例,但抱怨test_nested_module.py中的import语句行上没有模块common.nested_module(在输出:ModuleNotFoundError: No module named 'common.nested_module'中)。

我将print(sys.path)添加到执行的测试用例中,在Python测试日志中,当添加.env文件时,我甚至得到了以下输出,如下所述

test_get_version (test_my_module.TestCase1) ... ['/workspaces/test_project/project/tests', '/workspaces/test_project/project/src', '/workspaces/test_project/project/common', '/usr/local/lib/python39.zip', '/usr/local/lib/python3.9', '/usr/local/lib/python3.9/lib-dynload', '/home/vscode/.local/lib/python3.9/site-packages', '/usr/local/lib/python3.9/site-packages']

背景

根据PyPA的打包和分发教程,我创建了一个项目结构,省略了其他细节(例如README.md),如下所示:

project
|--src
|--common
|-- __init__.py
|-- nested_module.py
|-- __init__.py
|-- my_module.py
|--tests
|--__init__.py
|--test_my_module.py
|--test_nested_module.py

settings.json:中与测试相关的设置

{
"python.testing.unittestArgs": [
"-v",
"-s",
"${workspaceFolder}/project/tests",
"-p",
"test_*.py"
],
"python.testing.cwd": "project/src",
"python.testing.pytestEnabled": false,
"python.testing.unittestEnabled": true,
}

我尝试了什么

  1. 将以下内容添加到project/tests中的__init__.py以及此处建议的test_nested_module.py

import os
import sys
PROJECT_PATH = os.getcwd()
SOURCE_PATH = os.path.join(
PROJECT_PATH,"project/src/common"
)
sys.path.append(SOURCE_PATH)
  1. 将包含以下内容的.env添加到project,同时将"python.envFile": "${workspaceFolder}/afinad/.env"添加到settings.json,类似于此处建议的内容
PYTHONPATH = ./common
  1. 将带有${workspaceFolder}/project/src.-t选项添加到python.testing.unittestArgssettings.json,如下所示:

"python.testing.unittestArgs": [
"-v",
"-s",
"${workspaceFolder}/project/tests",
"-p",
"test_*.py",
"-t",
"${workspaceFolder}/project/src"
],
  1. 在终端中更改为./tests后运行python3 -m unittest discover会给我:
ModuleNotFoundError: No module named 'my_module'

感谢您抽出时间阅读。非常感谢您的帮助

经过近两天的尝试,我发现了自己的错误。看来,尽管我是个新手,我还是喜欢"阴影陷阱"这个名字。

最初,我打算在tests中使用与在src中相同的文件夹结构。然而,当我认为test_my_module.py有效时,我将test_nested_module.pytests/common移动到了tests,但我没有删除文件夹tests/common。这似乎导致了ModuleNotFoundError,因为删除文件夹后,它可以按预期工作。

我希望这能为其他人节省一些时间。

最新更新