(self, selected: TestTuple, tests: TestList | None)
| 522 | ) |
| 523 | |
| 524 | def _run_tests(self, selected: TestTuple, tests: TestList | None) -> int: |
| 525 | if self.hunt_refleak and self.hunt_refleak.warmups < 3: |
| 526 | msg = ("WARNING: Running tests with --huntrleaks/-R and " |
| 527 | "less than 3 warmup repetitions can give false positives!") |
| 528 | print(msg, file=sys.stdout, flush=True) |
| 529 | |
| 530 | if self.num_workers < 0: |
| 531 | # Use all CPUs + 2 extra worker processes for tests |
| 532 | # that like to sleep |
| 533 | # |
| 534 | # os.process.cpu_count() is new in Python 3.13; |
| 535 | # mypy doesn't know about it yet |
| 536 | self.num_workers = (os.process_cpu_count() or 1) + 2 # type: ignore[attr-defined] |
| 537 | |
| 538 | # For a partial run, we do not need to clutter the output. |
| 539 | if (self.want_header |
| 540 | or not(self.pgo or self.quiet or self.single_test_run |
| 541 | or tests or self.cmdline_args)): |
| 542 | display_header(self.use_resources, self.python_cmd) |
| 543 | |
| 544 | print("Using random seed:", self.random_seed) |
| 545 | |
| 546 | runtests = self.create_run_tests(selected) |
| 547 | self.first_runtests = runtests |
| 548 | self.logger.set_tests(runtests) |
| 549 | |
| 550 | if (runtests.hunt_refleak is not None) and (not self.num_workers): |
| 551 | # gh-109739: WindowsLoadTracker thread interferes with refleak check |
| 552 | use_load_tracker = False |
| 553 | else: |
| 554 | # WindowsLoadTracker is only needed on Windows |
| 555 | use_load_tracker = MS_WINDOWS |
| 556 | |
| 557 | if use_load_tracker: |
| 558 | self.logger.start_load_tracker() |
| 559 | try: |
| 560 | if self.num_workers: |
| 561 | self._run_tests_mp(runtests, self.num_workers) |
| 562 | else: |
| 563 | self.run_tests_sequentially(runtests) |
| 564 | |
| 565 | coverage = self.results.get_coverage_results() |
| 566 | self.display_result(runtests) |
| 567 | |
| 568 | if self.want_rerun and self.results.need_rerun(): |
| 569 | self.rerun_failed_tests(runtests) |
| 570 | |
| 571 | if self.want_bisect and self.results.need_rerun(): |
| 572 | self.run_bisect(runtests) |
| 573 | finally: |
| 574 | if use_load_tracker: |
| 575 | self.logger.stop_load_tracker() |
| 576 | |
| 577 | self.display_summary() |
| 578 | self.finalize_tests(coverage) |
| 579 | |
| 580 | return self.results.get_exitcode(self.fail_env_changed, |
| 581 | self.fail_rerun) |
no test coverage detected