在 Visual Studio Code 中进行 Python 测试
Python 扩展 基于 VS Code 的内置 测试功能 构建,并为 Python 内置的 unittest 框架和 pytest 提供测试发现、测试覆盖率以及运行和调试测试的功能。
配置测试
安装 Python 扩展并在编辑器中打开 Python 文件后,VS Code 活动栏上会显示一个测试烧杯图标,代表测试资源管理器视图。如果未启用测试框架,打开测试资源管理器会显示一个配置 Python 测试按钮。选择配置 Python 测试会提示您选择一个测试框架和包含测试的文件夹。如果您使用 unittest,还需要选择用于标识测试文件的文件 glob 模式。
文件 glob 模式是一种定义的字符串模式,它基于通配符匹配文件或文件夹名称,以包含或排除文件。
随时可以通过 命令面板 中的 Python: Configure Tests 命令配置测试,或者通过在设置编辑器或 settings.json
文件中设置 python.testing.unittestEnabled
或 python.testing.pytestEnabled
来配置测试,如 VS Code 设置 文档中所述。每个框架还有特定的配置设置,用于指定文件夹和模式,如测试配置设置下所述。
如果启用 pytest 且当前活动环境中未安装它,Python 扩展会尝试在后台安装它。此外,如果同时启用两个框架,Python 扩展只运行 pytest
。
Python 扩展支持的 pytest 最低版本为 7.0.0。
测试发现
默认情况下,一旦启用测试框架,Python 扩展就会尝试发现测试。您可以随时使用命令面板中的 Test: Refresh Tests 命令触发测试发现。
python.testing.autoTestDiscoverOnSaveEnabled
默认设置为 true
,这意味着无论何时在工作区中添加、删除或更新任何 Python 文件,都会自动进行测试发现。要禁用此功能,请将值设置为 false
,这可以在设置编辑器或 settings.json
文件中完成,如 VS Code 设置 文档中所述。需要重新加载窗口此设置才能生效。如需更精细地控制自动测试发现中包含的文件,请调整 python.testing.autoTestDiscoverOnSavePattern
设置,其默认值为 **/*.py
。
测试发现会应用当前框架的发现模式(可以使用测试配置设置进行自定义)。默认行为如下:
-
python.testing.unittestArgs
: 在项目顶层文件夹中查找名称中包含“test”的任何 Python (.py
) 文件。所有测试文件必须是可导入的模块或包。您可以使用-p
配置设置自定义文件匹配模式,使用-t
设置自定义文件夹。 -
python.testing.pytestArgs
: 在当前文件夹及其所有子文件夹中查找名称以“test_”开头或以“_test”结尾的任何 Python (.py
) 文件。
有时,放置在子文件夹中的测试无法被发现,因为这些测试文件无法导入。要使其可导入,请在该文件夹中创建一个名为 __init__.py
的空文件。
如果测试发现成功,您将在测试资源管理器中看到列出的测试:
当直接从测试资源管理器触发测试发现时,您还可以取消正在进行的测试发现调用。使用取消按钮,它在发现过程中会替换刷新按钮。
如果发现失败(例如,未安装测试框架或测试文件中存在语法错误),您将在测试资源管理器中看到错误消息,其中包括指向日志的链接。您可以检查Python输出面板以查看完整的错误消息(使用视图 > 输出菜单命令显示输出面板,然后从右侧的下拉列表中选择Python)。
运行测试
您可以使用以下任何操作运行测试:
-
打开测试文件后,选择显示在测试定义行旁边的绿色运行图标,如上一节所示。此命令仅运行该单个方法。
-
通过命令面板,运行以下任何命令:
- Test: Run All Tests - 运行所有已发现的测试。
- Test: Run Tests in Current File - 运行编辑器中当前打开文件中的所有测试。
- Test: Run Test at Cursor - 只运行编辑器中光标下的测试方法。
-
从测试资源管理器中
-
要运行所有已发现的测试,请选择测试资源管理器顶部的播放按钮。
-
要运行特定组的测试或单个测试,请选择文件、类或测试,然后选择该项目右侧的播放按钮。
-
您还可以通过测试资源管理器运行选定的测试。为此,请在您希望运行的测试上按住 Ctrl 并单击(macOS 上为 Cmd 并单击),右键单击其中一个测试,然后选择 运行测试。
-
测试运行后,VS Code 会在编辑器中以边栏装饰形式直接显示结果。失败的测试也会在编辑器中高亮显示,并显示一个 Peek View,其中包含测试运行错误消息以及所有测试运行的历史记录。您可以按 Escape 关闭此视图,也可以通过打开用户设置(在命令面板中执行 Preferences: Open Settings (UI) 命令)并将 Testing: Automatically Open Peek View 设置的值更改为 never
来禁用它。
在测试资源管理器中,会显示单个测试以及包含这些测试的任何类和文件的结果。如果文件夹中的任何测试未通过,该文件夹将显示一个失败图标。
VS Code 还在测试结果面板中显示测试结果。
运行带有覆盖率的测试
要运行带有覆盖率的测试,请在测试资源管理器中选择覆盖率运行图标,或从您通常触发测试运行的任何菜单中选择运行带覆盖率选项。如果您使用 pytest,Python 扩展会使用 pytest-cov
插件运行覆盖率;如果使用 unittest,则使用 coverage.py
。
在运行带有覆盖率的测试之前,请确保为您的项目安装了正确的测试覆盖率包。分支覆盖率仅在 coverage 版本 >= 7.7 时受支持。
覆盖率运行完成后,编辑器中会高亮显示行,表示行级覆盖率。测试覆盖率结果会作为“测试覆盖率”子选项卡显示在测试资源管理器中,您也可以通过命令面板中的 Testing: Focus on Test Coverage View 命令导航到该选项卡(⇧⌘P (Windows, Linux Ctrl+Shift+P))。在该面板上,您可以查看工作区中每个文件和文件夹的行覆盖率指标,以及相关的分支覆盖率。
在使用 pytest 时,如需更精细地控制覆盖率运行,您可以编辑 python.testing.pytestArgs
设置以包含您的规范。当 python.testing.pytestArgs
中存在 pytest 参数 --cov
时,Python 扩展不会对覆盖率参数进行额外编辑,以使您的自定义设置生效。如果未找到 --cov
参数,扩展将在运行前向 pytest 参数添加 --cov=.
,以便在工作区根目录启用覆盖率。
有关测试覆盖率的更多信息,请访问 VS Code 的测试覆盖率文档。
调试测试
要调试测试,右键单击函数定义旁的边栏装饰并选择调试测试,或在测试资源管理器中选择该测试旁的调试测试图标。
运行或调试测试不会自动保存测试文件。运行测试前务必保存对测试的更改,否则您很可能会对结果感到困惑,因为它们仍然反映的是文件的先前版本!
您可以使用命令面板中的以下命令调试测试:
- Test: Debug All Tests - 启动工作区中所有测试的调试器。
- Test: Debug Tests in Current File - 启动编辑器中当前打开文件中的测试的调试器。
- Test: Debug Test at Cursor - 仅针对光标位于编辑器的测试方法启动调试器。您也可以使用测试资源管理器中的调试测试图标来启动选定范围内的所有测试和所有已发现测试的调试器。
您还可以通过更改 settings.json
文件中 testing.defaultGutterClickAction
设置的值为 debug
,将单击边栏装饰的默认行为更改为调试测试而不是运行测试。
调试器对测试与对其他 Python 代码一样工作,包括断点、变量检查等。要自定义调试测试的设置,您可以在工作区 .vscode
文件夹中的 launch.json
或 settings.json
文件中通过在配置中添加 "purpose": ["debug-test"]
来指定测试调试配置。当您运行 Test: Debug All Tests、Test: Debug Tests in Current File 和 Test: Debug Test at Cursor 命令时,将使用此配置。
例如,launch.json
文件中以下配置禁用了调试测试的 justMyCode
设置:
{
"name": "Python: Debug Tests",
"type": "debugpy",
"request": "launch",
"program": "${file}",
"purpose": ["debug-test"],
"console": "integratedTerminal",
"justMyCode": false
}
如果您的配置条目中包含多个带有 "purpose": ["debug-test"]
的项,则将使用第一个定义,因为我们目前不支持此请求类型的多个定义。
有关调试的更多信息或了解其在 VS Code 中的工作原理,请阅读 Python 调试配置和 VS Code 通用调试文章。
并行运行测试
通过 pytest-xdist
包支持使用 pytest 并行运行测试。访问其文档,了解如何使用 pytest-xdist
的更多信息。
启用 xdist
且未在参数中指定工作程序计数时,Python 扩展会根据在测试资源管理器中选择的测试数量自动优化工作程序数量。
Django 单元测试
Python 扩展还支持发现和运行 Django 单元测试!只需几个额外的设置步骤即可发现您的 Django 测试:
- 在您的
settings.json
文件中设置"python.testing.unittestEnabled": true,
。 - 将
MANAGE_PY_PATH
添加为环境变量- 在您的项目根目录创建一个
.env
文件。 - 将
MANAGE_PY_PATH='<path-to-manage.py>'
添加到.env
文件中,将<path-to-manage.py>
替换为您应用程序的manage.py
文件的路径。提示:您可以通过在资源管理器视图中右键单击文件并选择复制路径来复制路径。
- 在您的项目根目录创建一个
- 根据需要在
settings.json
文件的"python.testing.unittestArgs": []
中添加 Django 测试参数,并删除任何与 Django 不兼容的参数。
默认情况下,Python 扩展会在项目根目录查找并加载 .env
文件。如果您的 .env
文件不在项目根目录或您正在使用 VS Code 变量替换,请在您的 settings.json
文件中添加 "python.envFile": "${workspaceFolder}/<path-to-.env>"
。这将使 Python 扩展在运行和发现测试时能够从此文件加载环境变量。获取有关 Python 环境变量的更多信息。
导航到“测试”视图,然后选择刷新测试按钮以显示您的 Django 测试!
故障排除
如果您的 Django 单元测试未显示在“测试”视图中,请尝试以下故障排除步骤:
- 在Python输出面板中搜索错误消息。它们可能会提供关于测试未被发现的原因的提示。
- 尝试在终端中运行 Django 测试。然后将相同的命令“翻译”到 VS Code 设置中。例如,如果您在终端中运行
python manage.py test --arg
,则将MANAGE_PY_PATH='./manage.py'
添加到.env
文件中,并在 VS Code 设置中设置"python.testing.unittestArgs": [--arg]
。或者,您还可以在Python输出面板中找到 Python 扩展运行的命令。 - 如果最初使用相对路径,请在设置
MANAGE_PY_PATH
环境变量时使用manage.py
文件的绝对路径。
测试命令
以下是使用 VS Code 中的 Python 扩展支持的所有测试命令。这些命令都可以通过命令面板找到:
命令名称 | 描述 |
---|---|
Python: Configure Tests | 配置用于 Python 扩展的测试框架。 |
Test: Clear All Results | 清除所有测试状态,因为 UI 会跨会话保留测试结果。 |
Test: Debug All Tests | 调试所有已发现的测试。在 2021.9 版本之前,相当于 Python: Debug All Tests。 |
Test: Debug Failed Tests | 调试最近一次测试运行中失败的测试。 |
Test: Debug Last Run | 调试最近一次测试运行中执行的测试。 |
Test: Debug Test at Cursor | 调试编辑器中光标所在位置的测试方法。在 2021.9 版本之前,类似于 Python: Debug Test Method...。 |
Test: Debug Tests in Current File | 调试编辑器中当前焦点文件中的测试。 |
Test: Go to Next Test Failure | 如果错误速览视图已打开,则打开并移动到资源管理器中下一个失败测试的速览视图。 |
Test: Go to Previous Test Failure | 如果错误速览视图已打开,则打开并移动到资源管理器中上一个失败测试的速览视图。 |
Test: Peek Output | 为失败的测试方法打开错误速览视图。 |
Test: Refresh Tests | 执行测试发现并更新测试资源管理器以反映任何测试更改、添加或删除。在 2021.9 版本之前,类似于 Python: Discover Tests。 |
Test: Rerun Failed Tests | 运行最近一次测试运行中失败的测试。在 2021.9 版本之前,类似于 Python: Run Failed Tests。 |
Test: Rerun Last Run | 调试最近一次测试运行中执行的测试。 |
Test: Run All Tests | 运行所有已发现的测试。在 2021.9 版本之前,相当于 Python: Run All Tests。 |
Test: Run All Tests with Coverage | 运行所有已发现的测试并计算您的代码被测试覆盖的程度。 |
Test: Run Test at Cursor | 运行编辑器中光标所在位置的测试方法。在 2021.9 版本之前,类似于 Python: Run Test Method...。 |
Test: Run Test in Current File | 运行编辑器中当前焦点文件中的测试。在 2021.9 版本之前,相当于 Python: Run Current Test File。 |
Test: Show Output | 打开包含所有测试运行详细信息的输出面板。在 2021.9 版本之前,类似于 Python: Show Test Output。 |
Testing: Focus on Test Explorer View | 打开测试资源管理器视图。在 2021.9 版本之前,类似于 Testing: Focus on Python View。 |
Test: Stop Refreshing Tests | 取消测试发现。 |
测试配置设置
Python 测试的行为由 VS Code 提供的通用 UI 设置以及特定于 Python 和您所启用的测试框架的设置共同决定。
通用 UI 设置
影响测试功能 UI 的设置由 VS Code 本身提供,您可以在 VS Code 设置编辑器中搜索“Testing”找到它们。
通用 Python 设置
设置 (python.testing.) |
默认值 | 描述 |
---|---|---|
autoTestDiscoverOnSaveEnabled | true |
指定保存测试文件时是否启用或禁用自动运行测试发现。更改此设置后,可能需要重新加载窗口才能应用它。 |
cwd | null | 指定测试的可选工作目录。此设置的存在会动态调整 pytest 的 --rootdir 参数。 |
autoTestDiscoverOnSavePattern | **/*.py |
指定一个 glob 模式,该模式确定当 autoTestDiscoverOnSaveEnabled 为 true 时哪些文件更改会触发自动测试发现。 |
debugPort | 3000 |
用于调试 unittest 测试的端口号。 |
promptToConfigure | true |
指定如果发现潜在测试,VS Code 是否提示配置测试框架。 |
unittest 配置设置
Unittest 设置 (python.testing.) |
默认值 | 描述 |
---|---|---|
unittestEnabled | false |
指定是否启用 unittest 作为测试框架。应禁用 pytest 的等效设置。 |
unittestArgs | ["-v", "-s", ".", "-p", "*test*.py"] |
传递给 unittest 的参数,其中每个由空格分隔的元素是列表中的单独项。请参阅下文了解默认值的说明。 |
unittest 的默认参数如下:
-v
设置默认详细程度。删除此参数可获得更简单的输出。-s .
指定发现测试的起始目录。如果您的测试位于“test”文件夹中,请将参数更改为-s test
(表示参数数组中的"-s", "test"
)。-p *test*.py
是用于查找测试的发现模式。在本例中,它是包含单词“test”的任何.py
文件。如果您以不同的方式命名测试文件,例如在每个文件名后附加“_test”,则在数组的相应参数中使用类似*_test.py
的模式。
要在第一次失败时停止测试运行,请在参数数组中添加快速失败选项 "-f"
。
有关可用选项的完整列表,请参阅unittest 命令行接口。
pytest 配置设置
pytest 设置 (python.testing.) |
默认值 | 描述 |
---|---|---|
pytestEnabled | false |
指定是否启用 pytest 作为测试框架。应禁用 unittest 的等效设置。 |
pytestPath | "pytest" |
pytest 的路径。如果 pytest 位于当前环境之外,请使用完整路径。 |
pytestArgs | [] |
传递给 pytest 的参数,其中每个由空格分隔的元素是列表中的单独项。请参阅pytest 命令行选项。 |
pytest 的默认参数如下:
rootdir
根据工作区中python.testing.cwd
设置的存在情况动态调整。
您还可以使用 pytest.ini
文件配置 pytest,如pytest 配置中所述。
如果安装了 pytest-cov 覆盖率模块,VS Code 在调试时不会在断点处停止,因为 pytest-cov 使用了相同的技术访问正在运行的源代码。为防止此行为,在调试测试时在 pytestArgs
中包含 --no-cov
,例如通过将 "env": {"PYTEST_ADDOPTS": "--no-cov"}
添加到您的调试配置中。(有关如何设置启动配置,请参阅上面的调试测试。)(有关更多信息,请参阅 pytest-cov 文档中的调试器和 PyCharm。)
智能感知设置
智能感知设置 (python.analysis.) |
默认值 | 描述 |
---|---|---|
inlayHints.pytestParameters | false | 是否显示 pytest 夹具参数类型的内联提示。可接受的值为 true 或 false 。 |