smoke_api_ingest.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. """今日可跑的 stg 级冒烟(不依赖 Phase 1、不涉 std)。
  2. 两段独立可用:
  3. A) Mock 契约冒烟(无需 DB、无需后端):直连 Mock 校验响应形状
  4. (data.list 数组 + 每行含 bizKey),确认 API 契约与执行器约定一致。
  5. B) stg 落库冒烟(需 DB):给定 source_table 与批次前缀,统计对应 stg 行数,
  6. 确认 API 执行器入站后 stg 出数(在你已触发入站后运行)。
  7. 用法:
  8. # A:默认校验 Mock 的 /api/receipt
  9. python smoke_api_ingest.py --base-url http://127.0.0.1:8018 --path /api/receipt --token uat-mock-token
  10. # B:统计 stg(在触发入站之后)
  11. python smoke_api_ingest.py --stg mdp_stg_purchase_receipt --source-table /api/receipt
  12. 退出码:0=通过;1=失败。
  13. """
  14. import argparse
  15. import sys
  16. import requests
  17. def check_mock(base_url, path, token):
  18. url = base_url.rstrip("/") + path
  19. r = requests.get(url, headers={"Authorization": f"Bearer {token}"}, timeout=30)
  20. if r.status_code != 200:
  21. print(f"[FAIL] HTTP {r.status_code}: {r.text[:200]}", file=sys.stderr)
  22. return False
  23. body = r.json()
  24. rows = body.get("data", {}).get("list")
  25. if not isinstance(rows, list):
  26. print(f"[FAIL] data.list 不是数组:{body}", file=sys.stderr)
  27. return False
  28. missing = [i for i, row in enumerate(rows) if "bizKey" not in row]
  29. if missing:
  30. print(f"[FAIL] 第 {missing} 行缺 bizKey", file=sys.stderr)
  31. return False
  32. print(f"[PASS] Mock 契约 OK:{path} 返回 {len(rows)} 行,均含 bizKey。")
  33. return True
  34. def check_stg(stg, source_table):
  35. from _db import query
  36. rows = query(
  37. f"SELECT COUNT(*) AS c FROM {stg} WHERE source_table=%s",
  38. (source_table,),
  39. )
  40. c = rows[0]["c"] if rows else 0
  41. if c > 0:
  42. print(f"[PASS] {stg} 中 source_table={source_table} 有 {c} 行。")
  43. return True
  44. print(f"[FAIL] {stg} 中 source_table={source_table} 无行(是否已触发入站?)", file=sys.stderr)
  45. return False
  46. def main():
  47. ap = argparse.ArgumentParser()
  48. ap.add_argument("--base-url", default="http://127.0.0.1:8018")
  49. ap.add_argument("--path", default="/api/receipt")
  50. ap.add_argument("--token", default="uat-mock-token")
  51. ap.add_argument("--stg", help="给出则做 stg 落库冒烟")
  52. ap.add_argument("--source-table", help="stg 冒烟时 source_table 过滤值(API 入站为 source_api_path)")
  53. args = ap.parse_args()
  54. if args.stg:
  55. return 0 if check_stg(args.stg, args.source_table or args.path) else 1
  56. return 0 if check_mock(args.base_url, args.path, args.token) else 1
  57. if __name__ == "__main__":
  58. sys.exit(main())