compare_detail.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. # -*- coding: utf-8 -*-
  2. """商品详情双跑对比:PHP 线上响应 vs Java 本地响应,递归逐字段 diff"""
  3. import json
  4. import sys
  5. from _root import ROOT
  6. GOLDEN = str(ROOT / "golden/store_goods_detail.json")
  7. def load_java(path):
  8. with open(path, encoding="utf-8") as f:
  9. return json.load(f)
  10. def diff(a, b, path="", out=None):
  11. if out is None:
  12. out = []
  13. if type(a) != type(b):
  14. # int/bool 等类型差异单独标注
  15. out.append(f"{path}: 类型不同 PHP={type(a).__name__}({a!r}) JAVA={type(b).__name__}({b!r})")
  16. return out
  17. if isinstance(a, dict):
  18. for k in sorted(set(a) | set(b)):
  19. if k not in a:
  20. out.append(f"{path}.{k}: Java 多出 {b[k]!r}"[:200])
  21. elif k not in b:
  22. out.append(f"{path}.{k}: Java 缺失(PHP={str(a[k])[:80]!r})")
  23. else:
  24. diff(a[k], b[k], f"{path}.{k}", out)
  25. elif isinstance(a, list):
  26. if len(a) != len(b):
  27. out.append(f"{path}: 数组长度 PHP={len(a)} JAVA={len(b)}")
  28. for i in range(min(len(a), len(b))):
  29. diff(a[i], b[i], f"{path}[{i}]", out)
  30. else:
  31. if a != b:
  32. out.append(f"{path}: PHP={a!r} JAVA={b!r}")
  33. return out
  34. if __name__ == "__main__":
  35. php = json.load(open(GOLDEN, encoding="utf-8"))
  36. java = load_java(sys.argv[1])
  37. diffs = diff(php, java, "$")
  38. print(f"差异条数: {len(diffs)}")
  39. for d in diffs[:40]:
  40. print(" -", d)