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

⚡ 智能摘要

Python 单元测试将代码分成一个个独立的小单元进行检查,以便及早发现错误。在这里,你将学习单元测试技术、PyUnit(unittest)框架、其关键类、如何设计测试用例以及一个可运行的示例。

  • 🧪 它是什么: 单元测试是对小型、独立的代码单元进行验证,以便及早发现错误。
  • 🔬 技术: TDD、桩代码和模拟代码可以隔离代码,使单元测试能够独立进行。
  • 🐍 PyUnit: Python的内置单元测试模块(PyUnit)是移植自 JUnit.
  • 🧱 关键课程: TestCase、TestSuite、TestLoader、TextTestRunner 和 TestResults。
  • 🤖 人工智能帮助: Copilot 等 AI 工具可以立即生成单元测试用例。

Python 单元测试

什么是单元测试?

单元测试 in Python 这样做的目的是在应用程序开发阶段的早期识别错误,因为此时错误出现的频率较低且修复成本较低。

单元测试是一种脚本代码级测试,设计于 Python 验证一个小的功能“单元”。单元测试是一个基于测试装置的面向对象框架。

Python 单元测试技术

Python 单元测试主要涉及在不访问任何相关代码的情况下测试特定模块。开发人员可以使用存根和模拟等技术将代码分成“单元”,并对各个部分运行单元级测试。

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

    这两种方法的目的都是相同的,即消除测试类或函数的所有依赖关系。

Python 单元测试框架

为了简化单元测试过程并提高项目质量,建议 Python 单元测试框架。单元测试框架包括

Python 单元测试技术

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

使用 PyUnit 进行单元测试

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

使用 PyUnit 进行单元测试

  • 测试用例类:TestCase 类承载测试例程,并提供钩子来执行每个例程并随后进行清理
  • TestSuite 类:它充当一个集合容器,可以拥有多个测试用例对象和多个测试套件对象
  • TestLoader 类:此类加载本地或从外部文件定义的测试用例和套件。它发出一个拥有这些套件和用例的测试套件对象
  • TextTestRunner 类:为了运行测试,它提供了一个标准平台来执行测试
  • TestResults 类:为测试结果提供标准容器

设计测试用例 Python 使用 PyUnit 进行测试

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

设计测试用例 Python

单元测试.TestCase

setUp()
teardown()

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

id():string
shortDescription():string

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

第二组方法控制测试执行。两种方法均以消息字符串作为输入,并且均取消正在进行的测试。但 skiptest() 方法会中止当前测试,而 fail() 方法会使测试完全失败。

最后或第三个方法帮助确定测试。方法 id() 返回一个由测试用例对象和测试例程的名称组成的字符串。方法 shortDescription() 在每个测试例程开始时返回 docstr 注释。

Python 单元测试示例

下面的示例使用 unittest 模块测试一个简单的 add() 函数。每个以 test_ 为前缀的方法都会自动运行,而 assertEqual 函数会将结果与预期值进行比较。

import unittest

def add(a, b):
    return a + b

class TestAdd(unittest.TestCase):
    def test_add_positive(self):
        self.assertEqual(add(2, 3), 5)

    def test_add_negative(self):
        self.assertEqual(add(-1, -1), -2)

if __name__ == "__main__":
    unittest.main()

保存代码并使用 python filename.py 运行它。单元测试运行器会报告有多少测试通过或失败。

使用优势 Python 单元测试

  • 它可以帮助您在开发周期的早期发现错误
  • 它可以帮助你编写更好的程序
  • 它可以轻松与其他测试方法和工具同步
  • 缺陷会少很多
  • 将来修改起来更容易,而且后果更轻

常见问题

单元测试是对一小段代码(例如一个函数)进行独立验证。它可以在开发早期发现错误,此时修复错误的成本更低、更容易。

PyUnit 是 Python的内置单元测试框架,以 unittest 模块的形式提供。它是 的移植版本。 JUnit 并支持测试夹具、测试用例、测试套件和测试运行器。

继承 unittest.TestCase 类,编写以 test_ 开头的方法,并在这些方法中使用类似 assertEqual 的断言。运行 unittest.main() 来执行所有测试。

`setUp()` 函数在每个测试方法之前运行,用于准备测试用例;而 `tearDown()` 函数在每个测试之后运行,用于清理测试环境。它们共同确保测试的独立性和可重复性。

桩对象提供测试所依赖的固定数据,而模拟对象则是用于进行断言的虚拟对象。两者都会替换实际依赖项,从而实现单元的隔离测试。

像 GitHub Copilot 这样的 AI 助手可以根据函数生成单元测试用例,建议边界情况和断言,并在你编写代码时创建依赖项的模拟对象。

是的。人工智能工具可以自动生成测试套件,为预期输出生成断言,并通过为未测试的分支建议测试来提高代码覆盖率。

单元测试是 Python的内置框架使用类和断言方法,而 pytest 是一个第三方库,它提供更简单的断言语句和强大的测试夹具。两者都可以运行单元测试。

总结一下这篇文章: