You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询:如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:42:39