mirror of
https://github.com/python/cpython.git
synced 2025-07-24 11:44:31 +00:00
gh-110722: Make -m test -T -j
use sys.monitoring (GH-111710)
Now all results from worker processes are aggregated and displayed together as a summary at the end of a regrtest run. The traditional trace is left in place for use with sequential in-process test runs but now raises a warning that those numbers are not precise. `-T -j` requires `--with-pydebug` as it relies on `-Xpresite=`.
This commit is contained in:
parent
0b06d2482d
commit
3932b0f7b1
13 changed files with 166 additions and 34 deletions
48
Lib/test/cov.py
Normal file
48
Lib/test/cov.py
Normal file
|
@ -0,0 +1,48 @@
|
|||
"""A minimal hook for gathering line coverage of the standard library.
|
||||
|
||||
Designed to be used with -Xpresite= which means:
|
||||
* it installs itself on import
|
||||
* it's not imported as `__main__` so can't use the ifmain idiom
|
||||
* it can't import anything besides `sys` to avoid tainting gathered coverage
|
||||
* filenames are not normalized
|
||||
|
||||
To get gathered coverage back, look for 'test.cov' in `sys.modules`
|
||||
instead of importing directly. That way you can determine if the module
|
||||
was already in use.
|
||||
|
||||
If you need to disable the hook, call the `disable()` function.
|
||||
"""
|
||||
|
||||
import sys
|
||||
|
||||
mon = sys.monitoring
|
||||
|
||||
FileName = str
|
||||
LineNo = int
|
||||
Location = tuple[FileName, LineNo]
|
||||
|
||||
coverage: set[Location] = set()
|
||||
|
||||
|
||||
# `types` and `typing` aren't imported to avoid invalid coverage
|
||||
def add_line(
|
||||
code: "types.CodeType",
|
||||
lineno: int,
|
||||
) -> "typing.Literal[sys.monitoring.DISABLE]":
|
||||
coverage.add((code.co_filename, lineno))
|
||||
return mon.DISABLE
|
||||
|
||||
|
||||
def enable():
|
||||
mon.use_tool_id(mon.COVERAGE_ID, "regrtest coverage")
|
||||
mon.register_callback(mon.COVERAGE_ID, mon.events.LINE, add_line)
|
||||
mon.set_events(mon.COVERAGE_ID, mon.events.LINE)
|
||||
|
||||
|
||||
def disable():
|
||||
mon.set_events(mon.COVERAGE_ID, 0)
|
||||
mon.register_callback(mon.COVERAGE_ID, mon.events.LINE, None)
|
||||
mon.free_tool_id(mon.COVERAGE_ID)
|
||||
|
||||
|
||||
enable()
|
Loading…
Add table
Add a link
Reference in a new issue