Python异常处理与unittest单元测试实战解析

月亮慢半拍
月亮慢半拍
发布时间:2026-10-11| 3人浏览过
原创

本文深入解析Python中的异常处理机制,涵盖捕获所有异常、特定异常及手动抛出异常的语法。同时,通过具体代码示例演示如何使用Python内置的unittest模块进行函数与类的单元测试,详细讲解setUp/tearDown的使用及常用断言方法的实际应用。

Python异常处理机制解析

在Python编程中,异常处理是保证程序健壮性的关键。通过 try...except 结构,开发者可以捕获并处理运行时的错误。以下是几种常见的异常处理模式:

1. 捕获所有异常

当不需要区分具体错误类型,仅需记录或处理通用错误时,可以使用不带参数的 except。这种方式会捕获所有继承自 BaseException 的异常。

try:
  x = 5 / 0
except:
  print('程序有错误')

2. 捕获特定异常

更推荐的做法是捕获特定的异常类型,例如 ZeroDivisionError。这样可以避免掩盖其他潜在的程序错误。结合 else 和 finally 子句,可以分别处理无错误时的逻辑和资源清理工作。

try:
  x = 5 / 0
except ZeroDivisionError as e:
  print('不能为0',e)
except:
  print('其他错误')
else:
  print('没有错误')
finally:
  print('关闭资源')

3. 手动抛出异常

在函数或类的方法中,可以使用 raise 语句主动抛出异常。例如,当某个功能尚未实现时,抛出 NotImplementedError 是一种标准的做法。

def method():
  raise NotImplementedError('该方法还未被实现')

使用unittest进行单元测试

Python 标准库提供了 unittest 模块,用于编写和运行测试用例。测试通常分为针对函数的测试和针对类的测试。

1. 函数测试示例

假设有一个 get_formatted_name 函数用于格式化姓名,我们可以创建一个继承自 unittest.TestCase 的类来编写测试。

import unittest
from example import get_formatted_name

class NameTestCase(unittest.TestCase):
  def test_title_name(self):
    formatted_name = get_formatted_name('tom','lee')
    self.assertEqual(formatted_name,'Tom Lee')

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

2. 类测试与生命周期管理

对于类的测试,通常涉及对象的初始化和状态检查。使用 setUp 方法可以在每个测试方法执行前准备测试数据,而 tearDown 用于清理资源。

class Coder:
  def __init__(self,name):
    self.name = name
    self.skills = []

  def mastering_skill(self,skill):
    self.skills.append(skill)

  def show_skills(self):
    print('掌握技能:')
    for skill in self.skills:
      print('-',skill)

对应的测试类如下:

import unittest
from coder import Coder

class CoderTestCase(unittest.TestCase):
  def setUp(self):
    self.c = Coder('Tom')
    self.c.mastering_skill('Python')
    self.c.mastering_skill('Java')
    
  def test_skill_in(self):
    self.assertIn("Python",self.c.skills)
    
  def tearDown(self):
    print('销毁')

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

常用断言方法详解

unittest.TestCase 提供了丰富的断言方法,用于验证预期结果与实际结果是否一致。以下是常见断言的使用场景:

import unittest

person ={'name':'Tom','age':30}
numbers = [1,23,3,4,4,54]
s = 'hello world python'

class TestAssert(unittest.TestCase):
  def test_assert_method(self):
    # 判断值是否相等
    self.assertEqual('Tom',person.get('name'))
    # 判断布尔值是否为真
    self.assertTrue('hello' in s)
    # 判断元素是否在序列中
    self.assertIn('hello',s)
    # 浮点数比较,考虑精度误差
    #self.assertEqual(3.3,1.1+2.2)
    self.assertAlmostEqual(3.3,1.1+2.2)
    # 判断在内存中是否是同一个引用
    self.assertIs(True+1,2)
    # 判断是否为None
    self.assertIsNone(None)
    # 判断是否是某个类型的实例
    self.assertIsInstance(numbers[0],int)
    # 判断第一个参数是否大于第二个
    self.assertGreater(5,4)

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

通过掌握这些异常处理技巧和单元测试方法,开发者可以显著提高Python代码的质量和维护性。

以上就是Python语言异常处理与unittest单元测试实战的详细内容,更多关于Python异常处理与测试的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。