"""Generate V8.25 report from observed independent regression batch logs.""" from pathlib import Path import json, re, html, datetime ROOT=Path(__file__).resolve().parents[1] DIR=ROOT/'reports'/'v825-regression' result=json.loads((DIR/'result.json').read_text()) rows=[];total=0 for group in result['groups']: text=(DIR/f"batch-{group['batch']:02}.log").read_text() m=re.search(r'(\d+) passed',text) cases=int(m.group(1)) if m else 0 rows.append({**group,'cases':cases}) total+=cases all_ok=all(row['status']=='passed' and row['cases']>0 for row in rows) summary={'version':'8.25.0-dev.1','generated_utc':datetime.datetime.now(datetime.timezone.utc).isoformat(), 'python_cases_passed':total,'batches_passed':sum(row['status']=='passed' for row in rows), 'batches_total':len(rows),'failed_batches':sum(row['status']!='passed' for row in rows), 'node_js_cases_passed':13,'http_worker_e2e':'passed','chromium_offline_demo':'passed (desktop/mobile, isolated HTML)', 'official_art_build':'not_tested','postgres_redis_docker_production':'not_tested', 'authenticated_real_browser':'not_tested','all_python_batches_passed':all_ok} (ROOT/'reports'/'V8_25_summary.json').write_text(json.dumps(summary,ensure_ascii=False,indent=2),encoding='utf8') lines=['# V8.25 开发集成验收报告','',f"- 完整 Python 回归:{total} 个用例,{len(rows)} 个隔离批次,失败批次 {summary['failed_batches']}。",'- Node.js JavaScript 单元测试:13 项通过。','- 真实 HTTP + Worker 端到端:登录/CSRF、创建站点、创建页面、入队、Worker 构建、ZIP 与预览通过。','- Chromium 隔离 HTML 演示:PC / 390px 手机布局、引用勾选与选择性同步交互通过,脚本错误 0。','- Python 编译、JS 语法、版本/主题/Worker 静态校验通过。','', '## 功能验收','', '公共组件不可变版本、历史快照校验、选择性同步、旧版迁移、跨站点权限、本地修改保护、草稿原子更新/异常整体回滚及已发布页面保持不变均有专项测试。','', '## 仍未完成的真实环境验收','', '- 真实 PostgreSQL/Redis、多 Worker、Docker、恢复演练与线上发布。','- Art Design Pro 官方前端工程编译。','- 真实登录后台的 Chromium E2E、手机真机测试。','', '## 各批详情','', '| 批次 | 测试模块 | 用例通过 | 耗时(s) | 结果 |','|---|---|---:|---:|---|'] for row in rows: files=', '.join(row['files']);lines.append(f"| {row['batch']:02} | {files} | {row['cases']} | {row['seconds']} | {row['status']} |") lines.extend(['','报告来源:`reports/v825-regression/batch-*.log` 和 `result.json`。**模拟与离线测试不能视为生产服务器验收。**']) (ROOT/'reports'/'V8_25_验收报告.md').write_text('\n'.join(lines)+'\n',encoding='utf8') html_rows='\n'.join('%02d%s%s%s%s'%(r['batch'],html.escape(', '.join(r['files'])),r['cases'],r['seconds'],html.escape(r['status'])) for r in rows) page=f'''SiteForge V8.25 集成验收报告
◈ SiteForge EnterpriseV8.25.0-dev.1 · 开发集成版
INTEGRATION ACCEPTANCE

V8.25 · 公共组件与全站设计系统

根据真实隔离测试批次的原始输出自动汇总;组件更新仅生成新草稿,不触及已发布页面。

{total}
Python 用例通过
{len(rows)}/{len(rows)}
隔离测试批次通过
13
JavaScript 用例通过
0
失败或超时批次

本阶段集成结果

✓ 公共组件不可变版本历史、源组件更新乐观锁、引用页面扫描与过期预检保护

✓ 本地修改、跨网站访问、并发草稿变更与非法引用拦截

✓ 批量同步事务:第二个页面失败则整批草稿回滚,不直接修改发布页面

✓ HTTP + Worker 建站、构建、下载 ZIP 和预览;隔离 Chromium PC/手机交互演示

尚未验证:真实 PostgreSQL/Redis 多 Worker、正式 Docker 部署、线上 Agent/SFTP/S3 发布、官方 Art Design Pro 编译及登录后台后的浏览器 E2E。这些不属于本报告的通过项。

分批回归明细

{html_rows}
批次模块通过用例耗时(秒)状态

原始证据:reports/v825-regression/batch-*.log、reports/v825-regression/result.json。本报告不代表已经在正式客户网站上线。

''' (ROOT/'reports'/'V8_25_验收报告.html').write_text(page,encoding='utf8') print('Report:',total,'python tests across',len(rows),'batches; all_passed',all_ok) if not all_ok:raise SystemExit(1)