55import sys
66import sysconfig
77import time
8+ import trace
89
910from test import support
1011from test .support import os_helper , MS_WINDOWS
1314from .findtests import findtests , split_test_packages , list_cases
1415from .logger import Logger
1516from .pgo import setup_pgo_tests
16- from .result import State
17+ from .result import State , TestResult
1718from .results import TestResults , EXITCODE_INTERRUPTED
1819from .runtests import RunTests , HuntRefleak
1920from .setup import setup_process , setup_test_dir
@@ -284,24 +285,26 @@ def display_result(self, runtests):
284285 self .results .display_result (runtests .tests ,
285286 self .quiet , self .print_slowest )
286287
287- def run_test (self , test_name : TestName , runtests : RunTests , tracer ):
288+ def run_test (
289+ self , test_name : TestName , runtests : RunTests , tracer : trace .Trace | None
290+ ) -> TestResult :
288291 if tracer is not None :
289292 # If we're tracing code coverage, then we don't exit with status
290293 # if on a false return value from main.
291294 cmd = ('result = run_single_test(test_name, runtests)' )
292295 namespace = dict (locals ())
293296 tracer .runctx (cmd , globals = globals (), locals = namespace )
294297 result = namespace ['result' ]
298+ result .covered_lines = list (tracer .counts )
295299 else :
296300 result = run_single_test (test_name , runtests )
297301
298302 self .results .accumulate_result (result , runtests )
299303
300304 return result
301305
302- def run_tests_sequentially (self , runtests ):
306+ def run_tests_sequentially (self , runtests ) -> None :
303307 if self .coverage :
304- import trace
305308 tracer = trace .Trace (trace = False , count = True )
306309 else :
307310 tracer = None
@@ -349,8 +352,6 @@ def run_tests_sequentially(self, runtests):
349352 if previous_test :
350353 print (previous_test )
351354
352- return tracer
353-
354355 def get_state (self ):
355356 state = self .results .get_state (self .fail_env_changed )
356357 if self .first_state :
@@ -361,18 +362,18 @@ def _run_tests_mp(self, runtests: RunTests, num_workers: int) -> None:
361362 from .run_workers import RunWorkers
362363 RunWorkers (num_workers , runtests , self .logger , self .results ).run ()
363364
364- def finalize_tests (self , tracer ) :
365+ def finalize_tests (self , coverage : trace . CoverageResults | None ) -> None :
365366 if self .next_single_filename :
366367 if self .next_single_test :
367368 with open (self .next_single_filename , 'w' ) as fp :
368369 fp .write (self .next_single_test + '\n ' )
369370 else :
370371 os .unlink (self .next_single_filename )
371372
372- if tracer is not None :
373- results = tracer . results ()
374- results . write_results ( show_missing = True , summary = True ,
375- coverdir = self . coverage_dir )
373+ if coverage is not None :
374+ coverage . write_results ( show_missing = True , summary = True ,
375+ coverdir = self . coverage_dir ,
376+ ignore_missing_files = True )
376377
377378 if self .want_run_leaks :
378379 os .system ("leaks %d" % os .getpid ())
@@ -412,6 +413,7 @@ def create_run_tests(self, tests: TestTuple):
412413 hunt_refleak = self .hunt_refleak ,
413414 test_dir = self .test_dir ,
414415 use_junit = (self .junit_filename is not None ),
416+ coverage = self .coverage ,
415417 memory_limit = self .memory_limit ,
416418 gc_threshold = self .gc_threshold ,
417419 use_resources = self .use_resources ,
@@ -458,10 +460,10 @@ def _run_tests(self, selected: TestTuple, tests: TestList | None) -> int:
458460 try :
459461 if self .num_workers :
460462 self ._run_tests_mp (runtests , self .num_workers )
461- tracer = None
462463 else :
463- tracer = self .run_tests_sequentially (runtests )
464+ self .run_tests_sequentially (runtests )
464465
466+ coverage = self .results .get_coverage_results ()
465467 self .display_result (runtests )
466468
467469 if self .want_rerun and self .results .need_rerun ():
@@ -471,7 +473,7 @@ def _run_tests(self, selected: TestTuple, tests: TestList | None) -> int:
471473 self .logger .stop_load_tracker ()
472474
473475 self .display_summary ()
474- self .finalize_tests (tracer )
476+ self .finalize_tests (coverage )
475477
476478 return self .results .get_exitcode (self .fail_env_changed ,
477479 self .fail_rerun )
0 commit comments