diff --git a/changelog/2548.bugfix.rst b/changelog/2548.bugfix.rst new file mode 100644 index 000000000..8ee3b6462 --- /dev/null +++ b/changelog/2548.bugfix.rst @@ -0,0 +1 @@ +Fix line offset mismatch with skipped tests in terminal summary. diff --git a/src/_pytest/skipping.py b/src/_pytest/skipping.py index 53737816f..9eaa77d17 100644 --- a/src/_pytest/skipping.py +++ b/src/_pytest/skipping.py @@ -161,9 +161,9 @@ def pytest_runtest_makereport(item, call): # skipped by mark.skipif; change the location of the failure # to point to the item definition, otherwise it will display # the location of where the skip exception was raised within pytest - filename, line, reason = rep.longrepr + _, _, reason = rep.longrepr filename, line = item.location[:2] - rep.longrepr = filename, line, reason + rep.longrepr = filename, line + 1, reason # called by terminalreporter progress reporting diff --git a/src/_pytest/terminal.py b/src/_pytest/terminal.py index 228fc4219..216ad0417 100644 --- a/src/_pytest/terminal.py +++ b/src/_pytest/terminal.py @@ -954,7 +954,7 @@ class TerminalReporter: if lineno is not None: lines.append( "%s [%d] %s:%d: %s" - % (verbose_word, num, fspath, lineno + 1, reason) + % (verbose_word, num, fspath, lineno, reason) ) else: lines.append("%s [%d] %s: %s" % (verbose_word, num, fspath, reason)) diff --git a/testing/test_skipping.py b/testing/test_skipping.py index 8ba77ba12..86f328a93 100644 --- a/testing/test_skipping.py +++ b/testing/test_skipping.py @@ -731,23 +731,37 @@ def test_skipif_class(testdir): def test_skipped_reasons_functional(testdir): testdir.makepyfile( test_one=""" + import pytest from conftest import doskip + def setup_function(func): doskip() + def test_func(): pass + class TestClass(object): def test_method(self): doskip() - """, + + @pytest.mark.skip("via_decorator") + def test_deco(self): + assert 0 + """, conftest=""" - import pytest + import pytest, sys def doskip(): + assert sys._getframe().f_lineno == 3 pytest.skip('test') """, ) result = testdir.runpytest("-rs") - result.stdout.fnmatch_lines(["*SKIP*2*conftest.py:4: test"]) + result.stdout.fnmatch_lines_random( + [ + "SKIPPED [[]2[]] */conftest.py:4: test", + "SKIPPED [[]1[]] test_one.py:14: via_decorator", + ] + ) assert result.ret == 0