compare_batch3.py 2.8 KB

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