mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	 3932b0f7b1
			
		
	
	
		3932b0f7b1
		
			
		
	
	
	
	
		
			
			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=`.
		
			
				
	
	
		
			48 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """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()
 |