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.
