Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b5c66f8

Browse files
committed
Fix breakage in TestSuite.countTestCases() introduced by issue #11798.
1 parent 156b361 commit b5c66f8

3 files changed

Lines changed: 45 additions & 4 deletions

File tree

Lib/unittest/suite.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class BaseTestSuite(object):
2020

2121
def __init__(self, tests=()):
2222
self._tests = []
23+
self._removed_tests = 0
2324
self.addTests(tests)
2425

2526
def __repr__(self):
@@ -37,9 +38,10 @@ def __iter__(self):
3738
return iter(self._tests)
3839

3940
def countTestCases(self):
40-
cases = 0
41+
cases = self._removed_tests
4142
for test in self:
42-
cases += test.countTestCases()
43+
if test:
44+
cases += test.countTestCases()
4345
return cases
4446

4547
def addTest(self, test):
@@ -70,10 +72,16 @@ def run(self, result):
7072
def _removeTestAtIndex(self, index):
7173
"""Stop holding a reference to the TestCase at index."""
7274
try:
73-
self._tests[index] = None
75+
test = self._tests[index]
7476
except TypeError:
75-
# support for suite implementations that have overriden self._test
77+
# support for suite implementations that have overriden self._tests
7678
pass
79+
else:
80+
# Some unittest tests add non TestCase/TestSuite objects to
81+
# the suite.
82+
if hasattr(test, 'countTestCases'):
83+
self._removed_tests += test.countTestCases()
84+
self._tests[index] = None
7785

7886
def __call__(self, *args, **kwds):
7987
return self.run(*args, **kwds)

Lib/unittest/test/test_suite.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ def test_init__tests_optional(self):
5151
suite = unittest.TestSuite()
5252

5353
self.assertEqual(suite.countTestCases(), 0)
54+
# countTestCases() still works after tests are run
55+
suite.run(unittest.TestResult())
56+
self.assertEqual(suite.countTestCases(), 0)
5457

5558
# "class TestSuite([tests])"
5659
# ...
@@ -63,6 +66,9 @@ def test_init__empty_tests(self):
6366
suite = unittest.TestSuite([])
6467

6568
self.assertEqual(suite.countTestCases(), 0)
69+
# countTestCases() still works after tests are run
70+
suite.run(unittest.TestResult())
71+
self.assertEqual(suite.countTestCases(), 0)
6672

6773
# "class TestSuite([tests])"
6874
# ...
@@ -84,6 +90,14 @@ def tests():
8490
suite_3 = unittest.TestSuite(set(suite_1))
8591
self.assertEqual(suite_3.countTestCases(), 2)
8692

93+
# countTestCases() still works after tests are run
94+
suite_1.run(unittest.TestResult())
95+
self.assertEqual(suite_1.countTestCases(), 2)
96+
suite_2.run(unittest.TestResult())
97+
self.assertEqual(suite_2.countTestCases(), 2)
98+
suite_3.run(unittest.TestResult())
99+
self.assertEqual(suite_3.countTestCases(), 2)
100+
87101
# "class TestSuite([tests])"
88102
# ...
89103
# "If tests is given, it must be an iterable of individual test cases
@@ -99,6 +113,9 @@ def tests():
99113

100114
suite = unittest.TestSuite(tests())
101115
self.assertEqual(suite.countTestCases(), 2)
116+
# countTestCases() still works after tests are run
117+
suite.run(unittest.TestResult())
118+
self.assertEqual(suite.countTestCases(), 2)
102119

103120
################################################################
104121
### /Tests for TestSuite.__init__
@@ -145,6 +162,9 @@ def test_countTestCases_simple(self):
145162
suite = unittest.TestSuite((test1, test2))
146163

147164
self.assertEqual(suite.countTestCases(), 2)
165+
# countTestCases() still works after tests are run
166+
suite.run(unittest.TestResult())
167+
self.assertEqual(suite.countTestCases(), 2)
148168

149169
# "Return the number of tests represented by the this test object.
150170
# ...this method is also implemented by the TestSuite class, which can
@@ -162,6 +182,10 @@ def test2(self): pass
162182
parent = unittest.TestSuite((test3, child, Test1('test1')))
163183

164184
self.assertEqual(parent.countTestCases(), 4)
185+
# countTestCases() still works after tests are run
186+
parent.run(unittest.TestResult())
187+
self.assertEqual(parent.countTestCases(), 4)
188+
self.assertEqual(child.countTestCases(), 2)
165189

166190
# "Run the tests associated with this suite, collecting the result into
167191
# the test result object passed as result."
@@ -220,6 +244,9 @@ def test(self): pass
220244

221245
self.assertEqual(suite.countTestCases(), 1)
222246
self.assertEqual(list(suite), [test])
247+
# countTestCases() still works after tests are run
248+
suite.run(unittest.TestResult())
249+
self.assertEqual(suite.countTestCases(), 1)
223250

224251
# "Add a ... TestSuite to the suite"
225252
def test_addTest__TestSuite(self):
@@ -233,6 +260,9 @@ def test(self): pass
233260

234261
self.assertEqual(suite.countTestCases(), 1)
235262
self.assertEqual(list(suite), [suite_2])
263+
# countTestCases() still works after tests are run
264+
suite.run(unittest.TestResult())
265+
self.assertEqual(suite.countTestCases(), 1)
236266

237267
# "Add all the tests from an iterable of TestCase and TestSuite
238268
# instances to this test suite."
@@ -392,6 +422,7 @@ def tearDownModule():
392422
self.assertEqual(len(result.errors), 1)
393423
self.assertEqual(len(result.failures), 0)
394424
self.assertEqual(result.testsRun, 2)
425+
self.assertEqual(suite.countTestCases(), 2)
395426

396427

397428
def test_overriding_call(self):

Misc/NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ Core and Builtins
4444
Library
4545
-------
4646

47+
- Fix breakage in TestSuite.countTestCases() introduced by issue #11798.
48+
4749
- Issue #19918: Fix PurePath.relative_to() under Windows.
4850

4951
- Issue #19422: Explicitly disallow non-SOCK_STREAM sockets in the ssl

0 commit comments

Comments
 (0)