如何在pytest中捕获KeyboardInterrupt?

时间:2016-09-29 02:52:52

标签: python pytest

UnitTests具有捕获KeyboardInterrupt的功能,完成测试然后报告结果。

  

-c, - catch

     测试运行期间

Control-C 等待当前测试结束,然后报告目前为止的所有结果。第二个 Control-C   引发正常的KeyboardInterrupt异常。

     

请参阅信号处理以了解提供此功能的功能。

     

c.f。 https://docs.python.org/2/library/unittest.html#command-line-options

在PyTest中, Ctrl + C 将停止会话。

有没有办法像UniTests一样:

  • 捕获KeyboardInterrupt
  • 完成执行正在进行的测试[可选]
  • 跳过其他测试
  • 显示结果,并可能打印报告(例如使用pytest-html

由于

[编辑2016年11月11日]

我试图将钩子放在我的conftest.py文件中,但它似乎无法正常工作和捕获。特别是,以下内容不会在toto.txt中写任何内容。

def pytest_keyboard_interrupt(excinfo):
    with open('toto.txt', 'w') as f: f.write("Hello")
    pytestmark = pytest.mark.skip('Interrupted Test Session')

有人有新建议吗?

2 个答案:

答案 0 :(得分:1)

您的问题可能出在您的挂钩执行顺序上,这样pytest在执行挂钩之前退出。如果在预先处理键盘中断的过程中发生未处理的异常,则会发生这种情况。

为确保钩子更快执行,请按照here所述使用tryfirsthookwrapper

以下内容应写在 conftest.py 文件中:

import pytest

@pytest.hookimpl(tryfirst=True)
def pytest_keyboard_interrupt(excinfo):
    with open('toto.txt', 'w') as f:
        f.write("Hello")
    pytestmark = pytest.mark.skip('Interrupted Test Session')

答案 1 :(得分:0)

看看pytest的hookspec

他们有关键字中断的钩子。

def pytest_keyboard_interrupt(excinfo):
""" called for keyboard interrupt. """