问题
我无法让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,
}
我尝试了什么
- 将以下内容添加到
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)
- 将包含以下内容的
.env
添加到project
,同时将"python.envFile": "${workspaceFolder}/afinad/.env"
添加到settings.json
,类似于此处建议的内容
PYTHONPATH = ./common
- 将带有
${workspaceFolder}/project/src
和.
的-t
选项添加到python.testing.unittestArgs
的settings.json
,如下所示:
"python.testing.unittestArgs": [
"-v",
"-s",
"${workspaceFolder}/project/tests",
"-p",
"test_*.py",
"-t",
"${workspaceFolder}/project/src"
],
- 在终端中更改为
./tests
后运行python3 -m unittest discover
会给我:
ModuleNotFoundError: No module named 'my_module'
感谢您抽出时间阅读。非常感谢您的帮助
经过近两天的尝试,我发现了自己的错误。看来,尽管我是个新手,我还是喜欢"阴影陷阱"这个名字。
最初,我打算在tests
中使用与在src
中相同的文件夹结构。然而,当我认为test_my_module.py
有效时,我将test_nested_module.py
从tests/common
移动到了tests
,但我没有删除文件夹tests/common
。这似乎导致了ModuleNotFoundError
,因为删除文件夹后,它可以按预期工作。
我希望这能为其他人节省一些时间。