compare_batch3.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. # -*- coding: utf-8 -*-
  2. """第 3 批接口逐字段对比(页面装修 + 新增的 CRUD 读侧)。
  3. 用法:python compare_batch3.py
  4. """
  5. import json
  6. import requests
  7. from pathlib import Path
  8. GOLDEN = Path(r"C:\Users\Administrator\WorkBuddy\2026-10-17-12-27-10\java-rewrite\golden")
  9. BASE = "http://127.0.0.1:18080"
  10. TOKEN = "testsession123"
  11. SESSION = requests.Session()
  12. SESSION.trust_env = False
  13. def diff(a, b, path="$", out=None, limit=20):
  14. out = out if out is not None else []
  15. if len(out) >= limit:
  16. return out
  17. if type(a) != type(b):
  18. if isinstance(a, (int, float)) and isinstance(b, (int, float)) \
  19. and not isinstance(a, bool) and not isinstance(b, bool):
  20. if float(a) != float(b):
  21. out.append(f"{path}: php={a!r} java={b!r}")
  22. return out
  23. out.append(f"{path}: 类型不同 php={type(a).__name__} java={type(b).__name__} (php={a!r} java={b!r})")
  24. return out
  25. if isinstance(a, dict):
  26. for k in a:
  27. if k not in b:
  28. out.append(f"{path}.{k}: Java 缺失 (php={a[k]!r})")
  29. else:
  30. diff(a[k], b[k], f"{path}.{k}", out, limit)
  31. for k in b:
  32. if k not in a:
  33. out.append(f"{path}.{k}: Java 多出 (java={b[k]!r})")
  34. return out
  35. if isinstance(a, list):
  36. if len(a) != len(b):
  37. out.append(f"{path}: 长度不同 php={len(a)} java={len(b)}")
  38. for i in range(min(len(a), len(b))):
  39. diff(a[i], b[i], f"{path}[{i}]", out, limit)
  40. return out
  41. if a != b:
  42. out.append(f"{path}: php={a!r} java={b!r}")
  43. return out
  44. CASES = [
  45. ("page_default_data", "/store/page/defaultData", None),
  46. ("page_detail", "/store/page/detail", {"pageId": 10001}),
  47. ]
  48. def main():
  49. passed = 0
  50. for name, path, params in CASES:
  51. gold_file = GOLDEN / f"{name}.json"
  52. if not gold_file.exists():
  53. print(f"[skip] {name}: 无黄金样本")
  54. continue
  55. php = json.loads(gold_file.read_text(encoding="utf-8"))
  56. r = SESSION.get(BASE + path, headers={"Access-Token": TOKEN}, params=params or {}, timeout=60)
  57. try:
  58. java = r.json()
  59. except Exception:
  60. print(f"[FAIL] {name}: 非 JSON 响应 HTTP {r.status_code} {r.text[:200]}")
  61. continue
  62. if java.get("status") != php.get("status"):
  63. print(f"[FAIL] {name}: status php={php.get('status')} java={java.get('status')} msg={java.get('message')}")
  64. continue
  65. diffs = diff(php.get("data"), java.get("data"))
  66. if diffs:
  67. print(f"[DIFF] {name} ({len(diffs)} 处)")
  68. for d in diffs:
  69. print(" " + d)
  70. else:
  71. print(f"[PASS] {name}")
  72. passed += 1
  73. print(f"\n通过 {passed}/{len(CASES)}")
  74. if __name__ == "__main__":
  75. main()