first commit
This commit is contained in:
54
backend/smoke_test.py
Normal file
54
backend/smoke_test.py
Normal file
@@ -0,0 +1,54 @@
|
||||
"""开发自检脚本:跑一遍 /health 与 /backtest,打印结果。
|
||||
|
||||
用 FastAPI TestClient(无需起服务器,同进程验证全链路)。
|
||||
用法: uv run --with httpx --directory backend python smoke_test.py
|
||||
"""
|
||||
import json
|
||||
|
||||
from fastapi.testclient import TestClient
|
||||
|
||||
from app.main import app
|
||||
|
||||
# 必须用 with:lifespan(建表)只在进入上下文时执行
|
||||
with TestClient(app) as c:
|
||||
r = c.get("/api/health")
|
||||
print("== /api/health ==", r.status_code, r.json())
|
||||
|
||||
r = c.post(
|
||||
"/api/backtest",
|
||||
json={
|
||||
"symbol": "DEMO",
|
||||
"strategy": "macd_cross",
|
||||
"params": {"fast": 12, "slow": 26, "signal": 9},
|
||||
"initial_cash": 100000.0,
|
||||
"fast_mode": False,
|
||||
},
|
||||
)
|
||||
print("== /api/backtest ==", r.status_code)
|
||||
if r.status_code != 200:
|
||||
print("ERROR:", r.text)
|
||||
raise SystemExit(1)
|
||||
|
||||
d = r.json()
|
||||
print("candles :", len(d["candles"]))
|
||||
print("signals :", len(d["signals"]), "(买卖点)")
|
||||
print("equity pts :", len(d["equity"]))
|
||||
print("final_cash :", round(d["final_cash"], 2))
|
||||
print("final_pos :", d["final_position"])
|
||||
print("metrics :", json.dumps(d["metrics"], ensure_ascii=False, indent=2))
|
||||
print("first signal :", d["signals"][0] if d["signals"] else None)
|
||||
|
||||
assert len(d["candles"]) > 100
|
||||
|
||||
# 周期聚合:周线 K 线数应明显少于日线
|
||||
rw = c.post(
|
||||
"/api/backtest",
|
||||
json={"symbol": "DEMO", "timeframe": "1w", "strategy": "macd_cross",
|
||||
"params": {"fast": 12, "slow": 26, "signal": 9}, "initial_cash": 100000.0},
|
||||
)
|
||||
wd = rw.json()
|
||||
print("== weekly ==", rw.status_code, "candles:", len(wd["candles"]), "vs daily", len(d["candles"]))
|
||||
assert rw.status_code == 200
|
||||
assert len(wd["candles"]) < len(d["candles"])
|
||||
|
||||
print("\n✅ 后端全链路自检通过(含周期聚合)")
|
||||
Reference in New Issue
Block a user