# -*- coding: utf-8 -*- """票 06:e2e-core / e2e-rules 结果与 t05 回归基线对比(判定 ⚠/❌ 无新增)。""" import io, json, sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') E = r'e:\code\crm-backend-matt\.scratch\opportunity-e2e' def load(p): return json.load(open(p, encoding='utf-8')) def rank(v): return {'✅': 0}.get(v, 1) # 非 ✅ 一律 1,只看「由好变坏」 def diff(kind, base_path, cur_path): b, c = load(base_path), load(cur_path) bmap = {(r['flow'], r['case']): r['verdict'] for r in b['results']} cmap = {(r['flow'], r['case']): r['verdict'] for r in c['results']} worse, better, new_bad, gone = [], [], [], [] for k, v in cmap.items(): bv = bmap.get(k) if bv is None: if v != '✅': new_bad.append((k, v)) elif rank(v) > rank(bv): worse.append((k, bv, v)) elif rank(v) < rank(bv): better.append((k, bv, v)) for k in bmap: if k not in cmap: gone.append(k) print(f'===== {kind} 对比(t05基线 → 本次)=====') print(f'基线 ⚠/❌ 数: {sum(1 for v in bmap.values() if v != "✅")};本次: {sum(1 for v in cmap.values() if v != "✅")}') print(f'-- 变差 {len(worse)}(回归!)--') for k, bv, v in worse: print(f' [{bv}→{v}] {k[0]} {k[1]}') print(f'-- 新增非✅ {len(new_bad)}(新用例非绿,需甄别)--') for k, v in new_bad: print(f' [新:{v}] {k[0]} {k[1]}') print(f'-- 转好 {len(better)}(缺陷修复确认)--') for k, bv, v in better: print(f' [{bv}→{v}] {k[0]} {k[1]}') print(f'-- 基线独有(未跑) {len(gone)} --') for k in gone: print(f' {k[0]} {k[1]}') print() diff('e2e-core', E + r'\e2e-core-result-t05-regression.json', E + r'\e2e-core-result.json') import os rules_base = E + r'\e2e-rules-result-t05-regression.json' rules_cur = E + r'\e2e-rules-result.json' if os.path.exists(rules_base) and os.path.exists(rules_cur): diff('e2e-rules', rules_base, rules_cur) else: print('e2e-rules 结果待跑')