Python函数单元测试需隔离外部依赖,用unittest.mock按需打桩、依赖注入提升可测性,真实I/O仅在集成测试中验证。
Python函数测试的核心是让被测函数在可控环境中运行,避免受数据库、网络请求、文件系统等外部因素干扰。真实调用这些依赖不仅慢,还容易因环境差异导致测试失败。因此,测试时应用模拟(mock)或桩(stub)替换掉所有非本函数逻辑的外部调用。
Python标准库的unittest.mock是最常用方案。关键不是“禁用所有东西”,而是按需替换具体对象:
@patch('requests.get')
patch.object(UserService, 'fetch_by_id')
side_effect=[ValueError, {'id': 1}]用于测试多分支逻辑如果函数内部直接调用或
datetime.now()open(),就很难控制输入。改用依赖注入能大幅提升可测性:
datetime(2025, 1, 1)
StringIO)def process_data():改为def process_data(clock=None, storage=None):,默认值保持向后兼容单元测试不碰磁盘和网络,但不代表完全跳过——单独写集成测试验证端到端流程。例如:
tempfile.TemporaryDirectory()做安全文件读写测试http.server)模拟API响应,再调用被测函数发起请求tests/integration/),CI中可选运行,避免拖慢日常开发反馈