Python 单元测试:Visual Studio 代码中未发现测试
Python Unittest: No tests discovered in Visual Studio Code
我正在尝试使 Visual Studio 代码单元测试的自我 运行 feature 正常工作。
我最近对我的 Python 项目的目录结构进行了更改,该目录结构以前是这样的:
myproje\
domain\
__init__.py
repositories\
tests\
__init__.py
guardstest.py
utils\
__init__.py
guards.py
web\
我的单元测试设置是这样的:
"python.unitTest.unittestArgs": [
"-v",
"-s",
"tests",
"-p",
"*test*.py"
]
修改后的项目结构如下:
myprojet\
app\
controllers\
__init__.py
models\
__init__.py
entities.py
enums.py
tests\
res\
image1.png
image2.png
__init__.py
guardstest.py
utils\
__init__.py
guards.py
views\
static\
templnates\
__init__.py
uml\
此后扩展程序不再发现我的测试。我尝试将“-s”参数更改为 "./app/tests"
、".tests"
、"./tests"
、"app/tests"
、"/app/tests"
、"app.tests"
,但未成功.
问题是我在测试模块中使用了相对导入 (from ..utils import guards
)。
我只是将其更改为绝对导入 (from app.utils import guards
) 并且它再次起作用。
这是因为测试中的某些导入是不可发现的。当运行python -m unittest -h
时,输出的最后一行是
For test discovery all test modules must be importable from the top level directory of the project.
很可能VSCode是运行命令没有正确的PYTHONPATH和其他环境变量。
我创建了 __init__.py
并将以下代码放入其中。
import sys
import os
import unittest
# set module path for testing
sys.path.insert(0, "path_in_PYTHONPATH")
# repead to include all paths
class TestBase(unittest.TestCase):
def __init__(self, methodName: str) -> None:
super().__init__(methodName=methodName)
然后在测试文件中,不要扩展 unittest.TestCase,而是执行
from test import TestBase
class Test_A(TestBase):
...
这可能不起作用的原因有 2 个:
测试有误
如果测试脚本中有错误,python Testing
插件将找不到您的测试。
要检查潜在错误,请单击 Show Test Output
,然后单击 运行 使用 Run All Tests
的测试(两个按钮都位于左上角,就在测试应在的上方出现)。
如果有错误,将出现在 OUTPUT
选项卡中。
测试配置不正确
检查你的 .vscode/settings.json
,然后选择 python.testing.unittestArgs
列表。
您可以通过在命令行中向 python3 -m unittest discover
命令添加 args 来调试命令行中测试的发现。
因此使用此配置:
{
"python.testing.unittestArgs": [
"-v",
"-s",
".",
"-p",
"*test*.py"
]
}
您将启动命令:
python3 -m unittest discover -v -s . -p "*test*.py"
您可以在发现测试之前使用参数,并相应地修改 .vscode/settings.json
中的参数。
Here are the docs 对于 unittest
备注
一个常见的原因是您正在尝试 运行 测试依赖关系。如果是这种情况,您可以 select 通过 运行ning ctrl
+ shift
+ p
并搜索 Python: Select Interpreter
,然后 select使用正确的解释器。
我正在尝试使 Visual Studio 代码单元测试的自我 运行 feature 正常工作。 我最近对我的 Python 项目的目录结构进行了更改,该目录结构以前是这样的:
myproje\
domain\
__init__.py
repositories\
tests\
__init__.py
guardstest.py
utils\
__init__.py
guards.py
web\
我的单元测试设置是这样的:
"python.unitTest.unittestArgs": [
"-v",
"-s",
"tests",
"-p",
"*test*.py"
]
修改后的项目结构如下:
myprojet\
app\
controllers\
__init__.py
models\
__init__.py
entities.py
enums.py
tests\
res\
image1.png
image2.png
__init__.py
guardstest.py
utils\
__init__.py
guards.py
views\
static\
templnates\
__init__.py
uml\
此后扩展程序不再发现我的测试。我尝试将“-s”参数更改为 "./app/tests"
、".tests"
、"./tests"
、"app/tests"
、"/app/tests"
、"app.tests"
,但未成功.
问题是我在测试模块中使用了相对导入 (from ..utils import guards
)。
我只是将其更改为绝对导入 (from app.utils import guards
) 并且它再次起作用。
这是因为测试中的某些导入是不可发现的。当运行python -m unittest -h
时,输出的最后一行是
For test discovery all test modules must be importable from the top level directory of the project.
很可能VSCode是运行命令没有正确的PYTHONPATH和其他环境变量。
我创建了 __init__.py
并将以下代码放入其中。
import sys
import os
import unittest
# set module path for testing
sys.path.insert(0, "path_in_PYTHONPATH")
# repead to include all paths
class TestBase(unittest.TestCase):
def __init__(self, methodName: str) -> None:
super().__init__(methodName=methodName)
然后在测试文件中,不要扩展 unittest.TestCase,而是执行
from test import TestBase
class Test_A(TestBase):
...
这可能不起作用的原因有 2 个:
测试有误
如果测试脚本中有错误,python Testing
插件将找不到您的测试。
要检查潜在错误,请单击 Show Test Output
,然后单击 运行 使用 Run All Tests
的测试(两个按钮都位于左上角,就在测试应在的上方出现)。
如果有错误,将出现在 OUTPUT
选项卡中。
测试配置不正确
检查你的 .vscode/settings.json
,然后选择 python.testing.unittestArgs
列表。
您可以通过在命令行中向 python3 -m unittest discover
命令添加 args 来调试命令行中测试的发现。
因此使用此配置:
{
"python.testing.unittestArgs": [
"-v",
"-s",
".",
"-p",
"*test*.py"
]
}
您将启动命令:
python3 -m unittest discover -v -s . -p "*test*.py"
您可以在发现测试之前使用参数,并相应地修改 .vscode/settings.json
中的参数。
Here are the docs 对于 unittest
备注
一个常见的原因是您正在尝试 运行 测试依赖关系。如果是这种情况,您可以 select 通过 运行ning ctrl
+ shift
+ p
并搜索 Python: Select Interpreter
,然后 select使用正确的解释器。