跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Python 单元测试
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Python单元测试 = '''单元测试'''是软件开发中的一种测试方法,用于验证代码的最小可测试单元(通常是函数或方法)是否按预期工作。在Python中,单元测试通常使用内置的[[unittest]]模块或第三方库(如[[pytest]])来实现。单元测试有助于提高代码质量、减少错误,并支持代码重构。 == 为什么需要单元测试? == 单元测试的主要目的是: * '''隔离问题''':测试单个函数或方法,确保其行为正确。 * '''快速反馈''':在开发过程中快速发现错误。 * '''文档作用''':测试代码可以作为示例,说明函数的使用方式。 * '''支持重构''':修改代码时,单元测试可以验证功能是否依然正常。 == Python中的单元测试框架 == Python提供了多种单元测试框架,其中最常用的是: * '''unittest''':Python标准库中的测试框架,基于JUnit设计。 * '''pytest''':功能更强大、语法更简洁的第三方测试框架。 === unittest 示例 === 以下是一个使用unittest模块的简单示例: <syntaxhighlight lang="python"> import unittest def add(a, b): return a + b class TestAddFunction(unittest.TestCase): def test_add_positive_numbers(self): self.assertEqual(add(2, 3), 5) def test_add_negative_numbers(self): self.assertEqual(add(-1, -1), -2) def test_add_zero(self): self.assertEqual(add(0, 0), 0) if __name__ == '__main__': unittest.main() </syntaxhighlight> '''输出示例:''' <pre> ... ---------------------------------------------------------------------- Ran 3 tests in 0.001s OK </pre> === pytest 示例 === pytest提供了更简洁的语法: <syntaxhighlight lang="python"> def multiply(a, b): return a * b def test_multiply_positive_numbers(): assert multiply(2, 3) == 6 def test_multiply_by_zero(): assert multiply(5, 0) == 0 </syntaxhighlight> 运行测试只需在命令行执行: <pre>pytest test_file.py</pre> == 测试驱动开发(TDD) == 测试驱动开发是一种先写测试再实现功能的开发方法。其流程如下: <mermaid> graph LR A[编写测试] --> B[运行测试] B --> C{测试通过?} C -->|否| D[编写实现代码] D --> B C -->|是| E[重构代码] E --> B </mermaid> == 高级单元测试技巧 == === 测试夹具(Fixtures) === 测试夹具用于准备测试环境和清理资源。在unittest中,可以使用<code>setUp()</code>和<code>tearDown()</code>方法: <syntaxhighlight lang="python"> class TestDatabase(unittest.TestCase): def setUp(self): self.conn = create_test_connection() def tearDown(self): self.conn.close() def test_query(self): result = self.conn.execute("SELECT 1") self.assertEqual(result, [1]) </syntaxhighlight> 在pytest中,可以使用装饰器定义fixture: <syntaxhighlight lang="python"> import pytest @pytest.fixture def database_connection(): conn = create_test_connection() yield conn conn.close() def test_query(database_connection): result = database_connection.execute("SELECT 1") assert result == [1] </syntaxhighlight> === 模拟对象(Mocking) === 使用<code>unittest.mock</code>可以创建模拟对象,避免测试依赖外部系统: <syntaxhighlight lang="python"> from unittest.mock import Mock def test_api_call(): mock_response = Mock() mock_response.status_code = 200 mock_response.json.return_value = {"key": "value"} # 测试代码使用mock_response而不是真实API调用 result = process_response(mock_response) assert result == "value" </syntaxhighlight> == 实际应用案例 == 假设我们正在开发一个银行账户系统: <syntaxhighlight lang="python"> class BankAccount: def __init__(self, balance=0): self.balance = balance def deposit(self, amount): if amount <= 0: raise ValueError("Amount must be positive") self.balance += amount def withdraw(self, amount): if amount <= 0: raise ValueError("Amount must be positive") if amount > self.balance: raise ValueError("Insufficient funds") self.balance -= amount </syntaxhighlight> 对应的单元测试: <syntaxhighlight lang="python"> import unittest class TestBankAccount(unittest.TestCase): def setUp(self): self.account = BankAccount(100) def test_initial_balance(self): self.assertEqual(self.account.balance, 100) def test_deposit(self): self.account.deposit(50) self.assertEqual(self.account.balance, 150) def test_withdraw(self): self.account.withdraw(50) self.assertEqual(self.account.balance, 50) def test_negative_deposit(self): with self.assertRaises(ValueError): self.account.deposit(-10) def test_overdraw(self): with self.assertRaises(ValueError): self.account.withdraw(200) </syntaxhighlight> == 最佳实践 == * 保持测试独立:每个测试应该不依赖其他测试的状态 * 测试边界条件:包括最小值、最大值和异常情况 * 测试名称应该具有描述性 * 保持测试快速运行 * 测试覆盖率不是唯一目标,测试质量更重要 == 数学基础 == 在测试数值计算时,可能需要考虑浮点精度问题。可以使用近似比较: <math>|a - b| < \epsilon</math> 在Python中可以实现为: <syntaxhighlight lang="python"> def almost_equal(a, b, epsilon=1e-7): return abs(a - b) < epsilon </syntaxhighlight> == 总结 == 单元测试是Python开发中不可或缺的一部分。通过系统性地编写测试,可以: * 提高代码质量 * 减少回归错误 * 增强对代码修改的信心 * 提供代码行为的文档 无论是使用unittest还是pytest,良好的测试习惯都能显著提升项目的可维护性和可靠性。 [[Category:编程语言]] [[Category:Python]] [[Category:Python 测试与调试]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)