如何使用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
相关产品推荐
相关产品推荐

