Skip to content

Commit

Permalink
Fixed issue shadowing error when missing argument on teardown_method
Browse files Browse the repository at this point in the history
When the method argument is missing on teardown_method, the traceback is
100% internal to pytest, which with default options get pruned. Then
that traceback is empty, leading to a new exception as a traceback shall
not be empty.

This PR fixes that issue by pushing back the last stack on the
traceback, when the stacktrace is empty after pruning. Then the output
is still pruned, but gives meaningful information with the item where it
failed on the stack.

* fixes issue pytest-dev#1604

Signed-off-by: Guyzmo <guyzmo+github@m0g.net>
  • Loading branch information
guyzmo committed Jun 12, 2016
1 parent 577cce2 commit accd962
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 1 deletion.
1 change: 1 addition & 0 deletions AUTHORS
Expand Up @@ -91,3 +91,4 @@ Thomas Grainger
Tom Viner
Trevor Bekolay
Wouter van Ackooy
Bernard Pratz
4 changes: 3 additions & 1 deletion CHANGELOG.rst
Expand Up @@ -6,7 +6,8 @@
* Text documents without any doctests no longer appear as "skipped".
Thanks `@graingert`_ for reporting and providing a full PR (`#1580`_).

*
* Fix internal error issue when ``method`` argument is missing for
``teardown_method()``. Fixes (`#1605`_).

*

Expand All @@ -15,6 +16,7 @@
`@marscher`. Thanks `@nicoddemus` for his help.

.. _#1580: https://github.com/pytest-dev/pytest/issues/1580
.. _#1605: https://github.com/pytest-dev/pytest/issues/1605

.. _@graingert: https://github.com/graingert

Expand Down
3 changes: 3 additions & 0 deletions _pytest/main.py
Expand Up @@ -392,7 +392,10 @@ def _repr_failure_py(self, excinfo, style=None):
if self.config.option.fulltrace:
style="long"
else:
tb = _pytest._code.Traceback([excinfo.traceback[-1]])
self._prunetraceback(excinfo)
if len(excinfo.traceback) == 0:
excinfo.traceback = tb
tbfilter = False # prunetraceback already does it
if style == "auto":
style = "long"
Expand Down
33 changes: 33 additions & 0 deletions testing/test_runner.py
Expand Up @@ -228,6 +228,39 @@ def teardown_function(func):
assert reps[5].nodeid.endswith("test_func")
assert reps[5].failed

def test_exact_teardown_issue1206(self, testdir):
rec = testdir.inline_runsource("""
import pytest
class TestClass:
def teardown_method(self):
pass
def test_method(self):
assert True
""")
reps = rec.getreports("pytest_runtest_logreport")
print (reps)
assert len(reps) == 3
#
assert reps[0].nodeid.endswith("test_method")
assert reps[0].passed
assert reps[0].when == 'setup'
#
assert reps[1].nodeid.endswith("test_method")
assert reps[1].passed
assert reps[1].when == 'call'
#
assert reps[2].nodeid.endswith("test_method")
assert reps[2].failed
assert reps[2].when == "teardown"
assert reps[2].longrepr.reprcrash.message in (
# python3 error
'TypeError: teardown_method() takes 1 positional argument but 2 were given',
# python2 error
'TypeError: teardown_method() takes exactly 1 argument (2 given)'
)

def test_failure_in_setup_function_ignores_custom_repr(self, testdir):
testdir.makepyfile(conftest="""
import pytest
Expand Down

0 comments on commit accd962

Please sign in to comment.