"""请求运行中的商务接口并生成脱敏结果;令牌从仓库外文件读取。""" import argparse import json import time import urllib.error import urllib.parse import urllib.request from pathlib import Path def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--base-url", default="http://127.0.0.1:18000") parser.add_argument("--token-file", required=True, type=Path) parser.add_argument("--output", required=True, type=Path) args = parser.parse_args() token = args.token_file.read_text(encoding="utf-8").strip() results = [] def request(method, path, payload=None, expected=0): started = time.monotonic() req = urllib.request.Request( args.base_url.rstrip("/") + path, data=json.dumps(payload).encode() if payload is not None else None, headers={"x-token": token, "Content-Type": "application/json"}, method=method) try: with urllib.request.urlopen(req, timeout=30) as response: body = json.load(response) item = {"method": method, "path": path, "http": response.status, "code": body.get("code"), "msg": body.get("msg"), "elapsed_ms": round((time.monotonic() - started) * 1000)} item["passed"] = response.status == 200 and body.get("code") == expected data = body.get("data") if isinstance(data, dict) and "rows" in data: item.update(total=data.get("total"), rows=len(data["rows"])) if "available" in data: item["available"] = data["available"] results.append(item) print(json.dumps(item, ensure_ascii=False), flush=True) return data if item["passed"] else None except (urllib.error.URLError, TimeoutError, ValueError) as error: item = {"method": method, "path": path, "passed": False, "error": str(error)} results.append(item) print(json.dumps(item, ensure_ascii=False), flush=True) return None first = request("GET", "/sw/business/list?pageNum=1&pageSize=500") request("GET", "/sw/business/list?pageNum=2&pageSize=10") if first and first["rows"]: account = first["rows"][0] request("GET", f"/sw/business/{account['userId']}") request("GET", "/sw/business/list?" + urllib.parse.urlencode({"userName": account["userName"]})) bound = next((row for row in first["rows"] if row["bindCount"] > 0), account) request("GET", f"/sw/business/{bound['userId']}/bindPlatform") request("GET", f"/sw/business/{bound['userId']}/promotes") request("GET", "/sw/user/preference") request("GET", "/sw/business/bindPlatform?pageNum=1&pageSize=10") request("GET", "/sw/business/bindPlatform?sourceDb=lx,hw&status=0&pageSize=2") # 使用校验必然拒绝的请求体检查写接口,不新增或修改测试库业务记录。 for method, path in [("PUT", "/sw/user/preference"), ("POST", "/sw/business"), ("PUT", "/sw/business"), ("POST", "/sw/business/bindPlatform"), ("DELETE", "/sw/business/bindPlatform")]: request(method, path, {}, expected=7) args.output.write_text(json.dumps({"base_url": args.base_url, "checks": results, "passed": all(row["passed"] for row in results)}, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") if not all(row["passed"] for row in results): raise SystemExit(1) if __name__ == "__main__": main()