Report teardown output on test failure
Until now, teardown stdout/stderr output was not reported upon test failure. However such output is sometime necessary to understand the failure. fix #442
This commit is contained in:
parent
35d154f580
commit
6f93ffb5d4
1
AUTHORS
1
AUTHORS
|
@ -90,6 +90,7 @@ Markus Unterwaditzer
|
||||||
Martijn Faassen
|
Martijn Faassen
|
||||||
Martin K. Scherer
|
Martin K. Scherer
|
||||||
Martin Prusse
|
Martin Prusse
|
||||||
|
Mathieu Clabaut
|
||||||
Matt Bachmann
|
Matt Bachmann
|
||||||
Matt Williams
|
Matt Williams
|
||||||
Matthias Hafner
|
Matthias Hafner
|
||||||
|
|
|
@ -17,7 +17,8 @@
|
||||||
or implicitly as a plugin (`#2005`_).
|
or implicitly as a plugin (`#2005`_).
|
||||||
Thanks `@RonnyPfannschmidt`_ for the report and `@nicoddemus`_ for the PR.
|
Thanks `@RonnyPfannschmidt`_ for the report and `@nicoddemus`_ for the PR.
|
||||||
|
|
||||||
*
|
* Report teardown output on test failure (`#442`_).
|
||||||
|
Thanks `@matclab`_ or the PR.
|
||||||
|
|
||||||
*
|
*
|
||||||
|
|
||||||
|
@ -26,7 +27,9 @@
|
||||||
|
|
||||||
.. _@cwitty: https://github.com/cwitty
|
.. _@cwitty: https://github.com/cwitty
|
||||||
.. _@okulynyak: https://github.com/okulynyak
|
.. _@okulynyak: https://github.com/okulynyak
|
||||||
|
.. _@matclab: https://github.com/matclab
|
||||||
|
|
||||||
|
.. _#442: https://github.com/pytest-dev/pytest/issues/442
|
||||||
.. _#1976: https://github.com/pytest-dev/pytest/issues/1976
|
.. _#1976: https://github.com/pytest-dev/pytest/issues/1976
|
||||||
.. _#1998: https://github.com/pytest-dev/pytest/issues/1998
|
.. _#1998: https://github.com/pytest-dev/pytest/issues/1998
|
||||||
.. _#2004: https://github.com/pytest-dev/pytest/issues/2004
|
.. _#2004: https://github.com/pytest-dev/pytest/issues/2004
|
||||||
|
|
|
@ -458,6 +458,15 @@ class TerminalReporter:
|
||||||
self.write_sep("_", msg)
|
self.write_sep("_", msg)
|
||||||
self._outrep_summary(rep)
|
self._outrep_summary(rep)
|
||||||
|
|
||||||
|
def print_teardown_sections(self, rep):
|
||||||
|
for secname, content in rep.sections:
|
||||||
|
if 'teardown' in secname:
|
||||||
|
self._tw.sep('-', secname)
|
||||||
|
if content[-1:] == "\n":
|
||||||
|
content = content[:-1]
|
||||||
|
self._tw.line(content)
|
||||||
|
|
||||||
|
|
||||||
def summary_failures(self):
|
def summary_failures(self):
|
||||||
if self.config.option.tbstyle != "no":
|
if self.config.option.tbstyle != "no":
|
||||||
reports = self.getreports('failed')
|
reports = self.getreports('failed')
|
||||||
|
@ -473,6 +482,9 @@ class TerminalReporter:
|
||||||
markup = {'red': True, 'bold': True}
|
markup = {'red': True, 'bold': True}
|
||||||
self.write_sep("_", msg, **markup)
|
self.write_sep("_", msg, **markup)
|
||||||
self._outrep_summary(rep)
|
self._outrep_summary(rep)
|
||||||
|
for report in self.getreports(''):
|
||||||
|
if report.nodeid == rep.nodeid and report.when == 'teardown':
|
||||||
|
self.print_teardown_sections(report)
|
||||||
|
|
||||||
def summary_errors(self):
|
def summary_errors(self):
|
||||||
if self.config.option.tbstyle != "no":
|
if self.config.option.tbstyle != "no":
|
||||||
|
|
|
@ -370,6 +370,31 @@ class TestFixtureReporting:
|
||||||
"*1 failed*1 error*",
|
"*1 failed*1 error*",
|
||||||
])
|
])
|
||||||
|
|
||||||
|
def test_setup_teardown_output_and_test_failure(self, testdir):
|
||||||
|
""" Test for issue #442 """
|
||||||
|
testdir.makepyfile("""
|
||||||
|
def setup_function(function):
|
||||||
|
print ("setup func")
|
||||||
|
|
||||||
|
def test_fail():
|
||||||
|
assert 0, "failingfunc"
|
||||||
|
|
||||||
|
def teardown_function(function):
|
||||||
|
print ("teardown func")
|
||||||
|
""")
|
||||||
|
result = testdir.runpytest()
|
||||||
|
result.stdout.fnmatch_lines([
|
||||||
|
"*test_fail*",
|
||||||
|
"*def test_fail():",
|
||||||
|
"*failingfunc*",
|
||||||
|
"*Captured stdout setup*",
|
||||||
|
"*setup func*",
|
||||||
|
"*Captured stdout teardown*",
|
||||||
|
"*teardown func*",
|
||||||
|
|
||||||
|
"*1 failed*",
|
||||||
|
])
|
||||||
|
|
||||||
class TestTerminalFunctional:
|
class TestTerminalFunctional:
|
||||||
def test_deselected(self, testdir):
|
def test_deselected(self, testdir):
|
||||||
testpath = testdir.makepyfile("""
|
testpath = testdir.makepyfile("""
|
||||||
|
|
Loading…
Reference in New Issue