Visual Studio Code 中的 Python 测试

Python 扩展基于 VS Code 内置测试功能,提供测试发现、测试覆盖,以及为 Python 内置的 unittest 框架和 pytest 运行和调试测试。

配置测试

当安装 Python 扩展并在编辑器中打开 Python 文件时,VS Code 活动栏上会显示一个测试烧杯图标,代表测试资源管理器视图。打开测试资源管理器时,如果测试框架未启用,会显示配置 Python 测试按钮。选择“配置 Python 测试”会提示你选择一个测试框架和一个包含测试的文件夹。如果你使用unittest,还要选择用来识别测试文件的文件glob模式。

注释

文件块状模式是一种定义的字符串模式,基于通配符匹配文件或文件夹名称以包含或不包含文件。

测试资源管理器中显示的配置 Python 测试按钮,当测试尚未配置时。

测试可以通过命令面板中的 Python: 配置测试命令或设置以下python.testing.unittestEnabledpython.testing.pytestEnabled在设置编辑器中或settings.json文件,如VS Code 设置文档中所述。每个框架还拥有针对其文件夹和模式的具体配置设置,详见测试配置设置

如果你启用了pytest,但当前激活的环境里没有安装它,Python扩展会尝试在后台安装它。此外,如果两个框架都启用,Python 扩展只能运行派特斯特.

注释

Python 扩展的 pytest 最低支持版本为 7.0.0。

测试发现

默认情况下,Python扩展会在你启用框架后尝试发现测试。你可以随时通过命令面板中的“测试:刷新测试”命令触发测试发现。

提示

