# -*- coding: utf-8 -*- """第 3 批接口逐字段对比(页面装修 + 新增的 CRUD 读侧)。 用法:python compare_batch3.py """ import json import requests from pathlib import Path from _root import ROOT GOLDEN = Path(str(ROOT / "golden")) BASE = "http://127.0.0.1:18080" TOKEN = "testsession123" SESSION = requests.Session() SESSION.trust_env = False def diff(a, b, path="$", out=None, limit=20): out = out if out is not None else [] if len(out) >= limit: return out if type(a) != type(b): if isinstance(a, (int, float)) and isinstance(b, (int, float)) \ and not isinstance(a, bool) and not isinstance(b, bool): if float(a) != float(b): out.append(f"{path}: php={a!r} java={b!r}") return out out.append(f"{path}: 类型不同 php={type(a).__name__} java={type(b).__name__} (php={a!r} java={b!r})") return out if isinstance(a, dict): for k in a: if k not in b: out.append(f"{path}.{k}: Java 缺失 (php={a[k]!r})") else: diff(a[k], b[k], f"{path}.{k}", out, limit) for k in b: if k not in a: out.append(f"{path}.{k}: Java 多出 (java={b[k]!r})") return out if isinstance(a, list): if len(a) != len(b): out.append(f"{path}: 长度不同 php={len(a)} java={len(b)}") for i in range(min(len(a), len(b))): diff(a[i], b[i], f"{path}[{i}]", out, limit) return out if a != b: out.append(f"{path}: php={a!r} java={b!r}") return out CASES = [ ("page_default_data", "/store/page/defaultData", None), ("page_detail", "/store/page/detail", {"pageId": 10001}), ] def main(): passed = 0 for name, path, params in CASES: gold_file = GOLDEN / f"{name}.json" if not gold_file.exists(): print(f"[skip] {name}: 无黄金样本") continue php = json.loads(gold_file.read_text(encoding="utf-8")) r = SESSION.get(BASE + path, headers={"Access-Token": TOKEN}, params=params or {}, timeout=60) try: java = r.json() except Exception: print(f"[FAIL] {name}: 非 JSON 响应 HTTP {r.status_code} {r.text[:200]}") continue if java.get("status") != php.get("status"): print(f"[FAIL] {name}: status php={php.get('status')} java={java.get('status')} msg={java.get('message')}") continue diffs = diff(php.get("data"), java.get("data")) if diffs: print(f"[DIFF] {name} ({len(diffs)} 处)") for d in diffs: print(" " + d) else: print(f"[PASS] {name}") passed += 1 print(f"\n通过 {passed}/{len(CASES)}") if __name__ == "__main__": main()