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

单元测试是测试应用程序中其他代码单元的代码片段,通常为独立函数、类等。 应用程序通过其所有单元测试后,可以相信低级程序功能正确无误。

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

本文简要介绍了适用于 Python 语言的 Visual Studio 中的单元测试功能。 有关单元测试的的更多常见信息,请参阅对代码进行单元测试

先决条件

不支持 Visual Studio for Mac。 有关详细信息,请参阅 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 代码:

    显示 Visual Studio 2022 启动时如何选择“打开本地文件夹”选项的屏幕截图。

    显示 Visual Studio 启动时如何选择“打开本地文件夹”选项的屏幕截图。

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

    显示如何在 Visual Studio 2022 的解决方案资源管理器中查看隐藏文件夹和文件的屏幕截图。

    显示如何在 Visual Studio 的解决方案资源管理器中查看隐藏文件夹和文件的屏幕截图。

  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 框架,如果未在 PythonSettings.json 文件中定义 UnitTestRootDirectoryUnitTestPattern 的具体值,Visual Studio 会自动添加这些字段,分别使用默认值 .test*.py

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

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

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

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

添加和发现测试

默认情况下,Visual Studio 将 unittest 和 pytest 测试标识为名称以“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 会搜索测试并在“测试资源管理器”中显示它们。

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

  • 在 Visual Studio 中,通过选择“测试”>“测试资源管理器”来打开“测试资源管理器”窗口。

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

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

    显示 Visual Studio 2022 的资源管理器中测试的默认视图的屏幕截图。

    显示测试资源管理器中测试的默认视图的屏幕截图。

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

    显示如何使用 Visual Studio 2022 中的“分组依据”选项整理测试资源管理器中的测试视图的屏幕截图。

    显示如何使用“分组依据”选项整理测试资源管理器中的测试视图的屏幕截图。

  • 还可以在“搜索”字段中输入文本以按名称筛选测试:

    显示如何使用“搜索”字段筛选测试资源管理器中的测试视图的屏幕截图。

    显示如何使用“搜索”字段筛选测试资源管理器中的测试视图的屏幕截图。

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

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

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

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

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

Visual Studio 会在后台运行测试。 每个测试完成后,“测试资源管理器”将更新其状态:

  • 通过的测试将显示一个绿勾和完成测试所花费的时间:

    显示 Visual Studio 2022 的测试资源管理器中已通过测试的状态的屏幕截图。

    显示测试资源管理器中已通过测试的状态的屏幕截图。

  • 失败的测试将显示带有输出链接的红叉,该链接显示控制台输出和测试运行中的 unittest 输出:

    显示 Visual Studio 2022 的测试资源管理器中失败测试的状态和原因详细信息的屏幕截图。

    显示测试资源管理器中失败测试的状态的屏幕截图。

    显示测试资源管理器中失败测试的原因的屏幕截图。

使用调试程序检查测试

单元测试是代码片段,和任何其他代码一样会受到 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 调试器一样。

    显示如何使用 Visual Studio 2022 调试器调试单元测试的屏幕截图。

    显示如何使用 Visual Studio Debugger 调试单元测试的屏幕截图。

  • 还可以使用“分析所选测试的代码覆盖率”。 有关详细信息,请参阅使用代码覆盖率确定正在测试的代码数量