32 lines
1.7 KiB
Python
32 lines
1.7 KiB
Python
|
|
"""Resumable isolated regression with explicit groups and truthful partial status."""
|
||
|
|
import argparse,datetime,json,subprocess,sys,time
|
||
|
|
from pathlib import Path
|
||
|
|
ROOT=Path(__file__).resolve().parents[1]
|
||
|
|
def main():
|
||
|
|
ap=argparse.ArgumentParser()
|
||
|
|
ap.add_argument('--start',type=int,default=1)
|
||
|
|
ap.add_argument('--end',type=int,default=999)
|
||
|
|
ap.add_argument('--timeout',type=int,default=40)
|
||
|
|
ap.add_argument('--group-size',type=int,default=2)
|
||
|
|
a=ap.parse_args()
|
||
|
|
fs=sorted((ROOT/'tests').glob('test_*.py'))
|
||
|
|
groups=[fs[i:i+a.group_size] for i in range(0,len(fs),a.group_size)]
|
||
|
|
directory=ROOT/'reports/v830-regression';directory.mkdir(parents=True,exist_ok=True)
|
||
|
|
for i,g in enumerate(groups,1):
|
||
|
|
if i<a.start or i>a.end:continue
|
||
|
|
start=time.monotonic();command=[sys.executable,'-m','pytest','-q',*[str(f.relative_to(ROOT)) for f in g]]
|
||
|
|
try:
|
||
|
|
r=subprocess.run(command,cwd=ROOT,capture_output=True,text=True,timeout=a.timeout)
|
||
|
|
output=r.stdout+'\n'+r.stderr
|
||
|
|
status='passed' if r.returncode==0 else 'failed'
|
||
|
|
except subprocess.TimeoutExpired as exc:
|
||
|
|
output=(exc.stdout.decode(errors='replace') if isinstance(exc.stdout,bytes) else (exc.stdout or ''))+'\nTIMEOUT'
|
||
|
|
status='timeout'
|
||
|
|
log=directory/f'batch-{i:02}.log';log.write_text(output,encoding='utf-8')
|
||
|
|
record={'batch':i,'modules':[f.name for f in g],'status':status,'elapsed':round(time.monotonic()-start,2),'summary':output[-500:]}
|
||
|
|
(directory/f'batch-{i:02}.json').write_text(json.dumps(record,ensure_ascii=False,indent=2),encoding='utf-8')
|
||
|
|
print(i,len(groups),status,record['elapsed'],','.join(record['modules']),flush=True)
|
||
|
|
if status!='passed':return 1
|
||
|
|
return 0
|
||
|
|
if __name__=='__main__':raise SystemExit(main())
|