python.testing.autoTestDiscoverOnSaveEnabled设置为确实如此默认情况下,测试发现会自动发生,只要你在工作区中添加、删除或更新任何 Python 文件。要禁用此功能,请将值设置为错误,这可以在设置编辑器中完成,也可以在settings.json文件,如VS Code 设置文档中所述。你需要重新加载窗口,这个设置才会生效。为了更好地控制自动测试发现中包含的文件,请调整python.testing.autoTestDiscoverOnSavePattern设置,默认为 **/*.py.

测试发现应用当前框架的发现模式(可通过测试配置设置进行自定义)。默认行为如下:

  • python.testing.unittestArgs: 寻找任何Python (.py)在顶层项目文件夹中,文件名称中带有“test”。所有测试文件必须是可导入的模块或包。你可以用以下方式自定义文件匹配模式-p配置设置,并用-t环境。

  • python.testing.pytestArgs: 寻找任何Python (.py)文件,名称以“test_”开头或以“_test”结尾的文件,位于当前文件夹及所有子文件夹内的任何位置。

提示

有时放在子文件夹中的测试无法被发现,因为这些测试文件无法导入。要让它们可导入,创建一个空文件,名为__init__.py就在那个文件夹里。

如果测试发现成功,你会在测试资源管理器中看到测试列表:

VS Code 测试工具用于 Python 测试

当直接从测试浏览器触发测试发现时,你也可以取消正在进行的测试发现调用。使用取消按钮,它在发现时替代刷新按钮。

取消测试资源管理器中的测试发现按钮。

如果发现失败(例如,测试框架未安装或测试文件中存在语法错误),你会在测试资源管理器中看到错误信息,并附带日志链接。你可以查看 Python 输出面板查看完整的错误信息(使用“查看>输出”菜单命令显示输出面板,然后从右侧下拉菜单选择 Python)。

测试资源管理器中显示发现失败错误信息

运行测试

您可以使用以下任一作进行测试:

  • 打开测试文件后,选择位于测试定义线旁的排水沟中显示的绿色运行图标,如上一节所示。这个命令只运行那一种方法。

    在编辑器中打开测试文件时,运行显示在排水沟上的测试图标

  • 通过执行以下任一命令,从命令面板中获得:

    • 测试:运行所有测试——运行所有已发现的测试。
    • 测试:在当前文件中运行测试——在编辑器中打开的文件中运行所有测试。
    • 测试:在光标下运行测试——只在编辑器中运行光标下的测试方法。
  • 来自测试探索器

    • 要运行所有发现的测试,请在测试资源管理器顶部选择播放按钮:

      通过测试资源管理器运行所有测试

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

      通过测试资源管理器在特定范围运行测试

    • 你也可以通过测试浏览器运行部分测试。作方法是在你想运行的测试上按 Ctrl+Click(macOS 上按 Cmd+Click),右键点击其中一个测试,然后选择“执行测试”。

测试运行后,VS Code 会直接在编辑器中以排水沟装饰的形式显示结果。失败的测试也会在编辑器中高亮显示,并以“窥视”显示测试运行错误信息和所有测试运行的历史记录。你可以按 Esc 关闭视图,也可以通过打开用户设置(命令调色板中的偏好设置:打开设置(UI)命令)并将测试:自动打开查看视图的值改为绝不.

测试资源管理器中,会显示单个测试的结果以及包含这些测试的类和文件。如果文件夹内的任何测试未通过,文件夹会显示失败图标。

在单元测试类和测试浏览器中的测试结果

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

测试结果面板中的测试结果

在覆盖范围内运行测试

要启用覆盖运行测试,请在测试资源管理器中选择覆盖运行图标,或从通常触发测试运行的菜单中选择“带覆盖运行”选项。Python 扩展通过Pytest-Cov如果你用的是pytest,插件,或者coverage.py针对 UNITEST。

注释

在进行带覆盖的测试之前,确保安装适合您项目的测试覆盖包。 分支覆盖仅支持覆盖版本 >= 7.7。

覆盖运行完成后,编辑器中会高亮显示行级覆盖。测试覆盖率结果会以测试资源管理器中的“测试覆盖率”子标签显示,你也可以在命令面板(⇧⌘P,Windows,Linux Ctrl+Shift+P中使用“测试:专注于测试覆盖率视图”来访问该页面)。在这个面板上,你可以查看工作区中每个文件和文件夹的行覆盖度指标,以及如果需要的分支覆盖率。

GIF显示了运行Python测试并覆盖的。

为了更细致地控制覆盖运行,使用 pytest 时可以编辑python.testing.pytestArgs设置以包含你的规格。当最py的论证——cov存在于python.testing.pytestArgsPython 扩展不会对覆盖 arg 做额外编辑,以便实现你的自定义。如果没有——cov找到参数后,扩展将添加--cov=。运行前的pytest的ARGS以启用工作区根的覆盖。

欲了解更多测试覆盖信息,请访问VS Code的测试覆盖文档

调试测试

要调试测试,右键点击函数定义旁的排水沟装饰,选择“调试测试”,或在测试资源管理器中选择该测试旁边的“调试测试”图标。

测试资源管理器中的调试测试图标

注释

运行或调试测试不会自动保存测试文件。每次运行测试前一定要保存更改,否则你很可能会被结果弄糊涂,因为它们仍然反映文件的前一个版本!

你可以使用命令面板中的以下命令来调试测试:

  • 测试:调试所有测试——启动工作区中所有测试的调试器。
  • 测试:当前文件中的调试测试——启动你在编辑器中打开文件中定义的测试调试器。
  • 测试:Debug Test at Cursor - 仅在光标聚焦编辑器的方法下启动调试器。你也可以在测试资源管理器中使用调试测试图标,启动选定范围内所有测试和发现测试的调试器。

你也可以更改默认点击排水沟装饰以调试测试而不是运行的行为,方法是更改testing.defaultGutterClickAction(测试)将值设为调试在你的settings.json档案。

调试器在测试中的工作原理与其他Python代码相同,包括断点、变量检查等。要自定义调试测试的设置,可以在以下几个launch.jsonsettings.json文件.vscode通过添加“目的”: [“调试-测试”]切换到你的配置。当你运行“测试:调试所有测试”、“当前文件中的调试测试”、“测试:在光标处调试测试”时,将使用此配置。

例如,下面的配置launch.json文件会禁用justMyCode调试测试设置:

{
  "name": "Python: Debug Tests",
  "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测试被发现:

  1. 赛场“python.testing.unittestEnabled”: true,在你的settings.json 档案
  2. 添加MANAGE_PY_PATH作为环境变量:
    1. 创建一个.env在项目根端存档。
    2. 添加MANAGE_PY_PATH='<path-to-manage.py>'前往.env文件,替换<path-to-manage.py>通过你申请的路径manage.py档案。

      提示:你可以在资源管理器视图中右键点击文件并选择复制路径

  3. 将Django测试参数添加到“python.testing.unittestArgs”: []settings.json 根据需要文件,并删除所有与 Django 不兼容的参数。
注释

默认情况下,Python 扩展会查找并加载.env项目根文件。如果你.env文件不在项目根节点,或者你用了 VS Code 变量替换,添加“python.envFile”: “${workspaceFolder}/<path-to-.env>”给你的settings.json 档案。这使得 Python 扩展能够在运行和发现测试时从该文件加载环境变量。获取更多关于 Python 环境变量的信息

进入测试视图,点击刷新测试按钮,即可显示你的Django测试!

故障排除

如果你的 Django 单元测试在测试视图中没有显示,请尝试以下故障排除步骤:

  • Python 输出面板中搜索错误信息。他们可能会给出一些线索,说明为什么你的检测结果没有被发现。
  • 试着在终端里运行Django测试。然后将同一个命令“翻译”到VS Code设置中。 例如,如果你跑步Python manage.py test --arg在终端中,你会添加MANAGE_PY_PATH='./manage.py'转给.envfile,以及集合“python.testing.unittestArgs”: [--arg]在VS Code设置中。另外,你也可以在 Python 输出面板中找到 Python 扩展执行的命令。
  • 使用绝对路径manage.py文件在设置MANAGE_PY_PATH环境变量,如果你最初使用了相对路径。

测试命令

以下是所有支持在VS Code中测试Python扩展的命令。这些都可以通过命令调色板找到:

命令名称 描述
Python:配置测试 将测试框架配置为配合Python扩展使用。
测试:清除所有结果 清除所有测试状态,因为界面会在会话间持久化测试结果。
测试:调试所有测试 调试所有发现的测试。相当于 Python:在 2021.9 之前的版本中调试所有测试
测试:调试失败测试 最近一次测试失败的调试测试。
测试:调试 最后一次运行 最近一次测试运行中执行的调试测试。
测试:光标调试测试 调试测试方法,光标指向编辑器。类似于 Python:调试测试方法......适用于 2021.9 之前版本。
测试:当前文件中的调试测试 在编辑器当前聚焦的文件中进行调试测试。
测试:进入下一个测试失败 如果错误窥视视图是打开的,打开并切换到浏览器中失败的下一个测试的窥视视图。
测试:返回之前的测试失败 如果错误窥视视图是打开的,打开并切换到之前失败测试的预览视图。
测试:窥视输出 打开错误查看视图,显示一个测试方法失败。
测试:刷新测试 进行测试发现,并更新测试资源管理器以反映任何测试的更改、添加或删除。类似于 Python:2021.9 之前版本的 Discover 测试
测试:重播失败测试 运行最近一次测试失败的测试。类似于Python:在2021.9之前的版本上运行失败测试
测试:重播 上次 最近一次测试运行中执行的调试测试。
测试:运行所有测试 运行所有发现的检测。相当于 Python:在 2021.9 之前的版本上运行所有测试
测试:所有测试均有覆盖 运行所有发现测试,计算测试覆盖了多少代码。
测试:在光标处运行测试 运行测试方法,光标聚焦在编辑器上。类似于 Python:运行测试方法......在2021.9之前的版本上。
测试:在当前文件中运行测试 在编辑器当前聚焦的文件中运行测试。相当于 Python:在 2021.9 之前的版本运行当前测试文件
测试:展示输出 打开输出,包含所有测试运行的详细信息。类似于 Python:在 2021.9 之前的版本上显示测试输出
测试:专注于测试探索器视图 打开测试资源管理器视图。类似于测试:专注于2021.9之前版本的Python视图。
测试:停止刷新测试 取消测试发现。

测试配置设置

用 Python 测试的行为是由 VS Code 提供的通用界面设置以及针对 Python 和你启用的框架特有的设置驱动的。

通用界面设置

影响测试功能界面的设置由 VS Code 本身提供,搜索“Testing”时可以在 VS Code 设置编辑器中找到。

通用 Python 设置

Setting
(python.testing.)
默认 描述
autoTestDiscoverOnSaveEnabled 确实如此 规定保存测试文件时是否启用或禁用自动运行测试发现。更改设置后可能需要重新加载窗口才能应用。
慢性消耗病 无效 指定一个可选的工作目录用于测试。该设置的存在会动态调整——rootdir支持pytest的论点。
autoTestDiscoverOnSavePattern **/*.py 指定一个球状模式,决定当何时触发自动测试发现的文件变更autoTestDiscoverOnSaveEnabled确实如此.
debugPort 3000 用于调试单元测试的端口号。
promptToconfigure 确实如此 规定如果发现潜在测试,VS Code 是否会提示配置测试框架。

