编写单元测试时,封装相似错误消息是否有通用规范?
统一生成单元测试错误消息的通用方案
完全可以通过提取通用函数解决这类重复错误消息导致的代码杂乱问题,以下是具体实现规范和示例:
1. 提取错误消息生成函数
先拆解错误消息的固定结构:所有消息核心为「One of {待检查任务集合} not found in {上下游关系} to {目标任务} task」,仅三个变量会变化:待检查任务、关系类型(upstream/downstream)、目标任务。基于此封装生成函数:
def generate_task_relation_error_msg(check_tasks, relation_type, target_task): # 统一消息大小写风格,避免格式不一致 return f'One of {check_tasks} not found in {relation_type} to {target_task} task'
2. (可选)封装断言逻辑
由于你的断言结构也高度相似,可进一步将断言逻辑和错误消息生成封装在一起,彻底消除重复代码:
def assert_task_relation(self, check_tasks, related_tasks, relation_type, target_task): self.assertTrue( all(task in related_tasks for task in check_tasks), generate_task_relation_error_msg(check_tasks, relation_type, target_task) )
3. 简化原有测试代码
使用封装后的函数,原测试代码可简化为:
# Test that compare_pass1 is downstream to secondary_pass1 self.assert_task_relation( {compare_pass1}, all_downstream_task_for_secondary_pass1_task, "downstream", secondary_pass1_task ) # Check that primary_pass1 is upstream to secondary_pass1 self.assert_task_relation( {primary_pass1_task}, all_upstream_task_for_secondary_pass1_task, "upstream", secondary_pass1_task ) # Check that secondary_pass1 is upstream to compare_pass1 self.assert_task_relation( {secondary_pass1_task}, all_upstream_task_for_compare_pass1_task, "upstream", compare_pass1_task )
通用规范要点
- 提取变量化模板:将错误消息中动态变化的部分作为函数参数,固定文本作为模板字符串,确保格式统一
- 保持风格一致性:统一错误消息的大小写、措辞,避免出现类似"one of"和"One of"的不一致情况
- 参数命名清晰:函数参数需明确表达含义(如
relation_type、check_tasks),提升代码可读性 - 按需封装断言:若断言逻辑重复度高,可将断言和错误消息生成结合封装,进一步减少冗余
内容的提问来源于stack exchange,提问作者user21641220
相关产品推荐
相关产品推荐

