diff --git a/CHANGELOG b/CHANGELOG index 8221625f7..1e24c029d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -15,6 +15,7 @@ Changes between 2.0.3 and 2.1.0.DEV - fix issue44: env/username expansion for junitxml file path - show releaselevel information in test runs for pypy - reworked doc pages for better navigation and PDF generation +- report KeyboardInterrupt even if interrupted during session startup Changes between 2.0.2 and 2.0.3 ---------------------------------------------- diff --git a/_pytest/terminal.py b/_pytest/terminal.py index eaa0ae7d0..03b6e8c83 100644 --- a/_pytest/terminal.py +++ b/_pytest/terminal.py @@ -318,12 +318,17 @@ class TerminalReporter: self.config.hook.pytest_terminal_summary(terminalreporter=self) if exitstatus == 2: self._report_keyboardinterrupt() + del self._keyboardinterrupt_memo self.summary_deselected() self.summary_stats() def pytest_keyboard_interrupt(self, excinfo): self._keyboardinterrupt_memo = excinfo.getrepr(funcargs=True) + def pytest_unconfigure(self): + if hasattr(self, '_keyboardinterrupt_memo'): + self._report_keyboardinterrupt() + def _report_keyboardinterrupt(self): excrepr = self._keyboardinterrupt_memo msg = excrepr.reprcrash.message diff --git a/testing/test_terminal.py b/testing/test_terminal.py index 9789cb19f..317f2e932 100644 --- a/testing/test_terminal.py +++ b/testing/test_terminal.py @@ -167,6 +167,19 @@ class TestTerminal: ]) result.stdout.fnmatch_lines(['*KeyboardInterrupt*']) + def test_keyboard_in_sessionstart(self, testdir): + testdir.makeconftest(""" + def pytest_sessionstart(): + raise KeyboardInterrupt + """) + p = testdir.makepyfile(""" + def test_foobar(): + pass + """) + + result = testdir.runpytest() + assert result.ret == 2 + result.stdout.fnmatch_lines(['*KeyboardInterrupt*']) class TestCollectonly: