2026-07-25 17:01:49
在Python中进行单元测试,可通过内置的unittest模块或第三方pytest框架实现。核心步骤包括编写测试用例、使用断言验证逻辑、处理依赖关系,并遵循最佳实践提升测试质量。
一、使用unittest模块进行单元测试导入模块
import unittest创建测试类继承unittest.TestCase,定义测试类:
class MyTest(unittest.TestCase): pass # 后续添加测试方法编写测试方法方法名需以test_开头,包含断言语句:
class MyTest(unittest.TestCase): def test_addition(self): self.assertEqual(2 + 2, 4) # 断言2+2等于4常用断言方法
assertEqual(a, b):验证a == b
assertTrue(x):验证x为真
assertFalse(x):验证x为假
assertRaises(exc, fun, *args):验证函数fun是否抛出异常exc
运行测试
脚本内运行:在文件末尾添加以下代码:if __name__ == '__main__': unittest.main()
命令行运行:python -m unittest your_test_file.py
组织测试用例对于大型项目,可通过TestSuite和TestLoader分类管理测试:
suite = unittest.TestLoader().loadTestsFromTestCase(MyTest)unittest.TextTestRunner().run(suite)覆盖多种场景
正常情况:验证函数在预期输入下的行为。
边界情况:测试零、负数、极大/极小值等极端输入。
异常情况:验证函数对无效输入的处理(如抛出异常)。
处理依赖关系使用unittest.mock模拟外部依赖(如API调用、数据库):
from unittest.mock import patchdef get_data_from_api(): pass # 实际调用外部API@patch('your_module.get_data_from_api') # 替换为模拟对象def test_api_call(mock_get_data): mock_get_data.return_value = {'data': 'mocked'} # 设置模拟返回值 result = your_function_using_api() # 调用被测函数 self.assertEqual(result, {'data': 'mocked'})测试驱动开发(TDD)先编写测试用例,再实现功能,确保代码可测试性。
保持测试独立每个测试用例不应依赖其他测试的执行顺序或状态。
命名清晰测试方法名应明确描述测试场景,例如:
test_addition_with_positive_numbers(优于test_add)
test_login_with_invalid_password
持续集成将单元测试集成到CI/CD流程中,自动运行测试并反馈结果。
代码覆盖率使用工具(如coverage.py)衡量测试覆盖的代码比例,但避免盲目追求100%。
安装与基本用法
pip install pytest编写测试函数(无需继承类):
def test_addition(): assert 2 + 2 == 4 # 使用自然断言语法优势功能
Fixtures:管理测试前置/后置操作(如初始化数据库)。
参数化测试:通过@pytest.mark.parametrize测试多组输入。
插件生态:支持覆盖率报告、并行测试等扩展功能。
适用场景
大型项目:pytest的简洁语法和强大功能更高效。
小型项目:unittest无需额外依赖,适合轻量级需求。