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使用正确的解释器。