Skip to content

fixtures: show test as skip location if skipped from an xunit setup function #11217

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 17, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog/11216.improvement.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
If a test is skipped from inside an :ref:`xunit setup fixture <classic xunit>`, the test summary now shows the test location instead of the fixture location.
7 changes: 4 additions & 3 deletions src/_pytest/fixtures.py
Original file line number Diff line number Diff line change
Expand Up @@ -1162,9 +1162,10 @@ def pytest_fixture_setup(
try:
result = call_fixture_func(fixturefunc, request, kwargs)
except TEST_OUTCOME as e:
if isinstance(e, skip.Exception) and not fixturefunc.__name__.startswith(
"xunit_setup"
):
if isinstance(e, skip.Exception):
# The test requested a fixture which caused a skip.
# Don't show the fixture as the skip location, as then the user
# wouldn't know which test skipped.
e._use_item_location = True
fixturedef.cached_result = (None, my_cache_key, e)
raise
Expand Down
21 changes: 11 additions & 10 deletions testing/test_skipping.py
Original file line number Diff line number Diff line change
Expand Up @@ -989,33 +989,34 @@ def test_skipped_reasons_functional(pytester: Pytester) -> None:
pytester.makepyfile(
test_one="""
import pytest
from conftest import doskip
from helpers import doskip

def setup_function(func):
doskip()
def setup_function(func): # LINE 4
doskip("setup function")

def test_func():
pass

class TestClass(object):
class TestClass:
def test_method(self):
doskip()
doskip("test method")

@pytest.mark.skip("via_decorator")
@pytest.mark.skip("via_decorator") # LINE 14
def test_deco(self):
assert 0
""",
conftest="""
helpers="""
import pytest, sys
def doskip():
def doskip(reason):
assert sys._getframe().f_lineno == 3
pytest.skip('test')
pytest.skip(reason) # LINE 4
""",
)
result = pytester.runpytest("-rs")
result.stdout.fnmatch_lines_random(
[
"SKIPPED [[]2[]] conftest.py:4: test",
"SKIPPED [[]1[]] test_one.py:7: setup function",
"SKIPPED [[]1[]] helpers.py:4: test method",
"SKIPPED [[]1[]] test_one.py:14: via_decorator",
]
)
Expand Down