import inc_dec # The code to test
def test_increment():
assert inc_dec.increment(3) == 4
# This test is designed to fail for demonstration purposes.
def test_decrement():
assert inc_dec.decrement(3) == 4
默认情况下,一旦你启用某个框架,Python 扩展程序会尝试发现测试。你也可以随时使用命令面板中的 测试: 刷新测试 命令触发测试发现。
python.testing.autoTestDiscoverOnSaveEnabled
默认设置为 true
,这意味着当你添加、删除或更新工作区中的任何 Python 文件时,也会自动执行测试发现。要禁用此功能,请将值设置为 false
,这可以在设置编辑器中完成,也可以在 settings.json
文件中完成,如 VS Code 设置文档中所述。你需要重新加载窗口才能使此设置生效。
测试发现应用当前框架的发现模式(可以使用 测试配置设置 进行自定义)。默认行为如下:
python.testing.unittestArgs
:在顶层项目文件夹中查找名称中包含 "test" 的任何 Python (.py
) 文件。所有测试文件都必须是可导入的模块或包。你可以使用 -p
配置设置自定义文件匹配模式,并使用 -t
设置自定义文件夹。
python.testing.pytestArgs
:查找名称以 "test_" 开头或以 "_test" 结尾的任何 Python (.py
) 文件,这些文件位于当前文件夹和所有子文件夹内的任何位置。
提示:有时,放置在子文件夹中的测试无法被发现,因为这些测试文件无法导入。要使其可导入,请在该文件夹中创建一个名为 __init__.py
的空文件。
如果测试发现成功,你将在测试资源管理器中看到列出的测试
如果发现失败(例如,未安装测试框架或测试文件中存在语法错误),你将在测试资源管理器中看到错误消息。你可以查看 Python 输出面板以查看完整的错误消息(使用 查看 > 输出 菜单命令显示 输出 面板,然后从右侧的下拉列表中选择 Python)。
一旦 VS Code 识别出测试,它会提供多种运行这些测试的方法,如 运行测试 中所述。
你可以使用以下任何操作运行测试
在打开测试文件的情况下,选择测试定义行旁边装订线中显示的绿色运行图标,如上一节所示。此命令仅运行该一个方法。
从 命令面板 中,运行以下任何命令:
测试: 运行所有测试 - 运行所有已发现的测试。
测试: 运行当前文件中的测试 - 运行编辑器中打开的文件中的所有测试。
测试: 运行光标处的测试 - 仅运行编辑器中光标下的测试方法。
从 测试资源管理器 中:
要运行所有已发现的测试,请选择 测试资源管理器 顶部的播放按钮
要运行特定的测试组或单个测试,请选择文件、类或测试,然后选择该项目右侧的播放按钮
你也可以通过测试资源管理器运行选择的测试。为此,请 Ctrl+单击 (或 macOS 上的 Cmd+单击) 要运行的测试,右键单击其中一个测试,然后选择 运行测试。
测试运行后,VS Code 会直接在编辑器中以装订线装饰的形式显示结果。失败的测试也会在编辑器中突出显示,并显示一个“速览视图”,其中显示测试运行错误消息和所有测试运行的历史记录。你可以按 Escape 键关闭视图,并且可以通过打开用户设置(在 命令面板 中使用 首选项: 打开设置 (UI) 命令)并将 测试: 自动打开速览视图 设置的值更改为 never
来禁用它。
在 测试资源管理器 中,将显示单个测试以及包含这些测试的任何类和文件的结果。如果该文件夹中的任何测试未通过,则文件夹将显示失败图标。
VS Code 还在 Python 测试日志 输出面板中显示测试结果。
并行运行测试
通过 pytest-xdist
包支持并行运行 pytest 中的测试。要启用并行测试:
打开集成终端并安装 pytest-xdist
包。有关更多详细信息,请参阅项目的文档页面。
对于 Windows:
py -3 -m pip install pytest-xdist
对于 macOS/Linux:
python3 -m pip install pytest-xdist
接下来,在你的项目目录中创建一个名为 pytest.ini
的文件,并添加以下内容,指定要使用的 CPU 数量。例如,要将其设置为 4 个 CPU:
[pytest]
addopts=-n4
或者,如果你正在使用 pyproject.toml
文件:
[tool.pytest.ini_options]
addopts="-n 4"
运行你的测试,现在将并行运行。
运行带覆盖率的测试
测试覆盖率衡量你的代码被测试覆盖的程度,这可以帮助你识别代码中未被充分测试的区域。有关测试覆盖率的更多信息,请访问 VS Code 的 测试覆盖率文档。
提示:目前,仅当将 "python.experiments.optInto": ["pythonTestAdapter"]
添加到你的用户 settings.json
时,才支持运行带有覆盖率的 Python 测试。
要运行启用覆盖率的测试,请选择测试资源管理器中的覆盖率运行图标,或从你通常触发测试运行的任何菜单中选择“运行覆盖率”选项。如果你正在使用 pytest,Python 扩展程序将使用 pytest-cov
插件运行覆盖率,或者对于 unittest 使用 coverage.py
。
注意:在运行覆盖率测试之前,请确保为你的项目安装了正确的测试覆盖率包。
覆盖率运行完成后,将在编辑器中突出显示行级覆盖率的行。测试覆盖率结果将作为“测试覆盖率”子选项卡显示在测试资源管理器中,你也可以使用命令面板中的 测试: 聚焦于测试覆盖率视图 (F1
) 导航到该选项卡。在此面板上,你可以查看工作区中每个文件和文件夹的行覆盖率指标。
为了在使用 pytest 时更好地控制你的覆盖率运行,你可以编辑 python.testing.pytestArgs
设置以包含你的规范。当 python.testing.pytestArgs
中存在 pytest 参数 --cov
时,Python 扩展程序不会对覆盖率参数进行任何额外编辑,以便你的自定义设置生效。如果未找到 --cov
参数,则扩展程序会在运行之前将 --cov=.
添加到 pytest 参数,以在工作区根目录启用覆盖率。
你可能偶尔需要在调试器中逐步执行和分析测试,可能是因为测试本身存在你需要跟踪的代码缺陷,或者是为了更好地理解正在测试的代码区域为何失败。有关调试的更多信息,或要了解它在 VS Code 中的工作原理,你可以阅读 Python 调试配置 和常规 VS Code 调试 文章。
例如,前面给出的 test_decrement
函数失败,因为断言本身存在问题。以下步骤演示如何分析测试:
在 test_decrement
函数的第一行设置断点。
右键单击函数定义旁边的装订线装饰,然后选择 调试测试,或选择 测试资源管理器 中该测试旁边的 调试测试 图标。VS Code 启动调试器并在断点处暂停。
在 调试控制台 面板中,输入 inc_dec.decrement(3)
以查看实际结果是 2,而测试中指定的预期结果是不正确的 4。
停止调试器并更正错误代码
# unittest
self.assertEqual(inc_dec.decrement(3), 2)
# pytest
assert inc_dec.decrement(3) == 2
保存文件并再次运行测试以确认它们通过,并查看装订线装饰也指示通过状态。
注意:运行或调试测试不会自动保存测试文件。始终确保在运行测试之前保存对测试的更改,否则你可能会对结果感到困惑,因为它们仍然反映了该文件的先前版本!
你可以使用命令面板中的以下命令来调试测试
测试: 调试所有测试 - 为工作区中的所有测试启动调试器。
测试: 调试当前文件中的测试 - 为你在编辑器中打开的文件中定义的测试启动调试器。
测试: 调试光标处的测试 - 仅为你将光标聚焦在编辑器上的方法启动调试器。你还可以使用测试资源管理器中的 调试测试 图标来为所选范围内的所有测试和所有已发现的测试启动调试器。
你还可以通过将 testing.defaultGutterClickAction
设置的值更改为 debug
在你的 settings.json
文件中,将单击装订线装饰的默认行为更改为调试测试而不是运行。
调试器对测试的工作方式与其他 Python 代码相同,包括断点、变量检查等。要自定义调试测试的设置,你可以在工作区中 .vscode
文件夹中的 launch.json
文件中指定 "purpose": ["debug-test"]
。当你运行 测试: 调试所有测试、测试: 调试当前文件中的测试 和 测试: 调试光标处的测试 命令时,将使用此配置。
例如,以下 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 扩展进行测试的所有支持命令。这些命令都可以在命令面板中找到
Django 单元测试
Python 扩展还支持发现和运行 Django 单元测试!只需几个额外的设置步骤,即可发现您的 Django 测试
提示:Django 测试支持目前仅在将 "python.experiments.optInto": ["pythonTestAdapter"]
添加到您的用户 settings.json
中时才受支持。
在您的 settings.json
文件中设置 "python.testing.unittestEnabled": true,
。
将 MANAGE_PY_PATH
添加为环境变量
- 在您的项目根目录创建一个
.env
文件。
- 将
MANAGE_PY_PATH='<manage.py 路径>'
添加到 .env
文件,将 <manage.py 路径>
替换为您应用程序的 manage.py
文件的路径。提示:您可以通过右键单击资源管理器视图中的文件并选择“复制路径”来复制路径。
- 根据需要将 Django 测试参数添加到
settings.json
文件中的 "python.testing.unittestArgs": []
,并删除任何与 Django 不兼容的参数。
注意:默认情况下,Python 扩展会查找并加载项目根目录中的 .env
文件。如果您的 .env
文件不在项目根目录,或者您正在使用 VS Code 变量替换,请将 "python.envFile": "${workspaceFolder}/<.env 路径>"
添加到您的 settings.json
文件中。 这使 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
文件的绝对路径。
pytest 的 IntelliSense
Pylance 提供 IntelliSense 功能,可以帮助您更高效地使用 pytest fixtures 和 参数化测试。
当您键入测试函数的参数时,Pylance 将为您提供一个 补全列表,其中包括来自 @pytest.mark.parametrize
装饰器的参数名称,以及在您的测试文件或 conftest.py
中定义的现有 pytest fixtures。还支持 代码导航功能,例如转到定义和查找所有引用以及 重命名符号重构。
当鼠标悬停在 fixture 引用或参数化参数引用上时,Pylance 将显示推断的类型注释,该注释基于 fixture 的返回值或传递给参数化装饰器的参数的推断类型。
Pylance 还提供 代码操作,以将类型注释添加到具有 fixture 参数的测试函数。还可以通过在您的用户设置中将 python.analysis.inlayHints.pytestParameters
设置为 true
来启用推断的 fixture 参数类型的嵌入提示。
测试配置设置
Python 测试的行为由 VS Code 提供的常规 UI 设置以及特定于 Python 和您启用的任何框架的设置驱动。
常规 UI 设置
影响测试功能 UI 的设置由 VS Code 本身提供,当您搜索“测试”时,可以在 VS Code 设置编辑器中找到。
常规 Python 设置
设置
(python.testing.)
-v
设置默认详细程度。删除此参数以获得更简单的输出。
-s .
指定发现测试的起始目录。 如果您的测试位于“test”文件夹中,请将参数更改为 -s test
(表示参数数组中的 "-s", "test"
)。
-p *test*.py
是用于查找测试的发现模式。 在这种情况下,它是包含单词“test”的任何 .py
文件。 如果您以不同的方式命名测试文件,例如将“_test”附加到每个文件名,则在数组的相应参数中使用 *_test.py
之类的模式。
要停止第一次失败的测试运行,请将快速失败选项 "-f"
添加到参数数组。
有关可用选项的完整设置,请参阅 unittest 命令行界面。
pytest 配置设置
pytest 设置
(python.testing.)
您还可以使用 pytest.ini
文件配置 pytest,如 pytest 配置中所述。
注意: 如果您安装了 pytest-cov 覆盖率模块,VS Code 在调试时不会在断点处停止,因为 pytest-cov 使用相同的技术来访问正在运行的源代码。要阻止此行为,请在调试测试时在 pytestArgs
中包含 --no-cov
,例如通过将 "env": {"PYTEST_ADDOPTS": "--no-cov"}
添加到您的调试配置中。(有关如何设置该启动配置,请参阅上面的调试测试。)(有关更多信息,请参阅 pytest-cov 文档中的调试器和 PyCharm。)
IntelliSense 设置
IntelliSense 设置
(python.analysis.)