如何编写Python unittest用例覆盖仅含日志语句的except代码块
单元测试覆盖Celery任务except块的实现方法
核心思路:模拟try块中调用的set_data_in_db函数抛出任意异常,即可触发异常捕获分支。你可以直接用Python标准库自带的unittest.mock实现,无需额外依赖:
- 第一步:在测试用例中mock掉
set_data_in_db,指定它被调用时主动抛出异常 - 第二步:执行
set_data_task任务,验证except块内的逻辑是否符合预期 - 第三步:可选验证异常日志、异常处理动作是否符合设计要求
以下是可直接运行的测试用例示例:
from unittest.mock import patch from 你的任务模块路径 import set_data_task # 替换为你实际存放celery任务的模块路径 def test_set_data_task_exception_branch(): # mock set_data_in_db,触发异常 with patch("你的任务模块路径.set_data_in_db") as mock_db_func: mock_db_func.side_effect = Exception("模拟数据库写入失败") # mock日志对象,验证异常日志输出 with patch("你的任务模块路径.logger") as mock_logger: # 直接调用任务函数即可测试内部逻辑,不需要启动Celery worker set_data_task() # 验证mock的函数被正确调用 mock_db_func.assert_called_once_with(value=None) # 验证except块内的日志逻辑正常执行 mock_logger.error.assert_called_once_with( "data could not be set", exc_info=True )
注意事项
- patch的路径需要写任务模块中实际导入使用的
set_data_in_db路径,不要写它原始定义模块的路径,否则mock不会生效 - 如果需要测试特定类型的异常捕获逻辑,可以把
side_effect指定为对应的异常类实例,测试精准度更高
内容的提问来源于stack exchange,提问作者ninjacode
相关产品推荐
相关产品推荐

