Skip to content

Commit

Permalink
terminal: report session.shouldfail reason (-x) (#108)
Browse files Browse the repository at this point in the history
  • Loading branch information
blueyed authored Nov 13, 2019
1 parent 283d30c commit 7f1ef03
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 8 deletions.
4 changes: 2 additions & 2 deletions doc/en/usage.rst
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,8 @@ To stop the testing process after the first (N) failures:

.. code-block:: bash
pytest -x # stop after first failure
pytest --maxfail=2 # stop after two failures
pytest -x # stop after first failure
pytest --maxfail=2 # stop after two failures
.. _select-tests:

Expand Down
6 changes: 5 additions & 1 deletion src/_pytest/terminal.py
Original file line number Diff line number Diff line change
Expand Up @@ -800,7 +800,7 @@ def _printcollecteditems(self, items):
self._tw.line("{}{}".format(indent + " ", line.strip()))

@pytest.hookimpl(hookwrapper=True)
def pytest_sessionfinish(self, exitstatus):
def pytest_sessionfinish(self, session: Session, exitstatus: ExitCode):
outcome = yield
outcome.get_result()
self._tw.line("")
Expand All @@ -815,9 +815,13 @@ def pytest_sessionfinish(self, exitstatus):
self.config.hook.pytest_terminal_summary(
terminalreporter=self, exitstatus=exitstatus, config=self.config
)
if session.shouldfail:
self.write_sep("!", session.shouldfail, red=True)
if exitstatus == ExitCode.INTERRUPTED:
self._report_keyboardinterrupt()
del self._keyboardinterrupt_memo
elif session.shouldstop:
self.write_sep("!", session.shouldstop, red=True)
self.summary_stats()

@pytest.hookimpl(hookwrapper=True)
Expand Down
13 changes: 9 additions & 4 deletions testing/test_collection.py
Original file line number Diff line number Diff line change
Expand Up @@ -852,11 +852,15 @@ def test_exit_on_collection_with_maxfail_smaller_than_n_errors(testdir):

res = testdir.runpytest("--maxfail=1")
assert res.ret == 1

res.stdout.fnmatch_lines(
["*ERROR collecting test_02_import_error.py*", "*No module named *asdfa*"]
[
"collected 1 item / 1 error",
"*ERROR collecting test_02_import_error.py*",
"*No module named *asdfa*",
"*! stopping after 1 failures !*",
"*= 1 error in *",
]
)

res.stdout.no_fnmatch_line("*test_03*")


Expand All @@ -869,14 +873,15 @@ def test_exit_on_collection_with_maxfail_bigger_than_n_errors(testdir):

res = testdir.runpytest("--maxfail=4")
assert res.ret == 2

res.stdout.fnmatch_lines(
[
"collected 2 items / 2 errors",
"*ERROR collecting test_02_import_error.py*",
"*No module named *asdfa*",
"*ERROR collecting test_03_import_error.py*",
"*No module named *asdfa*",
"*! Interrupted: 2 errors during collection !*",
"*= 2 errors in *",
]
)

Expand Down
26 changes: 25 additions & 1 deletion testing/test_terminal.py
Original file line number Diff line number Diff line change
Expand Up @@ -1017,7 +1017,31 @@ def test_3():
)
result = testdir.runpytest("--maxfail=2", *option.args)
result.stdout.fnmatch_lines(
["*def test_1():*", "*def test_2():*", "*2 failed*"]
[
"*def test_1():*",
"*def test_2():*",
"*! stopping after 2 failures !*",
"*2 failed*",
]
)

def test_maxfailures_with_interrupted(self, testdir):
testdir.makepyfile(
"""
def test(request):
request.session.shouldstop = "session_interrupted"
assert 0
"""
)
result = testdir.runpytest("--maxfail=1", "-ra")
result.stdout.fnmatch_lines(
[
"*= short test summary info =*",
"FAILED *",
"*! stopping after 1 failures !*",
"*! session_interrupted !*",
"*= 1 failed in*",
]
)

def test_tb_option(self, testdir, option):
Expand Down

0 comments on commit 7f1ef03

Please sign in to comment.