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

如何使用pytest测试except异常捕获代码块的副作用

测试触发异常分支后等待异常处理完成再断言的实现方案

核心需求

在测试时主动抛出异常触发对应except代码块,等待except块全部执行完成后再运行断言校验逻辑。

待测试方法

def main(args, symbol_store):
    t = None
    try:
        t = parse_and_download(args.output, args.symbols, symbol_store)
        t.wait()
    except KeyboardInterrupt:
        if t is not None:
            t.set()
            print(string_downloads_cancelled, flush=True)

最初的错误实现

最开始设计的测试逻辑如下:

raise KeyboardInterrupt
assert not os.path.exists(test_symbol_store)

该写法存在明显问题:直接抛出异常后,后续的断言语句完全不可达;就算调整写法让断言可达,也无法保证断言运行前except块的逻辑已经全部执行完成。

最终可行方案

参考MrBean Breman的建议,使用pytest_mocker对wait函数进行mock,指定调用时抛出KeyboardInterrupt即可:

mocker.patch('main.DownloadManager.DownloadThread.wait', side_effect=KeyboardInterrupt)

该方案可以精准命中目标except分支,且会等待except块的逻辑全部执行完成后再运行后续测试代码,运行效果符合预期。


内容的提问来源于stack exchange,提问作者Al G Johnston

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:24:05