gpt4 book ai didi

python - 如何测试自定义 excepthook 是否已正确安装?

转载 作者:太空狗 更新时间:2023-10-29 21:12:12 25 4
gpt4 key购买 nike

我的应用记录了未处理的异常。

# app.py
import logging
import sys

logger = logging.getLogger(__name__)

def excepthook(exc_type, exc_value, traceback):
exc_info = exc_type, exc_value, traceback
if not issubclass(exc_type, (KeyboardInterrupt, SystemExit)):
logger.error('Unhandled exception', exc_info=exc_info)
sys.__excepthook__(*exc_info)

sys.excepthook = excepthook

def potato():
logger.warning('about to die...')
errorerrorerror

if __name__ == '__main__':
potato()

这些测试正常通过:

# test_app.py
import app
import pytest
import sys
from logging import WARNING, ERROR

def test_potato_raises():
with pytest.raises(NameError):
app.potato()

def test_excepthook_is_set():
assert sys.excepthook is app.excepthook

# for caplog plugin: pip install pytest-catchlog
def test_excepthook_logs(caplog):
try:
whatever
except NameError as err:
exc_info = type(err), err, err.__traceback__
app.excepthook(*exc_info)
assert caplog.record_tuples == [('app', ERROR, 'Unhandled exception')]
[record] = caplog.records
assert record.exc_info == exc_info

但我无法测试未处理的异常日志是否正常工作:

def test_unhandled_exceptions_logged(caplog):
try:
app.potato()
finally:
assert caplog.record_tuples == [
('app', WARNING, 'about to die...'),
('app', ERROR, 'Unhandled exception'),
]
return # return eats exception

这是怎么回事?我们如何才能真正从测试中触发 app.excepthook

最佳答案

Python 不会调用 sys.excepthook 直到异常实际上一直传播到整个堆栈并且没有更多的代码有机会捕获它。这是 Python 为响应异常而关闭之前发生的最后一件事。

只要您的测试代码仍在堆栈上,sys.excepthook 就不会触发。实际上可以在 sys.excepthook 之后运行的少量代码可能无法很好地与您的测试框架配合使用。例如,atexit处理程序仍然可以运行,但到那时测试已经结束。此外,如果您不这样做,您的测试框架可能会自己捕获异常,因此 sys.excepthook 无论如何都不会触发。

如果您不想自己调用 sys.excepthook,最好的办法是启动一个安装了 excepthook 的整个子进程并验证子进程的行为。

from subprocess import Popen, PIPE

def test_app():
proc = Popen([sys.executable, 'app.py'], stdout=PIPE, stderr=PIPE)
stdout, stderr = proc.communicate()
assert proc.returncode == 1
assert stdout == b''
assert stderr.startswith(b'about to die...\nUnhandled exception')

关于python - 如何测试自定义 excepthook 是否已正确安装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46310034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com