如何从test_func入口编写功能测试验证need_to_test调用返回值
功能测试实现方案
原测试草稿问题说明
原测试写法存在几个硬伤,完全无法运行:
test_func是普通类方法,内部没有yield生成器逻辑,用next()调用会直接抛出TypeError- 现有
test_func内部调用start_another_funk后没有接收返回值、也没有返回任何结果,根本拿不到'Red Green'的拼接值 - 直接断言最终返回值没法证明
need_to_test真的被调用,万一流程里其他分支拼接出相同字符串,会出现测试误判
实现思路
要满足「以test_func为唯一入口、不单独直接调用need_to_test、同时确认need_to_test被调用且返回值符合预期」的要求,用方法代理(猴子补丁)的方式实现即可,不需要修改原有业务代码:
- 实例化待测试类的对象
- 代理替换实例上的
need_to_test方法:增加调用标记位记录方法是否被触发,同时保留原方法的执行逻辑,捕获它的返回值 - 仅调用
test_func启动整个执行流程,不直接触碰流程内的其他方法 - 执行完成后做两层断言:一是确认
need_to_test确实被调用过,二是确认它的返回值符合预期
可直接使用的测试代码
class Need_test_func: def need_to_test(self): return 'Red' def start_another_funk(self): return self.need_to_test() + ' Green' def test_func(self): self.start_another_funk() return def test_check(): test_obj = Need_test_func() # 初始化调用标记、返回值捕获变量 need_test_called = False need_test_result = None # 保存原方法引用,不破坏原有执行逻辑 original_func = test_obj.need_to_test def wrapped_need_test(): nonlocal need_test_called, need_test_result need_test_called = True need_test_result = original_func() return need_test_result # 替换实例上的待校验方法 test_obj.need_to_test = wrapped_need_test # 严格按照要求,仅从test_func入口启动全流程 test_obj.test_func() # 核心断言1:确认need_to_test在流程中被正常触发 assert need_test_called, "执行test_func流程时,need_to_test未被调用" # 核心断言2:确认need_to_test返回值符合预期 assert need_test_result == "Red", f"need_to_test返回值不符合预期,实际返回:{need_test_result}"
补充说明
如果需要额外校验全链路的拼接逻辑(即
start_another_funk返回'Red Green'的逻辑),可以用同样的代理方式包装start_another_funk方法捕获返回值做断言;如果业务允许,也可以调整test_func的代码,让它直接返回self.start_another_funk()的执行结果,方便直接获取全链路输出。
内容的提问来源于stack exchange,提问作者self
相关产品推荐
相关产品推荐

