diff --git a/AUTHORS b/AUTHORS index d740fee5ce3..28cce969d63 100644 --- a/AUTHORS +++ b/AUTHORS @@ -91,3 +91,4 @@ Thomas Grainger Tom Viner Trevor Bekolay Wouter van Ackooy +Bernard Pratz diff --git a/CHANGELOG.rst b/CHANGELOG.rst index adc6993ebb8..1a8dc943331 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -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`_). * @@ -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 diff --git a/_pytest/main.py b/_pytest/main.py index f608a7ecd5c..4a6c0877557 100644 --- a/_pytest/main.py +++ b/_pytest/main.py @@ -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" diff --git a/testing/test_runner.py b/testing/test_runner.py index 4421c5d0d29..377801132c7 100644 --- a/testing/test_runner.py +++ b/testing/test_runner.py @@ -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