77import tempfile
88import textwrap
99from test .libregrtest .runtest import (
10- findtests , runtest_ns ,
10+ findtests , runtest ,
1111 STDTESTS , NOTTESTS , PASSED , FAILED , ENV_CHANGED , SKIPPED , RESOURCE_DENIED )
1212from test .libregrtest .cmdline import _parse_args
1313from test .libregrtest .setup import setup_tests
@@ -208,6 +208,30 @@ def find_tests(self, tests):
208208 print ("Using random seed" , self .ns .random_seed )
209209 random .shuffle (self .selected )
210210
211+ def rerun_failed_tests (self ):
212+ self .ns .verbose = True
213+ self .ns .failfast = False
214+ self .ns .verbose3 = False
215+ self .ns .match_tests = None
216+
217+ print ("Re-running failed tests in verbose mode" )
218+ for test in self .bad [:]:
219+ print ("Re-running test %r in verbose mode" % test , flush = True )
220+ try :
221+ self .ns .verbose = True
222+ ok = runtest (self .ns , test )
223+ except KeyboardInterrupt :
224+ # print a newline separate from the ^C
225+ print ()
226+ break
227+ else :
228+ if ok [0 ] in {PASSED , ENV_CHANGED , SKIPPED , RESOURCE_DENIED }:
229+ self .bad .remove (test )
230+ else :
231+ if self .bad :
232+ print (count (len (self .bad ), 'test' ), "failed again:" )
233+ printlist (self .bad )
234+
211235 def display_result (self ):
212236 if self .interrupted :
213237 # print a newline after ^C
@@ -245,32 +269,6 @@ def display_result(self):
245269 print (count (len (self .skipped ), "test" ), "skipped:" )
246270 printlist (self .skipped )
247271
248- if self .ns .verbose2 and self .bad :
249- print ("Re-running failed tests in verbose mode" )
250- for test in self .bad [:]:
251- print ("Re-running test %r in verbose mode" % test , flush = True )
252- try :
253- self .ns .verbose = True
254- ok = runtest_ns (test , True , self .ns )
255- except KeyboardInterrupt :
256- # print a newline separate from the ^C
257- print ()
258- break
259- else :
260- if ok [0 ] in {PASSED , ENV_CHANGED , SKIPPED , RESOURCE_DENIED }:
261- self .bad .remove (test )
262- else :
263- if self .bad :
264- print (count (len (self .bad ), 'test' ), "failed again:" )
265- printlist (self .bad )
266-
267- def run_test (self , test ):
268- result = runtest_ns (test , self .ns .verbose , self .ns ,
269- output_on_failure = self .ns .verbose3 ,
270- failfast = self .ns .failfast ,
271- match_tests = self .ns .match_tests )
272- self .accumulate_result (test , result )
273-
274272 def run_tests_sequential (self ):
275273 if self .ns .trace :
276274 import trace
@@ -286,11 +284,13 @@ def run_tests_sequential(self):
286284 if self .tracer :
287285 # If we're tracing code coverage, then we don't exit with status
288286 # if on a false return value from main.
289- cmd = 'self.run_test(test)'
287+ cmd = ('result = runtest(self.ns, test); '
288+ 'self.accumulate_result(test, result)' )
290289 self .tracer .runctx (cmd , globals = globals (), locals = vars ())
291290 else :
292291 try :
293- self .run_test (test )
292+ result = runtest (self .ns , test )
293+ self .accumulate_result (test , result )
294294 except KeyboardInterrupt :
295295 self .interrupted = True
296296 break
@@ -366,6 +366,10 @@ def main(self, tests=None, **kwargs):
366366 self .run_tests ()
367367
368368 self .display_result ()
369+
370+ if self .ns .verbose2 and self .bad :
371+ self .rerun_failed_tests ()
372+
369373 self .finalize ()
370374 sys .exit (len (self .bad ) > 0 or self .interrupted )
371375
0 commit comments