Files
gentoo/dev-python/pytest/files/pytest-9.0.0-skiptest.patch
Michał Górny 2613134d17 dev-python/pytest: Backport fix for SkipTest exception handling
Backport an upstream fix for handling SkipTest exceptions raised
outside unittest.TestCase, which also happens to fix unittest.skipIf()
on top-level test functions (needed for dev-python/botocore).

Bug: https://github.com/pytest-dev/pytest/issues/13895
Pull-Request: https://github.com/pytest-dev/pytest/pull/13912
Signed-off-by: Michał Górny <mgorny@gentoo.org>
2025-11-11 07:49:38 +01:00

80 lines
2.7 KiB
Diff

From 2ef26ee296c917d1699e283863921c134866d622 Mon Sep 17 00:00:00 2001
From: Bruno Oliveira <bruno@pytest.org>
Date: Mon, 10 Nov 2025 08:51:35 -0300
Subject: [PATCH] Restore skipping tests via `raise unittest.SkipTest`
Revert "Remove unused code related to `nose` (#13528)"
This reverts commit a620d24376eb2c4bc964f2b6efcc694a4adbbe21 and modifies it adding tests and docs.
Fixes #13895
--- a/src/_pytest/unittest.py
+++ b/src/_pytest/unittest.py
@@ -476,6 +476,14 @@ def pytest_runtest_makereport(item: Item, call: CallInfo[None]) -> None:
except AttributeError:
pass
+ # Convert unittest.SkipTest to pytest.skip.
+ # This covers explicit `raise unittest.SkipTest`.
+ unittest = sys.modules.get("unittest")
+ if unittest and call.excinfo and isinstance(call.excinfo.value, unittest.SkipTest):
+ excinfo = call.excinfo
+ call2 = CallInfo[None].from_call(lambda: skip(str(excinfo.value)), call.when)
+ call.excinfo = call2.excinfo
+
def _is_skipped(obj) -> bool:
"""Return True if the given object has been marked with @unittest.skip."""
--- a/testing/test_unittest.py
+++ b/testing/test_unittest.py
@@ -1094,6 +1094,49 @@ def test_two(self):
result.assert_outcomes(passed=2)
+def test_skip_setup_class(pytester: Pytester) -> None:
+ """Skipping tests in a class by raising unittest.SkipTest in `setUpClass` (#13985)."""
+ pytester.makepyfile(
+ """
+ import unittest
+
+ class Test(unittest.TestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ raise unittest.SkipTest('Skipping setupclass')
+
+ def test_foo(self):
+ assert False
+
+ def test_bar(self):
+ assert False
+ """
+ )
+ result = pytester.runpytest()
+ result.assert_outcomes(skipped=2)
+
+
+def test_unittest_skip_function(pytester: Pytester) -> None:
+ """
+ Ensure raising an explicit unittest.SkipTest skips standard pytest functions.
+
+ Support for this is debatable -- technically we only support unittest.SkipTest in TestCase subclasses,
+ but stating this support here in this test because users currently expect this to work,
+ so if we ever break it we at least know we are breaking this use case (#13985).
+ """
+ pytester.makepyfile(
+ """
+ import unittest
+
+ def test_foo():
+ raise unittest.SkipTest('Skipping test_foo')
+ """
+ )
+ result = pytester.runpytest()
+ result.assert_outcomes(skipped=1)
+
+
def test_testcase_handles_init_exceptions(pytester: Pytester) -> None:
"""
Regression test to make sure exceptions in the __init__ method are bubbled up correctly.