如何用测试函数装饰器安全屏蔽被测函数的print输出
实现
some_decorator 屏蔽被测函数的print输出 这里有一个精准适配你需求的解决方案——通过临时替换被测模块的print函数,既能屏蔽script模块内函数的输出,又不会影响测试函数自身的print调用。以下是完整实现:
完整的 test_script.py 代码
import importlib from typing import Callable file_name = "script" script = importlib.import_module(file_name) def some_decorator(test_func: Callable) -> Callable: def wrapper(): # 保存script模块原本的print函数 original_print = script.print # 将script的print替换为无操作的空函数 script.print = lambda *args, **kwargs: None try: # 执行测试函数:自身的print用全局print正常输出,script内的print被屏蔽 test_func() finally: # 无论测试执行结果如何,都恢复原print函数,避免影响后续逻辑 script.print = original_print return wrapper @some_decorator def test_func(): print("test_script") script.func() test_func()
方案原理说明
- 精准屏蔽:我们直接替换了
script模块的print函数,这样script.func()内部调用的print会变成空操作,完全不会产生输出。 - 保留测试输出:测试函数自身的
print调用的是全局的print函数,不受模块内替换的影响,所以会正常打印test_script。 - 安全恢复:使用
try...finally块确保无论测试函数执行是否抛出异常,都能恢复script模块原有的print函数,避免对其他依赖该模块的代码造成副作用。
更通用的版本(可选)
如果你的测试场景涉及多个被测模块,可以把装饰器改成支持传入目标模块的形式,灵活性更高:
def suppress_module_print(target_module) -> Callable: def decorator(test_func: Callable) -> Callable: def wrapper(): original_print = target_module.print target_module.print = lambda *args, **kwargs: None try: test_func() finally: target_module.print = original_print return wrapper return decorator # 使用方式: @suppress_module_print(script) def test_func(): print("test_script") script.func()
内容的提问来源于stack exchange,提问作者Melvin
相关产品推荐
相关产品推荐

