在 Visual Studio 中使用测试资源管理器编写 Python 单元测试

单元测试是测试应用程序中其他代码单元的代码片段,通常是隔离的函数、类等。 当应用程序通过其所有单元测试时,可以确信至少低级别程序功能是正确的。

Python 在设计程序时广泛使用单元测试来验证方案。 Visual Studio 中的 Python 支持包括发现、执行和调试开发过程的上下文中的单元测试,而无需单独运行测试。

本文简要概述了使用 Python 的 Visual Studio 中的单元测试功能。 有关单元测试的详细信息,请参阅 单元测试代码

先决条件

不支持 Visual Studio for Mac。 Windows、Mac 和 Linux 上的 Visual Studio Code 通过可用扩展适用于 Python

为 Python 项目选择测试框架

Visual Studio 支持两个适用于 Python、 unittestpytest 的测试框架(在 Visual Studio 2019 版本 16.3 及更高版本中提供)。 默认情况下,创建 Python 项目时不会选择框架。

按照以下步骤为 Python 项目选择测试框架:

  1. 解决方案资源管理器中,右键单击项目名称并选择“ 属性”。

  2. 在“项目 属性 ”窗格中,选择“ 测试 ”选项卡,然后选择 测试框架 类型:

    • 对于 unittest 框架,Visual Studio 为测试发现分配项目的根目录。 默认值为 .,但可以在配置项目设置时指定其他位置。 还可以为测试文件名 模式指定一个或多个字符串,例如 test*.py, test_*.py

    • 对于 pytest 框架,使用标准 pytest.ini 配置文件指定测试位置和文件名模式等测试选项。 默认情况下,工作区/项目文件夹用于位置。 默认文件名模式包括 test_*py*_test.py。 有关详细信息,请参阅 pytest 参考文档

    注释

    定义文件名模式时,请记住,下划线()等特殊字符与通配符(_*)不匹配。 如果要在文件名中使用特殊字符,请在模式定义中指定这些字符,例如 test_*.py

  3. 若要保存框架选择和设置,可以使用 Ctrl+S 键盘快捷方式。

配置框架后,Visual Studio 将启动测试发现并打开 测试资源管理器

在没有项目的情况下为 Python 配置测试

Visual Studio 允许您通过打开包含 Python 代码的文件夹,在没有项目的情况下运行和测试现有的 Python 代码。 在此方案中,需要使用 PythonSettings.json 文件来配置测试。

  1. 通过使用 “打开本地文件夹”选项 来打开您的现有 Python 代码:

  2. 打开 Python 文件夹时,Visual Studio 会创建多个隐藏文件夹来管理与程序相关的设置。 若要查看解决方案资源管理器中的这些文件夹(以及任何其他隐藏文件和文件夹(如 .git 文件夹),请选择“显示所有文件”选项:

  3. 解决方案资源管理器中,展开 “本地设置” 文件夹,然后双击 PythonSettings.json 文件以在编辑器中打开该文件。

    注释

    大多数配置显示两个设置文件: PythonSettings.jsonProjectSettings.json。 在本练习中,需要修改 PythonSettings.json 文件。

    如果在“本地设置”文件夹中看不到 PythonSettings.json 文件,可以手动创建该文件:

    1. 右键单击 “本地设置” 文件夹,然后选择“ 添加新>文件”。

    2. 将文件 命名为PythonSettings.json,然后选择 Enter 以保存更改。

    Visual Studio 会自动在编辑器中打开新文件。

  4. PythonSettings.json 文件中,添加以下代码以定义 TestFramework. 根据所需的测试框架,将框架值设置为 pytestunittest

    {
      "TestFramework": "unittest",
      "UnitTestRootDirectory": "testing",
      "UnitTestPattern": "test_*.py"
    }
    
    • 对于 unittest 框架,如果未在 UnitTestRootDirectory 文件中为 UnitTestPattern 设置定义特定值,Visual Studio 会自动添加这些字段,并分别赋予默认值 .test*.py

    • 对于 pytest 框架,配置选项始终在 pytest.ini 配置文件中指定,而不是通过 Visual Studio 设置指定。

  5. 如果 Python 程序包含独立于包含测试的文件夹的 src 文件夹,请使用 PythonSettings.json 文件中的设置指定 SearchPaths 文件夹的路径:

      "SearchPaths": [".\\src"]
    
  6. 保存对 PythonSettings.json 文件的更改。

配置框架后,Visual Studio 将为指定的框架启动测试发现。 可以在 测试资源管理器中访问测试。

添加和探索测试

默认情况下,Visual Studio 将 unittestpytest 测试标识为名称开头 test的方法。

若要查看 Visual Studio 如何启动测试发现,请执行以下步骤:

  1. 在 Visual Studio 中打开 Python 项目

  2. 设置项目的测试框架 属性 ,如 Python 项目的“选择测试框架”中所述。

  3. 解决方案资源管理器中,右键单击项目并选择“ 添加新>”。

    1. 在“ 添加新项 ”对话框中,选择 Python 单元测试 文件类型。

    2. 输入满足为项目属性指定的模式定义的文件名。

    3. 选择 并添加

  4. 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 会搜索测试并在 测试资源管理器中显示它们。

下面是使用 测试资源管理器的一些方法:

  • 通过选择 “测试”> 打开 “测试资源管理器” 窗口。

  • “测试资源管理器”窗口打开时,请使用键盘快捷方式 CTRL+R,A 触发测试发现。

  • 测试资源管理器 中双击测试以在编辑器中打开相应的源文件:

  • 使用工具栏上的“分组依据”选项组织测试视图:

  • 通过在 “搜索” 字段中输入文本,按名称筛选测试:

  • 运行测试 并查看测试运行的状态,如下一部分所述。

有关模块和编写测试的详细信息 unittest ,请参阅 Python 文档

使用测试资源管理器运行测试

测试资源管理器中,可以通过多种方式运行测试:

  • 选择全部运行(视图中测试),根据筛选器设置执行当前视图内显示的所有测试。
  • 使用“运行”菜单上的命令以组的形式运行失败、通过或未运行的测试。
  • 选择一个或多个测试,然后右键单击并选择“ 运行所选测试 ”选项。

Visual Studio 在后台运行测试。 测试资源管理器 在完成时更新每个测试的状态:

  • 通过的 测试显示为绿色勾号以及完成测试运行的时间:

  • 失败 的测试显示红色 X,并包含一个 输出 链接,该链接显示测试运行期间的控制台输出以及 unittest 的输出。

用调试器进行测试检查

单元测试和其他代码一样,可能会有 bug,因此有时需要在调试器中运行。 在 Visual Studio 调试器中,可以设置断点、检查变量和单步执行代码。 Visual Studio 还提供用于单元测试的诊断工具。

查看以下有关使用 Visual Studio 调试器检查测试的要点:

  • 默认情况下,测试调试使用 Visual Studio 2019 版本 16.5 及更高版本的 debugpy 调试器。 某些早期版本的 Visual Studio 使用 ptvsd 4 调试器。 如果使用的是早期版本的 Visual Studio,并且首选 ptvsd 3 调试器,请选择“工具>>>”下的“使用旧调试器”选项。

  • 若要开始调试,请在代码中设置初始断点,然后在 测试资源管理器 中右键单击测试(或所选内容),然后选择 “调试所选测试”。 Visual Studio 启动 Python 调试器的方式与启动应用程序代码相同。

  • 如果愿意,可以使用 分析所选测试的代码覆盖率。 有关详细信息,请参阅 使用代码覆盖率来确定测试的代码量