在Visual Studio Code中进行Python测试
Python 扩展基于 VS Code 内置的测试功能,并为 Python 的内置unittest和pytest框架提供测试发现、测试覆盖、运行和调试测试的功能。
配置测试
当安装了Python扩展并在编辑器中打开Python文件时,VS Code活动栏中会显示一个测试烧杯图标,代表测试资源管理器视图。打开测试资源管理器会显示一个配置Python测试按钮,如果未启用测试框架。选择配置Python测试会提示您选择一个测试框架和一个包含测试的文件夹。如果您使用unittest,您还需要选择用于识别测试文件的文件通配符。
文件通配符模式是一种定义的字符串模式,它根据通配符来匹配文件或文件夹名称,以包括或不包括文件。

测试可以随时通过使用Python: 配置测试命令在命令面板中进行配置,或者通过设置python.testing.unittestEnabled或python.testing.pytest已启用在设置编辑器中或settings.json 文件如 VS Code 设置 文档中所述。每个框架也有特定的配置设置,如其文件夹和模式下所述 测试配置设置。
如果你启用 pytest 但当前激活的环境中未安装,Python 扩展将尝试在后台安装。此外,如果同时启用两个框架,Python 扩展将仅运行pytest输入:.
python扩展支持的pytest最低版本是7.0.0。
测试发现
默认情况下,Python扩展会在您启用一个框架后尝试发现测试。您可以随时使用命令面板中的测试:刷新测试命令来触发测试发现。
python.testing.autoTestDiscoverOnSaveEnabled设置为真默认情况下,这意味着每当您在工作区中添加、删除或更新任何Python文件时,都会自动发现测试。要禁用此功能,请将值设置为假,这可以在设置编辑器中或在 settings.json 文件如 VS Code 设置 文档中所述。您需要重新加载Windows才能使此设置生效。要对自动测试发现中包含的文件进行更多控制,请调整 python.testing.autoTestDiscoverOnSavePattern设置, 默认为**/*.py输入:.
测试发现应用了当前框架的发现模式(可以通过测试配置设置进行定制)。默认行为如下:
-
python.testing.unittestArgs寻找任何Python (.py在顶级项目文件夹中以“test”命名的文件。所有测试文件必须是可导入的模块或包。您可以使用自定义文件匹配模式-输入:p配置设置,并自定义文件夹输入:-t设置。 -
python.testing.pytestArgs寻找任何Python (.py) 文件名以 "test_" 开头或以 "_test" 结尾的文件,位于当前文件夹及其所有子文件夹的任何地方。
有时位于子文件夹中的测试不会被发现,因为这些测试文件无法导入。为了使它们可导入,请创建一个名为的空文件__init__.py在那个文件夹中。
如果测试发现成功,您将在测试资源管理器中看到列出的测试:

当直接从测试资源管理器触发测试发现时,您也可以取消正在进行的测试发现调用。使用取消按钮,该按钮在发现期间替换刷新按钮。

如果发现失败(例如,测试框架未安装或您的测试文件中存在语法错误),您将在测试资源管理器中看到错误消息,并包括指向日志的链接。您可以检查Python输出面板以查看完整的错误消息(使用视图 > 输出菜单命令显示输出面板,然后选择右侧下拉菜单中的Python)。

运行测试
您可以使用以下任何一种操作来运行测试:
-
打开测试文件后,选择显示在测试定义行旁边的 gutter 中的绿色运行图标,如前面章节所示。此命令仅运行该方法。

-
从命令面板中,运行以下任何命令:
- 测试:运行所有测试 - 运行所有已发现的测试。
- 测试:在当前文件中运行测试 - 在编辑器中打开的文件中运行所有测试。
- 测试:在光标处运行测试 - 仅在编辑器中光标下的测试方法运行。
-
从 测试浏览器:
-
要运行所有发现的测试,请在测试资源管理器顶部选择播放按钮:

-
要运行特定的测试组或单个测试,请选择文件、类或测试,然后选择该项目的右侧播放按钮:

-
你也可以通过测试浏览器运行一系列测试。要这样做,Ctrl+Click(或在macOS上Cmd+Click)点击你想要运行的测试,右键点击其中一个,然后选择运行测试。
-
经过测试运行后,VS Code 会在编辑器中直接显示结果作为行号标记。失败的测试也会在编辑器中高亮显示,并且有一个预览视图,显示测试运行错误消息和所有测试运行的历史记录。你可以按Escape键来关闭视图,并且你可以通过打开用户设置(在首选项:打开设置 (UI)命令中,在命令面板中打开)并更改测试:自动打开预览视图设置的值来禁用它。从不输入:.
在测试浏览器中,显示每个测试的结果以及包含这些测试的任何类和文件。如果文件夹中的任何测试未通过,则该文件夹将显示失败图标。

VS Code 也在 测试结果 面板中显示测试结果。

运行测试并覆盖
要启用代码覆盖运行测试,请在测试资源管理器中选择代码覆盖运行图标或从任何通常触发测试运行的菜单中选择带代码覆盖运行选项。Python 扩展使用pytest-覆盖插件如果你使用pytest,或者使用覆盖.py用于单元测试。
在运行测试覆盖之前,请确保为您的项目安装正确的测试覆盖包。 分支覆盖仅支持覆盖版本 >= 7.7。
一旦代码覆盖运行完成,编辑器中相应的行将会被高亮显示,以显示行级代码覆盖情况。测试覆盖结果会显示在测试资源管理器中的“测试覆盖”子标签页中,你也可以通过测试:关注测试覆盖视图 在命令面板中导航(⇧⌘P(Windows, Linux Ctrl+Shift+P))。在这个面板中,你可以查看工作区中每个文件和文件夹的行覆盖指标,如果有相关性的话,还可以查看分支覆盖指标。

在使用pytest时,为了对覆盖运行进行更精细的粒度控制,您可以编辑python.testing.pytestArgs设置包括您的规范。当 pytest 参数--覆盖存在于python.testing.pytestArgsPython 扩展将不会对 coverage args 进行任何额外的编辑,以允许您的自定义设置生效。如果不存在--覆盖发现参数,扩展将添加--覆盖=.在运行 pytest 之前,添加参数以在工作区根目录启用代码覆盖。
欲了解更多关于测试覆盖的信息,请访问 VS Code 的 测试覆盖文档.
调试测试
要调试测试,请右键单击函数定义旁边的 gutter 标记,并选择 调试测试,或者在 测试资源管理器 中选择该测试旁边的 调试测试 图标。

运行或调试测试不会自动保存测试文件。在运行测试之前,请务必保存测试的更改,否则您可能会因结果仍然反映文件的以前版本而感到困惑!
您可以在命令面板中使用以下命令来调试测试:
- 测试:调试所有测试 - 在你的工作区中启动调试器以调试所有测试。
- 测试:在当前文件中调试测试 - 为在您打开的编辑器中定义的测试启动调试器。
- 测试:在光标处进行调试测试 - 仅对编辑器中光标所在的的方法启动调试器。您还可以使用调试测试图标在测试资源管理器中启动调试器,以对选定范围内的所有测试和所有发现的测试进行调试。
您还可以通过更改来将点击 gutter decoration 的默认行为从运行测试更改为调试测试测试默认的边缘点击动作设置值为调试在你的settings.json文件。
调试器在测试和其他Python代码上工作方式相同,包括断点、变量检查等。要自定义测试调试的设置,您可以在以下位置指定测试调试配置launch.json或settings.json文件在.vscode从你的工作区添加文件夹"目的": ["调试测试"] 您的配置。当您运行 测试:调试所有测试、测试:调试当前文件中的测试 和 测试:在光标处调试测试 命令时,将使用此配置。
例如,下面的配置launch.json文件禁用了只是我的代码调试测试设置:
{
"name": "Python: 调试测试",
"type": "debugpy",
"request": "launch",
"program": "${file}",
"purpose": ["debug-test"],
"console": "integratedTerminal",
"justMyCode": false
}
如果您有多个配置条目"目的": ["调试测试"]由于我们目前不支持此请求类型的多个定义,将使用第一个定义。
如需更多有关调试的信息或了解VS Code中的工作原理,请阅读Python调试配置和VS Code的调试文章。
并行运行测试
通过 pytest 提供了并行运行测试的支持。pytest-xdist 包。访问他们的 文档,以获取有关如何使用的更多信息 pytest-xdist输入:.
当xdist如果启用并且在参数中没有指定工作线程的数量,Python 扩展将根据在测试资源管理器中选择了多少测试来自动优化工作线程的数量。
Django 单元测试
Python 扩展还提供发现和运行 Django 单元测试的支持!您只需通过几个额外的设置步骤即可让 Django 测试被发现:
- 设置
"python.testing.unittestEnabled": true,在你的settings.json文件. - 添加
管理_PY_PATH作为环境变量:- 创建一个
环境变量文件项目根目录下的文件。 - 添加
MANAGE_PY_PATH=''<路径到manage.py>''到环境变量文件文件,替换<路径到manage.py>与通向你应用程序的路径管理.py文件。提示:您可以通过在资源管理器视图中右键单击文件并选择复制路径来复制路径。
- 创建一个
- 添加Django测试参数到
"python.testing.unittestArgs": []在settings.json文件 根据需要,移除任何与Django不兼容的参数。
默认情况下,Python 扩展会查找并加载环境变量文件项目根目录下的文件。如果您的环境变量文件 文件不在项目根目录或您正在使用 VS Code 变量替换,请添加 "python.envFile": "${workspaceFolder}/<路径到.env文件>"到你的settings.json 文件。这使得Python扩展在运行和发现测试时能够从这个文件中加载环境变量。获取更多关于Python环境变量的信息。
导航到测试视图,并选择刷新测试按钮以显示您的Django测试!
故障排除
如果您的Django单元测试在测试视图中未显示,请尝试以下故障排除步骤:
- 在Python输出面板中搜索错误消息。它们可能会提供有关为什么您的测试未被发现的提示。
- 尝试在终端中运行Django测试。然后将相同的命令“翻译”到VS Code设置中。
例如,如果你运行
python manage.py 测试 --参数在终端中,你会添加MANAGE_PY_PATH='./manage.py'到一个环境变量文件文件,并设置"python.testing.unittestArgs": [--arg]在 VS Code 设置中。或者,您还可以在 Python 扩展运行的命令中找到这些命令,位于 Python 输出面板中。 - 使用绝对路径到
管理.py文件设置时管理_PY_PATH环境变量,如果你最初使用了相对路径。
测试命令
以下是 VS Code 中 Python 扩展支持的所有测试命令。这些命令都可以通过命令面板找到:
| 命令名称 | 描述 |
|---|---|
| Python: 配置测试 | 配置测试框架以与Python扩展一起使用。 |
| 测试:清除所有结果 | 清除所有测试状态,因为UI在会话之间保留测试结果。 |
| 测试:调试所有测试 | 调试所有发现的测试。等同于Python: 调试所有测试在2021.9之前的版本上。 |
| 测试:调试失败的测试 | 调试最近测试运行中失败的测试。 |
| 测试:调试上次运行 | 调试最近一次测试运行中执行的测试。 |
| 测试:在光标处的调试测试 | 在你将光标聚焦在编辑器上的测试方法中进行调试。类似于Python: 调试测试方法...在2021.9之前的版本中。 |
| 测试:在当前文件中调试测试 | 在当前聚焦于编辑器中的文件中进行调试测试。 |
| 测试:前往下一个测试失败 | 如果错误预览视图已打开,请打开并移动到资源管理器中下一个失败测试的预览视图。 |
| 测试:转到上一个测试失败 | 如果错误预览视图已打开,请打开并移动到资源管理器中失败的前一个测试的预览视图。 |
| 测试:查看输出 | 打开失败测试方法的错误预览视图。 |
| 测试:刷新测试 | 执行测试发现,并更新测试资源管理器以反映任何测试更改、添加或删除。类似于Python: Discover Tests在2021.9之前的版本。 |
| 测试:重新运行失败的测试 | 运行最近一次测试运行中失败的测试。类似于Python: 运行失败的测试在2021.9之前的版本。 |
| 测试:重新运行上次运行 | 调试最近一次测试运行中执行的测试。 |
| 测试:运行所有测试 | 运行所有发现的测试。等同于Python: 运行所有测试在2021.9之前的版本上。 |
| 测试:运行所有带覆盖测试 | 运行所有发现的测试,并计算您的代码有多少被测试覆盖。 |
| 测试:在光标处运行测试 | 在编辑器上聚焦时运行测试方法。类似于Python: 运行测试方法...在2021.9之前的版本。 |
| 测试:在当前文件中运行测试 | 在编辑器中当前聚焦的文件中运行测试。等同于Python: 运行当前测试文件在2021.9之前的版本。 |
| 测试:显示输出 | 打开包含所有测试运行详细信息的输出文件。类似于Python: 显示测试输出在2021.9之前的版本。 |
| 测试:关注测试资源管理器视图 | 打开测试资源管理器视图。类似于 测试:聚焦于 Python 视图 在 2021.9 之前的版本。 |
| 测试:停止刷新测试 | 取消测试发现。 |
测试配置设置
使用 Python 进行测试的行为由 VS Code 提供的通用 UI 设置以及特定于 Python 和您启用的任何框架的设置驱动。
常规用户界面设置
影响测试功能用户界面的设置由VS Code本身提供,并且可以在您搜索“Testing”时在VS Code设置编辑器中找到。
常规 Python 设置
| 设置 (python.testing.) |
默认 | 描述 |
|---|---|---|
| 自动测试发现启用时保存 | 真 |
指定在保存测试文件时是否启用或禁用自动运行测试发现。更改此设置后,您可能需要重新加载Windows才能应用更改。 |
| 当前工作目录 | 无 | 指定一个可选的测试工作目录。该设置的存在动态调整了--根目录pytest的参数。 |
| 自动测试发现保存模式 | **/*.py |
指定一个 glob 模式,用于确定哪些文件更改会触发自动测试发现。自动测试发现启用时保存是真输入:. |
| 调试端口 | 3000 |
用于unittest测试调试的端口号。 |
| 提示配置 | 真 |
指定 VS Code 在发现潜在测试时是否提示配置测试框架。 |
单元测试配置设置
| 单元测试设置 (python.testing.) |
默认 | 描述 |
|---|---|---|
| unittest已启用 | 假 |
指定是否将unittest作为测试框架启用。pytest的相应设置应禁用。 |
| 测试参数 | ["-v", "-s", ".", "-p", "*test*.py"] |
传递给unittest的参数,每个用空格分隔的元素是列表中的一个单独项目。默认设置的描述见下文。 |
unittest的默认参数如下:
-版本设置默认的详细程度。移除此参数以获得更简单的输出。-s .指定用于发现测试的起始目录。如果你的测试在名为“test”的文件夹中,请更改该参数为-s 测试(意思"-s", "test"在参数数组中)。-p *test*.py是用于寻找测试的发现模式。在这种情况下,是任何.py包含单词“test”的文件。如果你以不同的方式命名测试文件,例如在每个文件名后附加“_test”,那么使用像这样的模式*_test.py在数组的适当参数中。
要停止测试运行并在第一次失败时快速失败,请添加快速失败选项"-f"添加到参数数组。
参见unittest命令行界面了解所有可用选项。
pytest 配置设置
| pytest 设置 (python.testing.) |
默认 | 描述 |
|---|---|---|
| pytest已启用 | 假 |
指定是否启用pytest作为测试框架。应禁用unittest的相应设置。 |
| pytest路径 | "pytest" |
路径到pytest。如果pytest位于当前环境之外,请使用完整路径。 |
| pytest参数 | [] |
传递给pytest的参数,每个用空格分隔的元素都是列表中的一个单独项目。见pytest命令行选项。 |
pytest的默认参数如下:
根目录根据存在的动态调整python.testing.cwd在你的工作区设置。
您还可以通过一个文件来配置 pytestpytest.ini 文件如 pytest 配置 中所述。
如果你安装了pytest-cov覆盖模块,VS Code在调试时不会在断点处停止,因为pytest-cov使用相同的技术访问正在运行的源代码。为了防止这种行为,请包含--不覆盖在pytest参数在调试测试时,例如通过添加"env": {
"PYTEST_ADDOPTS": "--no-cov"
} 到你的调试配置。(见 调试测试 上面关于如何设置该启动配置的信息。)(更多信息,请参见 调试器和 PyCharm 在 pytest-cov 文档中。)
IntelliSense 设置
| IntelliSense 设置 (python.analysis.) |
默认 | 描述 |
|---|---|---|
| inlayHints.pytestParameters | 假 | 是否显示 pytest fixture 参数类型嵌入式提示。接受的值为真或假输入:. |