PyUnit 教程:Python 单元测试框架(附示例)

什么是单元测试?

Python 的单元测试是为了在应用程序开发早期就识别出 bug,因为此时 bug 的复发性较低且修复成本较低。

单元测试是一个 Python 脚本级别的测试,旨在验证一小段“单元”的功能。单元测试是一个面向对象的框架,围绕测试夹具构建。

Python 单元测试技术

Python 单元测试主要涉及测试某个特定模块而不访问任何依赖代码。开发人员可以使用存根 (stubs) 和模拟 (mocks) 等技术将代码分成“单元”,并对单个部分运行单元级测试。

  • 测试驱动开发 (TDD):单元测试应与 Python 的开发同步进行,为此开发人员使用测试驱动开发方法。在 TDD 方法中,您首先设计 Python 单元测试,然后再编写实现该功能的代码。
  • 存根和模拟:它们是用于模拟正在测试的假方法的两个主要技术。存根用于填充单元测试正确运行所需的一些依赖项。而模拟是一个假对象,用于运行测试,我们在此处放置断言。

    这两种方法的目标都是消除对类或函数所有依赖项的测试。

Python 单元测试框架

为了使单元测试过程更轻松并提高项目质量,建议使用 Python 单元测试框架。单元测试框架包括:

Python Unit Testing Techniques

  • PyUnit:PyUnit 支持夹具、测试用例、测试套件和测试运行器,用于对代码进行自动化测试。在 PyUnit 中,您可以将具有相同夹具的测试用例组织到套件中。
  • Nose:Nose 的内置插件可帮助您进行输出捕获、代码覆盖率、文档测试等。Nose 的语法非常简单,降低了编写测试的门槛。它扩展了 Python 的 unittest,使测试更轻松。
  • Doctest:Doctest 测试脚本位于文档字符串中,位于文件底部的小函数。Doctest 允许您通过运行文档中包含的示例来测试代码,并验证它们是否返回了预期的结果。Doctest 的用例不太详细,也不会捕获特殊情况。它们作为模块及其组件主要用例的表达性文档非常有用。

使用 PyUnit 进行单元测试

Pyunit 是 JUnit 的 Python 移植版。作为 Pyunit 的一部分,unittest 模块中有五个关键类。

Unit Testing with PyUnit

  • TestCase 类:TestCase 类包含测试例程,并提供用于制作每个例程及其后续清理工作的钩子。
  • TestSuite 类:它充当集合容器,可以包含多个 TestCase 对象和多个 TestSuite 对象。
  • TestLoader 类:此类负责加载本地定义或来自外部文件的测试用例和测试套件。它会发出一个包含这些套件和用例的 TestSuite 对象。
  • TextTestRunner 类:它提供了一个标准的平台来执行测试。
  • TestResults 类:它为测试结果提供了标准的容器。

使用 PyUnit 为 Python 测试设计测试用例

单元测试提供了一个基类 Test Case,可用于创建新的测试用例。用于设计测试用例,有三组方法:

Designing a test case for Python

unittest.TestCase

setUp()
teardown()

skipTest(aMesg:string)
fail(aMesg:string)

id():string
shortDescription():string

第一组是测试前的钩子和测试后的钩子。setup() 方法在每个测试例程之前开始,teardown() 方法在例程之后开始。

第二组方法控制测试执行。这两个方法都接受一个消息字符串作为输入,并且都取消正在进行的测试。但是 skipTest() 方法会中止当前测试,而 fail() 方法会完全使测试失败。

最后一个(第三)个方法有助于确定测试。id() 方法返回一个由 TestCase 对象和测试例程名称组成的字符串。shortDescription() 方法返回每个测试例程开头的文档字符串注释。

使用 Python 单元测试的优点

  • 它有助于您在开发周期的早期检测 bug
  • 它有助于您编写更好的程序
  • 它可以轻松地与其他测试方法和工具同步
  • 它将有更少的 bug
  • 它在未来更容易修改,后果很小