unittest 配置设置

Unittest setting
(python.testing.)
默认 描述
unittestEnabled 错误 指定是否启用unittest作为测试框架。pytest的等效设置应该被禁用。
unittestArgs [“-v”, “-s”、“.”、“-p”、“*test*.py”] 参数传递给unittest,每个被空格分隔的元素都是列表中独立的项。以下是默认设置的描述。

unittest 的默认参数如下:

  • -v设置默认冗长度。为了更简单的输出,去掉这个论点。
  • -s。指定了用于发现测试的起始目录。如果你在“test”文件夹里有测试,把参数改成-s 检验(含义“-s”,“test”在参数数组中)。
  • -p *测试*.py是用于寻找检验的发现模式。在这里,是任何.py文件中包含“测试”一词。如果你给测试文件命名不同,比如每个文件名后加上“_test”,那就用类似的模式*_test.py在数组的适当参数中。

要在第一次失败时停止测试运行,可以添加快速失败选项“-f”映射到参数数组。

请参阅unittest命令行界面以了解完整的可用选项。

pytest 配置设置

pytest setting
(python.testing.)
默认 描述
pytestEnabled 错误 指定是否启用pytest作为测试框架。unittest 的对应设置应被禁用。
pytest路径 “最爱” 通往pytest的路径。如果pytest位于当前环境之外,则使用完整路径。
pytestArgs [] 参数传递给pytest,每个被空格分隔的元素都是列表中的独立项。参见pytest命令行选项

pytest的默认参数如下:

  • 根底尔根据 a 的存在动态调整python.testing.cwd在你的工作区设置。

你也可以用pytest.ini文件描述在pytest配置中。

注释

如果你安装了pytest-cov覆盖模块,VS Code在调试时不会在断点停止,因为pytest-cov使用同样的技术访问正在运行的源代码。为了防止这种行为,可以包括——无冠pytestArgs在调试测试时,例如通过添加“env”: {“PYTEST_ADDOPTS”: “--no-cov”}切换到你的调试配置。(关于如何设置启动配置,请参见上文的调试测试。)(更多信息请参见pytest-cov文档中的调试器和PyCharm。)

IntelliSense 设置

IntelliSense 设置
(python.analysis.)
默认 描述
inlayHints.pytestParameters(inlayHints.pytestParameters) 错误 是否要为pytest的固定具参数类型显示内嵌提示。公认值为确实如此错误.

参见