PyUnit 教程:Python 单元测试框架(附示例)
什么是单元测试?
Python 的单元测试是为了在应用程序开发早期就识别出 bug,因为此时 bug 的复发性较低且修复成本较低。
单元测试是一个 Python 脚本级别的测试,旨在验证一小段“单元”的功能。单元测试是一个面向对象的框架,围绕测试夹具构建。
Python 单元测试技术
Python 单元测试主要涉及测试某个特定模块而不访问任何依赖代码。开发人员可以使用存根 (stubs) 和模拟 (mocks) 等技术将代码分成“单元”,并对单个部分运行单元级测试。
- 测试驱动开发 (TDD):单元测试应与 Python 的开发同步进行,为此开发人员使用测试驱动开发方法。在 TDD 方法中,您首先设计 Python 单元测试,然后再编写实现该功能的代码。
-
存根和模拟:它们是用于模拟正在测试的假方法的两个主要技术。存根用于填充单元测试正确运行所需的一些依赖项。而模拟是一个假对象,用于运行测试,我们在此处放置断言。
这两种方法的目标都是消除对类或函数所有依赖项的测试。
Python 单元测试框架
为了使单元测试过程更轻松并提高项目质量,建议使用 Python 单元测试框架。单元测试框架包括:
-
PyUnit:PyUnit 支持夹具、测试用例、测试套件和测试运行器,用于对代码进行自动化测试。在 PyUnit 中,您可以将具有相同夹具的测试用例组织到套件中。
-
Nose:Nose 的内置插件可帮助您进行输出捕获、代码覆盖率、文档测试等。Nose 的语法非常简单,降低了编写测试的门槛。它扩展了 Python 的 unittest,使测试更轻松。
- Doctest:Doctest 测试脚本位于文档字符串中,位于文件底部的小函数。Doctest 允许您通过运行文档中包含的示例来测试代码,并验证它们是否返回了预期的结果。Doctest 的用例不太详细,也不会捕获特殊情况。它们作为模块及其组件主要用例的表达性文档非常有用。
使用 PyUnit 进行单元测试
Pyunit 是 JUnit 的 Python 移植版。作为 Pyunit 的一部分,unittest 模块中有五个关键类。
- TestCase 类:TestCase 类包含测试例程,并提供用于制作每个例程及其后续清理工作的钩子。
- TestSuite 类:它充当集合容器,可以包含多个 TestCase 对象和多个 TestSuite 对象。
- TestLoader 类:此类负责加载本地定义或来自外部文件的测试用例和测试套件。它会发出一个包含这些套件和用例的 TestSuite 对象。
- TextTestRunner 类:它提供了一个标准的平台来执行测试。
- TestResults 类:它为测试结果提供了标准的容器。
使用 PyUnit 为 Python 测试设计测试用例
单元测试提供了一个基类 Test Case,可用于创建新的测试用例。用于设计测试用例,有三组方法:
unittest.TestCase
setUp() teardown() skipTest(aMesg:string) fail(aMesg:string) id():string shortDescription():string
第一组是测试前的钩子和测试后的钩子。setup() 方法在每个测试例程之前开始,teardown() 方法在例程之后开始。
第二组方法控制测试执行。这两个方法都接受一个消息字符串作为输入,并且都取消正在进行的测试。但是 skipTest() 方法会中止当前测试,而 fail() 方法会完全使测试失败。
最后一个(第三)个方法有助于确定测试。id() 方法返回一个由 TestCase 对象和测试例程名称组成的字符串。shortDescription() 方法返回每个测试例程开头的文档字符串注释。
使用 Python 单元测试的优点
- 它有助于您在开发周期的早期检测 bug
- 它有助于您编写更好的程序
- 它可以轻松地与其他测试方法和工具同步
- 它将有更少的 bug
- 它在未来更容易修改,后果很小