Python中的UnitTest框架测试发现

2025年1月5日 | 阅读 4 分钟

受 Java 中 JUnit 框架的启发,Python 中的 unittest 框架提供了一种稳定且适应性强的方法来创建和执行程序的测试。测试发现是其最强大的功能之一,它使您能够自动查找和执行测试,而无需手动定义每个测试用例。在处理具有大量测试用例和测试模块的大型项目时,此功能非常有用。

unittest 的基本结构

由于 unittest 框架已包含在标准库中,因此无需安装其他任何东西。通过定义一个继承自 unittest 的类,可以定义一个基本的 unittest 测试。您在 TestCase 类中定义方法来测试您的代码。每个测试方法的名称都应以“test”开头。

下面是一个简单的例子

代码

输出

..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
  • .. 表示运行了两个测试。
  • “Ran 2 tests in 0.000s”这行显示了执行的测试数量和运行它们所花费的总时间。
  • OK 表示所有测试都通过了。

理解测试发现

unittest 框架通过称为测试发现的过程自动在您的项目中定位测试用例和测试模块。它消除了单独定义每个需要执行的测试文件和测试用例的要求。

运行测试发现

要使用测试发现,您通常将 unittest 模块作为脚本与 discover 命令一起运行。此命令会在指定目录及其子目录中搜索测试。基本语法是

语法

unittest discover 的关键选项

  • -s 或 --start-directory:指定开始发现的目录。默认情况下,它使用当前目录。
  • -p 或 --pattern:定义匹配测试文件的模式。默认模式是 test*.py,这意味着它将查找任何以 test 开头并以 .py 结尾的文件。
  • -t 或 --top-level-directory:指定项目的顶级目录。它通常与起始目录相同。

例如,要发现并运行 tests 目录中所有匹配 test*.py 模式的测试,您将使用

语法

示例项目结构

考虑一个具有以下结构的项目

要发现并运行此项目中的所有测试,请导航到 my_project 目录并运行

语法

此命令将在 tests 目录及其子目录中搜索任何匹配 test*.py 模式的文件,并执行其中找到的测试用例。

高级用法

通过定义备用模式或构建新的 TestLoader 类,您可以进一步自定义测试发现。此外,您可以通过使用测试模块中的 load_tests 协议来管理找到的测试以及它们的组织方式。

自定义 TestLoader

如果您需要对发现过程进行更多控制,可以创建自定义 TestLoader。例如:

代码

输出

test_some_function (tests.test_module.TestClass) ... ok
test_another_function (tests.test_module.TestClass) ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK
  • 输出取决于 tests 目录中存在的实际测试文件和测试用例。假设 tests 目录包含匹配模式的测试文件,并且这些测试文件包含测试用例。
  • test_some_function (tests.test_module.TestClass) ... ok:表示 tests.test_module 中的 TestClass 中的 test_some_function 方法已通过。
  • Ran 2 tests in 0.001s:显示运行的测试总数和所花费的时间。
  • OK:表示所有测试都已通过。

使用 load_tests 协议

load_tests 协议允许您在测试模块中定义 load_tests 函数来控制发现过程

代码

输出

..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
  • .. :每个点代表一个运行的测试,因此 .. 表示运行了两个测试。
  • Ran 2 tests in 0.000s:显示执行了两个测试,总花费时间非常短(0.000 秒)。
  • OK:表示所有测试都已成功通过。

`unittest` 框架的测试发现功能通过在整个项目中自动查找测试用例来简化测试。通过利用 `discover` 函数,大型项目可以极大地受益于能够快速有效地运行测试,而无需手动指定每个测试用例。由于框架的多功能性,可以通过 `load_tests` 协议和自定义 `TestLoader` 类来实现自定义。因此,`unittest` 是一个有效且适应性强的工具,可帮助开发人员轻松管理和扩展其测试套件,同时确保 Python 应用程序的代码质量。