compare_goods.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. # -*- coding: utf-8 -*-
  2. """双跑对比:PHP 线上响应 vs Java 本地响应,逐字段 diff"""
  3. import json
  4. import re
  5. import sys
  6. from pathlib import Path
  7. import requests
  8. from _root import ROOT
  9. ROOT = Path(str(ROOT))
  10. src = Path(r"F:\import goods\upload_goods.py").read_text(encoding="utf-8")
  11. token = re.search(r'TOKEN\s*=\s*"([^"]+)"', src).group(1)
  12. params = {"page": 1, "listRows": 15}
  13. php = requests.post("https://shop.qinys.cn/index.php?s=/store/goods/list",
  14. headers={"Access-Token": token}, data=params, timeout=30).json()
  15. java = json.load(open(ROOT / "golden" / "java_goods_list.json", encoding="utf-8"))
  16. php_items = php["data"]["list"]["data"]
  17. java_items = java["data"]["list"]["data"]
  18. print(f"PHP 条数: {len(php_items)} Java 条数: {len(java_items)}")
  19. php_map = {g["goods_id"]: g for g in php_items}
  20. java_map = {g["goods_id"]: g for g in java_items}
  21. print(f"PHP goods_id: {sorted(php_map)}")
  22. print(f"Java goods_id: {sorted(java_map)}")
  23. def norm(v):
  24. if isinstance(v, str):
  25. return v
  26. if isinstance(v, bool):
  27. return v
  28. return v
  29. diff_count = 0
  30. for gid in sorted(set(php_map) & set(java_map)):
  31. p, j = php_map[gid], java_map[gid]
  32. pkeys, jkeys = set(p), set(j)
  33. for k in sorted(pkeys - jkeys):
  34. print(f"[缺字段] goods {gid} 缺少 {k}")
  35. diff_count += 1
  36. for k in sorted(jkeys - pkeys):
  37. print(f"[多字段] goods {gid} 多出 {k}")
  38. diff_count += 1
  39. for k in sorted(pkeys & jkeys):
  40. pv, jv = p[k], j[k]
  41. if type(pv).__name__ != type(jv).__name__:
  42. print(f"[类型] goods {gid}.{k}: PHP={type(pv).__name__}({pv!r}) Java={type(jv).__name__}({jv!r})")
  43. diff_count += 1
  44. elif isinstance(pv, list):
  45. if json.dumps(pv, ensure_ascii=False, sort_keys=True) != json.dumps(jv, ensure_ascii=False, sort_keys=True):
  46. print(f"[值] goods {gid}.{k}:\n PHP ={json.dumps(pv, ensure_ascii=False)[:200]}\n Java={json.dumps(jv, ensure_ascii=False)[:200]}")
  47. diff_count += 1
  48. elif pv != jv:
  49. print(f"[值] goods {gid}.{k}: PHP={pv!r} Java={jv!r}")
  50. diff_count += 1
  51. print(f"\n差异总数: {diff_count}")