Coursera 笔记

Module 01 · Python Coding Practices and Packaging Concepts

Unit Testing单元测试

Coursera ↗

观看此视频后,您将能够:

  • 定义单元测试。
  • 解释单元测试过程。
  • 构建和执行单元测试。
  • 查看单元测试的输出。

1. 单元测试定义与重要性

单元测试 (Unit Testing) 是一种验证代码单元是否按设计运行的方法。

  • 单元 (Unit): 是应用程序中最小的、可测试的部分。
    • 示例: 在 mymodule.py 文件中,square 函数和 doubler 函数都可以视为一个单元。
      Python
      def square(number):
          return number ** 2
      
      def doubler(number):
          return number * 2
      
  • 工具: 您将使用 unittest** 库来开发单元测试。它是一个已安装的 Python 模块,提供了一个包含测试功能的框架**。

2. 单元测试过程 (端到端)

单元测试是在代码开发过程中进行的,每个单元都会经过两个阶段的测试,直到最终合并到生产代码库:

  1. 本地系统测试 (Local System Test):
  • 在您的本地系统上测试该单元。
  • 如果测试失败,需要确定失败原因并修复问题,然后重新测试。
  • 如果测试通过,进入下一阶段。
  1. 服务器环境测试 (Server Environment Test):
  • 在服务器环境(例如 CICD 持续集成/持续交付测试服务器)中测试该单元。
  • 如果测试失败,您将收到失败详情,需要确定并修复问题,然后重新测试。
  • 一旦单元通过服务器测试,它就被集成到最终的代码库中。

3. 构建和执行单元测试

以下是创建单元测试文件的步骤和最佳实践:

命名规范

  • 最佳实践: 单元测试文件通常以 test 单词前缀或后缀命名(例如 test_mymodule.py),这有助于将测试文件与单元文件清晰地区分。
  • 最佳实践: 单元测试类名通常以 Test 为前缀(例如 TestMyModule),以区分单元类和单元测试类。

步骤详解

  1. 导入 unittest 库:
import unittest
  1. 导入要测试的函数:
from mymodule import square, doubler
  1. 构建单元测试类:
  • 创建一个类来集中调用单元测试。
  • 该类必须继承自 unittest 库的 TestCase 类。继承允许您利用 TestCase 类中已有的方法。
class TestMyModule(unittest.TestCase): # T和C大写
    # ... 
  1. 创建测试函数:
  • 在单元测试类中,为每个需要测试的函数创建相应的测试函数。
  • 重要: 测试函数名称必须以 test_ 为前缀(例如 test_square),因为只有以此开头的函数才会被运行。
class TestMyModule(unittest.TestCase):
    def test_square(self):
        # 测试逻辑
        pass 

    def test_doubler(self):
        # 测试逻辑
        pass

  1. 创建测试用例(断言方法):
  • 在测试函数中,添加一个或多个断言方法 (assertion methods) 来确保单元测试条件得到满足。
  • assertEqual** 函数是一种常用的断言方法,它比较两个值或实体是否相等,用于检查函数是否返回了正确的值**。
    • 它接受两个参数:
      1. 实际值 (Actual Value): 调用要测试的函数(例如 square(2))。
      2. 期望值 (Expected Value): 函数应该返回的值(例如 4)。
# 示例:测试 square(2) 是否等于 4
self.assertEqual(square(2), 4) 
  • 测试运行时,函数首先被评估,然后将实际值与期望值进行比较。根据比较结果,测试通过 (Pass) 或失败 (Fail)。

4. 单元测试输出回顾

运行测试文件后,将生成包含测试结果和附加详细信息的输出。

测试通过示例 (Pass)

  • 输出显示:.. 或类似信息,以及 "Ran 2 tests in 0.00s" 和 "OK"。
  • OK 表示测试通过,并且两个函数实现正确。

测试失败示例 (Fail)

假设 square 函数错误地写成了计算立方 (cube) 而不是平方:

  • 输出显示: 明确指示单元测试失败,例如 FAIL: test_square(__main__.TestMyModule)。
  • 您可以查看失败的详细信息,它通常会显示:
    • 失败的函数名:test_square
    • 失败的断言:self.assertEqual(square(2), 4) failed.
    • 发生的错误:AssertionError: 8 != 4(因为实际返回值为 8,期望值为 4)。

重要性: 详细的输出使您能够在实际部署解决方案之前及时纠正错误。