在 Visual Studio 中使用测试资源管理器编写 Python 单元测试
单元测试是测试应用程序中其他代码单元的代码片段,通常为独立函数、类等。 应用程序通过其所有单元测试后,可以相信低级程序功能正确无误。
Python 单元测试广泛应用于在程序设计期间验证方案。 针对 Visual Studio 的 Python 支持包括在开发过程的上下文中发现、执行和调试单元测试,无需单独运行单元测试。
本文简要介绍了适用于 Python 语言的 Visual Studio 中的单元测试功能。 有关单元测试的的更多常见信息,请参阅对代码进行单元测试。
先决条件
Windows 上安装了支持 Python 工作负载的 Visual Studio。 有关详细信息,请参阅在 Visual Studio 中安装 Python 支持。
包含代码的 Python 项目或包含 Python 代码的文件夹。
不支持 Visual Studio for Mac。 有关详细信息,请参阅 Visual Studio for Mac 发生了什么情况?Windows、Mac 和 Linux 上的 Visual Studio Code 通过可用扩展与 Python 配合工作。
选择适用于 Python 项目的测试框架
Visual Studio 支持两种适用于 Python 的测试框架,即 unittest 和 pytest(在 Visual Studio 2019 版本 16.3 及更高版本中可用)。 默认情况下,在创建 Python 项目时,不会选择任何框架。
执行以下步骤,选择适用于 Python 项目的测试框架:
在“解决方案资源管理器”中,右键单击项目名称,然后选择“属性”。
在项目“属性”窗格中,选择“测试”选项卡,然后选择“测试框架”类型:
对于 unittest 框架,Visual Studio 指定项目的根目录用于测试发现。 默认值为
.
,但可以在配置项目设置时指定其他位置。 还可以为测试文件名模式指定一个或多个字符串,例如test*.py, test_*.py
。对于 pytest 框架,测试位置和文件名模式等测试选项是使用标准的 pytest .ini 配置文件指定的。 默认情况下,工作区/项目文件夹用于该位置。 默认文件名模式包括
test_*py
和*_test.py
。 有关详细信息,请参阅 pytest 参考文档。
注意
定义文件名模式时,请记住,下划线 (
_
) 等特殊字符与通配符 (*
) 不匹配。 如果要在文件名中使用特殊字符,请在模式定义中指定这些字符,例如test_*.py
。若要保存框架选择和设置,可以使用 Ctrl+S 键盘快捷键。
配置框架后,Visual Studio 将启动测试发现并打开“测试资源管理器”。
在不使用项目的情况下针对 Python 配置测试
使用 Visual Studio,可以在不使用项目的情况下运行和测试现有 Python 代码,方法是使用 Python 代码打开文件夹。 在这种情况下,需要使用 PythonSettings.json 文件来配置测试。
使用“打开本地文件夹”选项来打开现有 Python 代码:
打开 Python 文件夹时,Visual Studio 将创建几个隐藏文件夹来管理与程序相关的设置。 若要在“解决方案资源管理器”中查看这些文件夹(以及任何其他隐藏的文件和文件夹,如 .git 文件夹),请选择“显示所有文件”选项:
在“解决方案资源管理器”中,展开“本地设置”文件夹,然后双击 PythonSettings.json 文件以在编辑器中打开该文件。
注意
大多数配置显示两个设置文件:PythonSettings.json 和 ProjectSettings.json。 在本练习中,需要修改 PythonSettings.json 文件。
如果在“本地设置”文件夹中看不到 PythonSettings.json 文件,请手动创建该文件:
右键单击“本地设置”文件夹,然后选择“添加”>“新建文件”。
将文件命名为 PythonSettings.json,然后选择 Enter 保存更改。
Visual Studio 会自动在编辑器中打开新文件。
在 PythonSettings.json 文件中,添加以下代码来定义
TestFramework
。 根据所需的测试框架,将框架值设置为 pytest 或 unittest:{ "TestFramework": "unittest", "UnitTestRootDirectory": "testing", "UnitTestPattern": "test_*.py" }
对于 unittest 框架,如果未在 PythonSettings.json 文件中定义
UnitTestRootDirectory
和UnitTestPattern
的具体值,Visual Studio 会自动添加这些字段,分别使用默认值.
和test*.py
。对于 pytest 框架,始终在 pytest .ini 配置文件中指定配置选项,而不是通过 Visual Studio 设置指定。
如果 Python 程序包含独立于包含测试的文件夹的 src 文件夹,请使用 PythonSettings.json 文件中的
SearchPaths
设置指定 src 文件夹的路径:"SearchPaths": [".\\src"]
将更改保存到 PythonSettings.json 文件。
配置框架后,Visual Studio 会为指定框架启动测试发现。 可以在“测试资源管理器”中访问测试。
添加和发现测试
默认情况下,Visual Studio 将 unittest 和 pytest 测试标识为名称以“test
”开头的方法 。
若要查看 Visual Studio 如何启动测试发现,请执行以下步骤:
在 Visual Studio 中打开 Python 项目。
设置项目的测试框架“属性”,如选择适用于 Python 项目的测试框架中所述。
在“解决方案资源管理器”中右键单击该项目,然后选择“添加”>和“新建项”。
在“添加新项”对话框中,选择“Python 单元测试”文件选项。
输入满足你为项目“属性”指定的“模式”定义的文件名。
选择 添加 。
Visual Studio 使用默认代码创建测试文件:
import unittest class Test_test1(unittest.TestCase): def test_A(self): self.fail("Not implemented") if __name__ == '__main__': unittest.main()
此代码导入标准
unittest
模块并从unittest.TestCase
方法派生测试类。 直接运行脚本时,此代码还会调用unittest.main()
函数。
添加新的测试文件时,Visual Studio 可在“测试资源管理器”中使用它们。
使用测试资源管理器查看测试
配置测试框架和测试文件后,Visual Studio 会搜索测试并在“测试资源管理器”中显示它们。
下面是使用测试资源管理器的一些方法:
在 Visual Studio 中,通过选择“测试”>“测试资源管理器”来打开“测试资源管理器”窗口。
“测试资源管理器”窗口打开后,请使用键盘快捷键 CTRL+R、A 触发测试发现。
在“测试资源管理器”中双击测试,以在编辑器中打开相应的源文件:
使用工具栏上的“分组依据”选项整理测试的视图:
还可以在“搜索”字段中输入文本以按名称筛选测试:
运行测试并查看测试运行的状态,如下一部分所述。
有关 unittest
模块和编写测试的详细信息,请参阅 Python 文档。
使用测试资源管理器运行测试
在“测试资源管理器”中,可通过多种方式运行测试:
- 选择“全部运行(视图中的测试)”,以根据筛选器设置执行当前视图中显示的所有测试。
- 使用“运行”菜单中的命令运行失败的、通过的或未作为一组运行的测试。
- 选择一个或多个测试,右键单击,然后选择“运行选定测试”。
Visual Studio 会在后台运行测试。 每个测试完成后,“测试资源管理器”将更新其状态:
通过的测试将显示一个绿勾和完成测试所花费的时间:
失败的测试将显示带有输出链接的红叉,该链接显示控制台输出和测试运行中的
unittest
输出:
使用调试程序检查测试
单元测试是代码片段,和任何其他代码一样会受到 bug 的影响,有时需要在调试程序中运行。 在 Visual Studio Debugger 中,可以设置断点、检查变量和逐行执行代码。 Visual Studio 还提供了用于单元测试的诊断工具。
查看有关使用 Visual Studio Debugger 检查测试的以下要点:
默认情况下,测试调试使用 Visual Studio 2019 版本 16.5 及更高版本的 debugpy 调试程序。 某些早期版本的 Visual Studio 使用 ptvsd 4 调试程序。 如果使用的是早期版本的 Visual Studio,并且偏好使用 ptvsd 3 调试程序,请在“工具”>“选项”>Python>“调试”下选择“使用旧版调试程序”选项。
若要开始调试,请在代码中设置初始断点,然后在“测试资源管理器”中右键单击测试(或所做选择),然后选择“调试所选测试”。 Visual Studio 会启动 Python 调试程序,与为应用程序代码启动 Python 调试器一样。
还可以使用“分析所选测试的代码覆盖率”。 有关详细信息,请参阅使用代码覆盖率确定正在测试的代码数量。