@@ -43,24 +43,29 @@ def __exit__(self, exc_type, exc_value, tb):
4343
4444
4545class SubtestContext :
46+ def __init__ (self , msg = None , params = None ):
47+ self .msg = msg
48+ self .params = params
49+ 4650 def __enter__ (self ):
4751 pass
4852
4953 def __exit__ (self , * exc_info ):
5054 if exc_info [0 ] is not None :
5155 # Exception raised
5256 global __test_result__ , __current_test__
53- handle_test_exception (
54- __current_test__ ,
55- __test_result__ ,
56- exc_info
57- )
57+ test_details = __current_test__
58+ if self .msg :
59+ test_details += (f" [{ self .msg } ]" ,)
60+ if self .params :
61+ detail = ", " .join (f"{ k } ={ v } " for k , v in self .params .items ())
62+ test_details += (f" ({ detail } )" ,)
63+ 64+ handle_test_exception (test_details , __test_result__ , exc_info , False )
5865 # Suppress the exception as we've captured it above
5966 return True
6067
6168
62- 63- 6469class NullContext :
6570 def __enter__ (self ):
6671 pass
@@ -287,6 +292,7 @@ def __init__(self):
287292 self .testsRun = 0
288293 self .errors = []
289294 self .failures = []
295+ self .newFailures = 0
290296
291297 def wasSuccessful (self ):
292298 return self .errorsNum == 0 and self .failuresNum == 0
@@ -299,8 +305,9 @@ def printErrors(self):
299305 def printErrorList (self , lst ):
300306 sep = "----------------------------------------------------------------------"
301307 for c , e in lst :
308+ detail = " " .join ((str (i ) for i in c ))
302309 print ("======================================================================" )
303- print (c )
310+ print (f"FAIL: { detail } " )
304311 print (sep )
305312 print (e )
306313
@@ -331,18 +338,23 @@ def capture_exc(exc, traceback):
331338 return buf .getvalue ()
332339
333340
334- def handle_test_exception (current_test : tuple , test_result : TestResult , exc_info : tuple ):
341+ def handle_test_exception (
342+ current_test : tuple , test_result : TestResult , exc_info : tuple , verbose = True
343+ ):
335344 exc = exc_info [1 ]
336- traceback = exc_info [2 ]
345+ traceback = exc_info [2 ]
337346 ex_str = capture_exc (exc , traceback )
338347 if isinstance (exc , AssertionError ):
339348 test_result .failuresNum += 1
340349 test_result .failures .append ((current_test , ex_str ))
341- print (" FAIL" )
350+ if verbose :
351+ print (" FAIL" )
342352 else :
343353 test_result .errorsNum += 1
344354 test_result .errors .append ((current_test , ex_str ))
345- print (" ERROR" )
355+ if verbose :
356+ print (" ERROR" )
357+ test_result .newFailures += 1
346358
347359
348360def run_suite (c , test_result , suite_name = "" ):
@@ -370,20 +382,22 @@ def run_one(test_function):
370382 test_container = f"({ suite_name } )"
371383 __current_test__ = (name , test_container )
372384 try :
385+ test_result .newFailures = 0
373386 test_result .testsRun += 1
374387 test_globals = dict (** globals ())
375388 test_globals ["test_function" ] = test_function
376389 exec ("test_function()" , test_globals , test_globals )
377390 # No exception occurred, test passed
378- print (" ok" )
391+ if test_result .newFailures :
392+ print (" FAIL" )
393+ else :
394+ print (" ok" )
379395 except SkipTest as e :
380396 print (" skipped:" , e .args [0 ])
381397 test_result .skippedNum += 1
382398 except Exception as ex :
383399 handle_test_exception (
384- current_test = (name , c ),
385- test_result = test_result ,
386- exc_info = sys .exc_info ()
400+ current_test = (name , c ), test_result = test_result , exc_info = sys .exc_info ()
387401 )
388402 # Uncomment to investigate failure in detail
389403 # raise
0 commit comments