mirror of
https://github.com/gentoo-mirror/gentoo.git
synced 2026-01-05 00:08:05 +03:00
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>
80 lines
2.7 KiB
Diff
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.
|