咨询:如何使用pytest测试函数内部变量a、b的值?
测试函数内部局部变量的方法
你的func函数中,a和b是局部变量,函数执行完毕后会被销毁,直接调用无法获取处理后的值。以下是两种场景的解决方案:
场景1:允许修改原函数
最直接的方式是让函数返回处理后的a和b:
def func(a,b): a=a*2 b=b*3 return a, b
测试时直接调用并断言结果:
def test_func(): res_a, res_b = func(2, 3) assert res_a == 4 assert res_b == 9
场景2:无法修改原函数
如果不能改动原函数,可以通过以下方式捕获局部变量:
方法1:利用inspect和系统追踪
import inspect import sys def get_post_exec_locals(func, *args, **kwargs): target_frame = None def trace_callback(frame, event, arg): nonlocal target_frame if event == 'return': target_frame = frame return trace_callback sys.settrace(trace_callback) try: func(*args, **kwargs) finally: sys.settrace(None) return target_frame.f_locals if target_frame else {} # 执行测试 result_locals = get_post_exec_locals(func, 2, 3) assert result_locals['a'] == 4 assert result_locals['b'] == 9
方法2:用装饰器包装函数
import inspect def capture_func_locals(func): def wrapper(*args, **kwargs): func(*args, **kwargs) # 获取原函数执行后的局部变量 return inspect.currentframe().f_back.f_locals return wrapper # 执行测试 wrapped_func = capture_func_locals(func) result_locals = wrapped_func(2, 3) assert result_locals['a'] == 4 assert result_locals['b'] == 9
关于mock.patch和call_args_list的说明
这两个工具主要用于测试函数调用外部依赖的场景(比如调用其他函数、类方法),用来验证依赖是否被正确调用、传入参数是否符合预期,并不适合用来获取函数内部的局部变量,所以你的场景用它们是找错了工具。
内容的提问来源于stack exchange,提问作者rohit gupta
相关产品推荐
相关产品推荐

