Skip to content

Commit 7e246a3

Browse files
bpo-41620: TestCase.run() now always return a TestResult instance (pythonGH-28030)
Previously it returned None if the test class or method was decorated with a skipping decorator. Co-authored-by: Iman Tabrizian <[email protected]>
1 parent d6cb5dd commit 7e246a3

File tree

3 files changed

+34
-24
lines changed

3 files changed

+34
-24
lines changed

Lib/unittest/case.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,7 @@ def run(self, result=None):
575575
skip_why = (getattr(self.__class__, '__unittest_skip_why__', '')
576576
or getattr(testMethod, '__unittest_skip_why__', ''))
577577
self._addSkip(result, self, skip_why)
578-
return
578+
return result
579579

580580
expecting_failure = (
581581
getattr(self, "__unittest_expecting_failure__", False) or

Lib/unittest/test/test_skipping.py

+30-23
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,16 @@ def test_skip_me(self):
1414
events = []
1515
result = LoggingResult(events)
1616
test = Foo("test_skip_me")
17-
test.run(result)
17+
self.assertIs(test.run(result), result)
1818
self.assertEqual(events, ['startTest', 'addSkip', 'stopTest'])
1919
self.assertEqual(result.skipped, [(test, "skip")])
2020

2121
events = []
22-
test.run()
22+
result = test.run()
2323
self.assertEqual(events, ['startTestRun', 'startTest', 'addSkip',
2424
'stopTest', 'stopTestRun'])
25+
self.assertEqual(result.skipped, [(test, "skip")])
26+
self.assertEqual(result.testsRun, 1)
2527

2628
# Try letting setUp skip the test now.
2729
class Foo(unittest.TestCase):
@@ -33,15 +35,17 @@ def test_nothing(self): pass
3335
events = []
3436
result = LoggingResult(events)
3537
test = Foo("test_nothing")
36-
test.run(result)
38+
self.assertIs(test.run(result), result)
3739
self.assertEqual(events, ['startTest', 'addSkip', 'stopTest'])
3840
self.assertEqual(result.skipped, [(test, "testing")])
3941
self.assertEqual(result.testsRun, 1)
4042

4143
events = []
42-
test.run()
44+
result = test.run()
4345
self.assertEqual(events, ['startTestRun', 'startTest', 'addSkip',
4446
'stopTest', 'stopTestRun'])
47+
self.assertEqual(result.skipped, [(test, "testing")])
48+
self.assertEqual(result.testsRun, 1)
4549

4650
def test_skipping_subtests(self):
4751
class Foo(unittest.TestCase):
@@ -56,7 +60,7 @@ def test_skip_me(self):
5660
events = []
5761
result = LoggingResult(events)
5862
test = Foo("test_skip_me")
59-
test.run(result)
63+
self.assertIs(test.run(result), result)
6064
self.assertEqual(events, ['startTest', 'addSkip', 'addSkip',
6165
'addSkip', 'stopTest'])
6266
self.assertEqual(len(result.skipped), 3)
@@ -71,10 +75,12 @@ def test_skip_me(self):
7175
self.assertEqual(result.skipped[2], (test, "skip 3"))
7276

7377
events = []
74-
test.run()
78+
result = test.run()
7579
self.assertEqual(events,
7680
['startTestRun', 'startTest', 'addSkip', 'addSkip',
7781
'addSkip', 'stopTest', 'stopTestRun'])
82+
self.assertEqual([msg for subtest, msg in result.skipped],
83+
['skip 1', 'skip 2', 'skip 3'])
7884

7985
def test_skipping_decorators(self):
8086
op_table = ((unittest.skipUnless, False, True),
@@ -95,7 +101,7 @@ def test_dont_skip(self): pass
95101
suite = unittest.TestSuite([test_do_skip, test_dont_skip])
96102
events = []
97103
result = LoggingResult(events)
98-
suite.run(result)
104+
self.assertIs(suite.run(result), result)
99105
self.assertEqual(len(result.skipped), 1)
100106
expected = ['startTest', 'addSkip', 'stopTest',
101107
'startTest', 'addSuccess', 'stopTest']
@@ -105,16 +111,16 @@ def test_dont_skip(self): pass
105111
self.assertTrue(result.wasSuccessful())
106112

107113
events = []
108-
test_do_skip.run()
109-
self.assertEqual(len(result.skipped), 1)
114+
result = test_do_skip.run()
110115
self.assertEqual(events, ['startTestRun', 'startTest', 'addSkip',
111116
'stopTest', 'stopTestRun'])
117+
self.assertEqual(result.skipped, [(test_do_skip, "testing")])
112118

113119
events = []
114-
test_dont_skip.run()
115-
self.assertEqual(len(result.skipped), 1)
120+
result = test_dont_skip.run()
116121
self.assertEqual(events, ['startTestRun', 'startTest', 'addSuccess',
117122
'stopTest', 'stopTestRun'])
123+
self.assertEqual(result.skipped, [])
118124

119125
def test_skip_class(self):
120126
@unittest.skip("testing")
@@ -128,15 +134,16 @@ def test_1(self):
128134
result = LoggingResult(events)
129135
test = Foo("test_1")
130136
suite = unittest.TestSuite([test])
131-
suite.run(result)
137+
self.assertIs(suite.run(result), result)
132138
self.assertEqual(events, ['startTest', 'addSkip', 'stopTest'])
133139
self.assertEqual(result.skipped, [(test, "testing")])
134140
self.assertEqual(record, [])
135141

136142
events = []
137-
test.run()
143+
result = test.run()
138144
self.assertEqual(events, ['startTestRun', 'startTest', 'addSkip',
139145
'stopTest', 'stopTestRun'])
146+
self.assertEqual(result.skipped, [(test, "testing")])
140147
self.assertEqual(record, [])
141148

142149
def test_skip_non_unittest_class(self):
@@ -150,7 +157,7 @@ class Foo(Mixin, unittest.TestCase):
150157
result = unittest.TestResult()
151158
test = Foo("test_1")
152159
suite = unittest.TestSuite([test])
153-
suite.run(result)
160+
self.assertIs(suite.run(result), result)
154161
self.assertEqual(result.skipped, [(test, "testing")])
155162
self.assertEqual(record, [])
156163

@@ -162,7 +169,7 @@ def test_die(self):
162169
events = []
163170
result = LoggingResult(events)
164171
test = Foo("test_die")
165-
test.run(result)
172+
self.assertIs(test.run(result), result)
166173
self.assertEqual(events,
167174
['startTest', 'addExpectedFailure', 'stopTest'])
168175
self.assertEqual(result.expectedFailures[0][0], test)
@@ -177,7 +184,7 @@ def test_1(self):
177184
events = []
178185
result = LoggingResult(events)
179186
test = Foo("test_1")
180-
test.run(result)
187+
self.assertIs(test.run(result), result)
181188
self.assertEqual(events,
182189
['startTest', 'addExpectedFailure', 'stopTest'])
183190
self.assertEqual(result.expectedFailures[0][0], test)
@@ -195,7 +202,7 @@ class Bar(Foo):
195202
events = []
196203
result = LoggingResult(events)
197204
test = Bar("test_1")
198-
test.run(result)
205+
self.assertIs(test.run(result), result)
199206
self.assertEqual(events,
200207
['startTest', 'addExpectedFailure', 'stopTest'])
201208
self.assertEqual(result.expectedFailures[0][0], test)
@@ -218,7 +225,7 @@ def test_die(self):
218225
events = []
219226
result = LoggingResult(events)
220227
test = Foo("test_die")
221-
test.run(result)
228+
self.assertIs(test.run(result), result)
222229
self.assertEqual(events,
223230
['startTest', 'addSubTestSuccess',
224231
'addExpectedFailure', 'stopTest'])
@@ -234,7 +241,7 @@ def test_die(self):
234241
events = []
235242
result = LoggingResult(events)
236243
test = Foo("test_die")
237-
test.run(result)
244+
self.assertIs(test.run(result), result)
238245
self.assertEqual(events,
239246
['startTest', 'addUnexpectedSuccess', 'stopTest'])
240247
self.assertFalse(result.failures)
@@ -256,7 +263,7 @@ def test_die(self):
256263
events = []
257264
result = LoggingResult(events)
258265
test = Foo("test_die")
259-
test.run(result)
266+
self.assertIs(test.run(result), result)
260267
self.assertEqual(events,
261268
['startTest',
262269
'addSubTestSuccess', 'addSubTestSuccess',
@@ -280,7 +287,7 @@ def test_1(self):
280287
result = unittest.TestResult()
281288
test = Foo("test_1")
282289
suite = unittest.TestSuite([test])
283-
suite.run(result)
290+
self.assertIs(suite.run(result), result)
284291
self.assertEqual(result.skipped, [(test, "testing")])
285292
self.assertFalse(Foo.wasSetUp)
286293
self.assertFalse(Foo.wasTornDown)
@@ -300,7 +307,7 @@ def test_1(self):
300307
result = unittest.TestResult()
301308
test = Foo("test_1")
302309
suite = unittest.TestSuite([test])
303-
suite.run(result)
310+
self.assertIs(suite.run(result), result)
304311
self.assertEqual(result.skipped, [(test, "testing")])
305312

306313
def test_skip_without_reason(self):
@@ -312,7 +319,7 @@ def test_1(self):
312319
result = unittest.TestResult()
313320
test = Foo("test_1")
314321
suite = unittest.TestSuite([test])
315-
suite.run(result)
322+
self.assertIs(suite.run(result), result)
316323
self.assertEqual(result.skipped, [(test, "")])
317324

318325
if __name__ == "__main__":
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
:meth:`~unittest.TestCase.run` now always return a
2+
:class:`~unittest.TestResult` instance. Previously it returned ``None`` if
3+
the test class or method was decorated with a skipping decorator.

0 commit comments

Comments
 (0)