Merge pull request #4145 from labcodes/4098
Add returncode argument to pytest.exit
This commit is contained in:
commit
141c51f0cb
|
@ -0,0 +1 @@
|
||||||
|
Add returncode argument to pytest.exit() to exit pytest with a specific return code.
|
|
@ -185,10 +185,13 @@ def wrap_session(config, doit):
|
||||||
session.exitstatus = EXIT_TESTSFAILED
|
session.exitstatus = EXIT_TESTSFAILED
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
excinfo = _pytest._code.ExceptionInfo()
|
excinfo = _pytest._code.ExceptionInfo()
|
||||||
if initstate < 2 and isinstance(excinfo.value, exit.Exception):
|
exitstatus = EXIT_INTERRUPTED
|
||||||
|
if initstate <= 2 and isinstance(excinfo.value, exit.Exception):
|
||||||
sys.stderr.write("{}: {}\n".format(excinfo.typename, excinfo.value.msg))
|
sys.stderr.write("{}: {}\n".format(excinfo.typename, excinfo.value.msg))
|
||||||
|
if excinfo.value.returncode is not None:
|
||||||
|
exitstatus = excinfo.value.returncode
|
||||||
config.hook.pytest_keyboard_interrupt(excinfo=excinfo)
|
config.hook.pytest_keyboard_interrupt(excinfo=excinfo)
|
||||||
session.exitstatus = EXIT_INTERRUPTED
|
session.exitstatus = exitstatus
|
||||||
except: # noqa
|
except: # noqa
|
||||||
excinfo = _pytest._code.ExceptionInfo()
|
excinfo = _pytest._code.ExceptionInfo()
|
||||||
config.notify_exception(excinfo, config.option)
|
config.notify_exception(excinfo, config.option)
|
||||||
|
|
|
@ -49,18 +49,24 @@ class Failed(OutcomeException):
|
||||||
class Exit(KeyboardInterrupt):
|
class Exit(KeyboardInterrupt):
|
||||||
""" raised for immediate program exits (no tracebacks/summaries)"""
|
""" raised for immediate program exits (no tracebacks/summaries)"""
|
||||||
|
|
||||||
def __init__(self, msg="unknown reason"):
|
def __init__(self, msg="unknown reason", returncode=None):
|
||||||
self.msg = msg
|
self.msg = msg
|
||||||
|
self.returncode = returncode
|
||||||
KeyboardInterrupt.__init__(self, msg)
|
KeyboardInterrupt.__init__(self, msg)
|
||||||
|
|
||||||
|
|
||||||
# exposed helper methods
|
# exposed helper methods
|
||||||
|
|
||||||
|
|
||||||
def exit(msg):
|
def exit(msg, returncode=None):
|
||||||
""" exit testing process as if KeyboardInterrupt was triggered. """
|
"""
|
||||||
|
Exit testing process as if KeyboardInterrupt was triggered.
|
||||||
|
|
||||||
|
:param str msg: message to display upon exit.
|
||||||
|
:param int returncode: return code to be used when exiting pytest.
|
||||||
|
"""
|
||||||
__tracebackhide__ = True
|
__tracebackhide__ = True
|
||||||
raise Exit(msg)
|
raise Exit(msg, returncode)
|
||||||
|
|
||||||
|
|
||||||
exit.Exception = Exit
|
exit.Exception = Exit
|
||||||
|
|
|
@ -570,6 +570,18 @@ def test_pytest_exit_msg(testdir):
|
||||||
result.stderr.fnmatch_lines(["Exit: oh noes"])
|
result.stderr.fnmatch_lines(["Exit: oh noes"])
|
||||||
|
|
||||||
|
|
||||||
|
def test_pytest_exit_returncode(testdir):
|
||||||
|
testdir.makepyfile(
|
||||||
|
"""
|
||||||
|
import pytest
|
||||||
|
def test_foo():
|
||||||
|
pytest.exit("some exit msg", 99)
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
result = testdir.runpytest()
|
||||||
|
assert result.ret == 99
|
||||||
|
|
||||||
|
|
||||||
def test_pytest_fail_notrace_runtest(testdir):
|
def test_pytest_fail_notrace_runtest(testdir):
|
||||||
"""Test pytest.fail(..., pytrace=False) does not show tracebacks during test run."""
|
"""Test pytest.fail(..., pytrace=False) does not show tracebacks during test run."""
|
||||||
testdir.makepyfile(
|
testdir.makepyfile(
|
||||||
|
|
Loading…
Reference in New Issue