Files

32 lines
1.7 KiB
Python
Raw Permalink Normal View History

"""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())