smoke_camel.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. # -*- coding: utf-8 -*-
  2. """驼峰改造冒烟:核心读接口出参不得出现 snake_case key;写接口用驼峰入参。"""
  3. import re
  4. import sys
  5. sys.path.insert(0, "tools")
  6. from test_token_user import login, S, BASE, Redis, PREFIX
  7. def check_snake(obj, path="$"):
  8. hits = []
  9. if isinstance(obj, dict):
  10. for k, v in obj.items():
  11. if re.match(r'^[a-z]+(_[a-z0-9]+)+$', k):
  12. hits.append("%s.%s" % (path, k))
  13. hits += check_snake(v, path + "." + k)
  14. elif isinstance(obj, list):
  15. for i, v in enumerate(obj[:3]):
  16. hits += check_snake(v, "%s[%d]" % (path, i))
  17. return hits
  18. # 账号由 tools/seed_store_user.py 创建
  19. tok = login()["data"]["token"]
  20. H = {"Access-Token": tok}
  21. def get(p):
  22. return S.get(BASE + p, headers=H, timeout=30).json()
  23. def post(p, b):
  24. return S.post(BASE + p, headers=H, json=b, timeout=30).json()
  25. fails = []
  26. CASES = [
  27. "/store/goods/list?page=1&pageSize=5",
  28. "/store/order/list?dataType=order&page=1&pageSize=5",
  29. "/store/order/list?dataType=delivery&page=1&pageSize=5",
  30. "/store/order/list?dataType=receipt&page=1&pageSize=5",
  31. "/store/order/list?dataType=complete&page=1&pageSize=5",
  32. "/store/store.user/list?page=1",
  33. "/store/files/list?page=1",
  34. "/store/goods.comment/list?page=1",
  35. "/store/market.coupon/list?page=1",
  36. "/store/page/list",
  37. "/store/setting/detail",
  38. "/store/statistics.data/data",
  39. "/store/statistics.data/survey",
  40. "/store/category/list",
  41. "/store/client.h5.setting/detail?key=basic",
  42. "/store/client.wxapp.setting/detail?key=basic",
  43. ]
  44. # goods/detail 用列表里真实存在的商品 ID(10001/10002 已软删)
  45. first = get("/store/goods/list?page=1&pageSize=1")
  46. lst = first.get("data", {}).get("list", {})
  47. real_gid = (lst.get("data") or [{}])[0].get("goodsId") if isinstance(lst, dict) else None
  48. if real_gid:
  49. CASES.insert(1, "/store/goods/detail?goodsId=%s" % real_gid)
  50. for p in CASES:
  51. r = get(p)
  52. hits = check_snake(r)
  53. tag = "ok" if (r.get("status") == 200 and not hits) else "FAIL"
  54. print("[%s] %-46s status=%s snake=%s" % (tag, p, r.get("status"), hits[:4] if hits else "无"))
  55. if tag == "FAIL":
  56. fails.append(p)
  57. # 写接口:驼峰入参
  58. r5 = post("/store/category/add", {"form": {"name": "冒烟分类", "parentId": 0, "sort": 99, "imageId": 0}})
  59. print("[--] category.add(驼峰入参):", r5["status"], r5["message"])
  60. if r5["status"] != 200:
  61. fails.append("category.add")
  62. with Redis() as rd:
  63. rd("DEL", PREFIX + tok)
  64. print("\n冒烟结果:", "全部通过" if not fails else "FAIL: %s" % fails)
  65. sys.exit(1 if fails else 0)