Skip to content

Commit 7dbe400

Browse files
authored
Merge pull request #4703 from nicoddemus/setup-class-inheritance-4700
Fix setUpClass being called in subclasses that were skipped
2 parents e53563e + c3d7340 commit 7dbe400

File tree

6 files changed

+59
-0
lines changed

6 files changed

+59
-0
lines changed

changelog/4700.bugfix.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix regression where ``setUpClass`` would always be called in subclasses even if all tests
2+
were skipped by a ``unittest.skip()`` decorator applied in the subclass.

src/_pytest/unittest.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ def _make_xunit_fixture(obj, setup_name, teardown_name, scope, pass_self):
8787

8888
@pytest.fixture(scope=scope, autouse=True)
8989
def fixture(self, request):
90+
if getattr(self, "__unittest_skip__", None):
91+
reason = self.__unittest_skip_why__
92+
pytest.skip(reason)
9093
if setup is not None:
9194
if pass_self:
9295
setup(self, request.function)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
"""Skipping an entire subclass with unittest.skip() should *not* call setUp from a base class."""
2+
import unittest
3+
4+
5+
class Base(unittest.TestCase):
6+
def setUp(self):
7+
assert 0
8+
9+
10+
@unittest.skip("skip all tests")
11+
class Test(Base):
12+
def test_foo(self):
13+
assert 0
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
"""Skipping an entire subclass with unittest.skip() should *not* call setUpClass from a base class."""
2+
import unittest
3+
4+
5+
class Base(unittest.TestCase):
6+
@classmethod
7+
def setUpClass(cls):
8+
assert 0
9+
10+
11+
@unittest.skip("skip all tests")
12+
class Test(Base):
13+
def test_foo(self):
14+
assert 0
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
"""setUpModule is always called, even if all tests in the module are skipped"""
2+
import unittest
3+
4+
5+
def setUpModule():
6+
assert 0
7+
8+
9+
@unittest.skip("skip all tests")
10+
class Base(unittest.TestCase):
11+
def test(self):
12+
assert 0

testing/test_unittest.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,3 +1026,18 @@ def test_error_message_with_parametrized_fixtures(testdir):
10261026
"*Function type: TestCaseFunction",
10271027
]
10281028
)
1029+
1030+
1031+
@pytest.mark.parametrize(
1032+
"test_name, expected_outcome",
1033+
[
1034+
("test_setup_skip.py", "1 skipped"),
1035+
("test_setup_skip_class.py", "1 skipped"),
1036+
("test_setup_skip_module.py", "1 error"),
1037+
],
1038+
)
1039+
def test_setup_inheritance_skipping(testdir, test_name, expected_outcome):
1040+
"""Issue #4700"""
1041+
testdir.copy_example("unittest/{}".format(test_name))
1042+
result = testdir.runpytest()
1043+
result.stdout.fnmatch_lines("* {} in *".format(expected_outcome))

0 commit comments

Comments
 (0)