@@ -47,12 +47,10 @@ def __init__(self, result=None):
4747 self .result = result
4848 self .result_supports_subtests = hasattr (result , "addSubTest" )
4949 self .success = True
50- self .skipped = []
5150 self .expectedFailure = None
52- self .errors = []
5351
5452 @contextlib .contextmanager
55- def testPartExecutor (self , test_case , isTest = False ):
53+ def testPartExecutor (self , test_case , subTest = False ):
5654 old_success = self .success
5755 self .success = True
5856 try :
@@ -61,7 +59,7 @@ def testPartExecutor(self, test_case, isTest=False):
6159 raise
6260 except SkipTest as e :
6361 self .success = False
64- self .skipped . append (( test_case , str (e ) ))
62+ _addSkip ( self .result , test_case , str (e ))
6563 except _ShouldStop :
6664 pass
6765 except :
@@ -70,17 +68,36 @@ def testPartExecutor(self, test_case, isTest=False):
7068 self .expectedFailure = exc_info
7169 else :
7270 self .success = False
73- self .errors .append ((test_case , exc_info ))
71+ if subTest :
72+ self .result .addSubTest (test_case .test_case , test_case , exc_info )
73+ else :
74+ _addError (self .result , test_case , exc_info )
7475 # explicitly break a reference cycle:
7576 # exc_info -> frame -> exc_info
7677 exc_info = None
7778 else :
78- if self . result_supports_subtests and self .success :
79- self .errors . append (( test_case , None ) )
79+ if subTest and self .success :
80+ self .result . addSubTest ( test_case . test_case , test_case , None )
8081 finally :
8182 self .success = self .success and old_success
8283
8384
85+ def _addSkip (result , test_case , reason ):
86+ addSkip = getattr (result , 'addSkip' , None )
87+ if addSkip is not None :
88+ addSkip (test_case , reason )
89+ else :
90+ warnings .warn ("TestResult has no addSkip method, skips not reported" ,
91+ RuntimeWarning , 2 )
92+ result .addSuccess (test_case )
93+
94+ def _addError (result , test , exc_info ):
95+ if result is not None and exc_info is not None :
96+ if issubclass (exc_info [0 ], test .failureException ):
97+ result .addFailure (test , exc_info )
98+ else :
99+ result .addError (test , exc_info )
100+
84101def _id (obj ):
85102 return obj
86103
@@ -467,15 +484,6 @@ def __repr__(self):
467484 return "<%s testMethod=%s>" % \
468485 (strclass (self .__class__ ), self ._testMethodName )
469486
470- def _addSkip (self , result , test_case , reason ):
471- addSkip = getattr (result , 'addSkip' , None )
472- if addSkip is not None :
473- addSkip (test_case , reason )
474- else :
475- warnings .warn ("TestResult has no addSkip method, skips not reported" ,
476- RuntimeWarning , 2 )
477- result .addSuccess (test_case )
478-
479487 @contextlib .contextmanager
480488 def subTest (self , msg = _subtest_msg_sentinel , ** params ):
481489 """Return a context manager that will return the enclosed block
@@ -494,7 +502,7 @@ def subTest(self, msg=_subtest_msg_sentinel, **params):
494502 params_map = parent .params .new_child (params )
495503 self ._subtest = _SubTest (self , msg , params_map )
496504 try :
497- with self ._outcome .testPartExecutor (self ._subtest , isTest = True ):
505+ with self ._outcome .testPartExecutor (self ._subtest , subTest = True ):
498506 yield
499507 if not self ._outcome .success :
500508 result = self ._outcome .result
@@ -507,16 +515,6 @@ def subTest(self, msg=_subtest_msg_sentinel, **params):
507515 finally :
508516 self ._subtest = parent
509517
510- def _feedErrorsToResult (self , result , errors ):
511- for test , exc_info in errors :
512- if isinstance (test , _SubTest ):
513- result .addSubTest (test .test_case , test , exc_info )
514- elif exc_info is not None :
515- if issubclass (exc_info [0 ], self .failureException ):
516- result .addFailure (test , exc_info )
517- else :
518- result .addError (test , exc_info )
519-
520518 def _addExpectedFailure (self , result , exc_info ):
521519 try :
522520 addExpectedFailure = result .addExpectedFailure
@@ -574,7 +572,7 @@ def run(self, result=None):
574572 # If the class or method was skipped.
575573 skip_why = (getattr (self .__class__ , '__unittest_skip_why__' , '' )
576574 or getattr (testMethod , '__unittest_skip_why__' , '' ))
577- self . _addSkip (result , self , skip_why )
575+ _addSkip (result , self , skip_why )
578576 return result
579577
580578 expecting_failure = (
@@ -589,16 +587,13 @@ def run(self, result=None):
589587 self ._callSetUp ()
590588 if outcome .success :
591589 outcome .expecting_failure = expecting_failure
592- with outcome .testPartExecutor (self , isTest = True ):
590+ with outcome .testPartExecutor (self ):
593591 self ._callTestMethod (testMethod )
594592 outcome .expecting_failure = False
595593 with outcome .testPartExecutor (self ):
596594 self ._callTearDown ()
597-
598595 self .doCleanups ()
599- for test , reason in outcome .skipped :
600- self ._addSkip (result , test , reason )
601- self ._feedErrorsToResult (result , outcome .errors )
596+
602597 if outcome .success :
603598 if expecting_failure :
604599 if outcome .expectedFailure :
@@ -609,11 +604,10 @@ def run(self, result=None):
609604 result .addSuccess (self )
610605 return result
611606 finally :
612- # explicitly break reference cycles:
613- # outcome.errors -> frame -> outcome -> outcome.errors
607+ # explicitly break reference cycle:
614608 # outcome.expectedFailure -> frame -> outcome -> outcome.expectedFailure
615- outcome .errors .clear ()
616609 outcome .expectedFailure = None
610+ outcome = None
617611
618612 # clear the outcome, no more needed
619613 self ._outcome = None
0 commit comments