跳到主要内容

测试快速入门指南

最后更新: 2026-01-20 适用对象: QA 工程师, 测试人员, 前端开发人员

本指南将帮助您快速开始测试 AXBlade 平台 API。所有测试脚本均已准备就绪,仅需简单设置即可运行。


快速开始 (5 分钟)

1. 安装依赖

cd backend/tests
pip3 install aiohttp eth-account certifi web3 python-dotenv requests

2. 运行所有核心测试

# 全面 API 测试 (44 个测试)
python3 test_api_comprehensive.py

# 场景和边界情况测试 (21 个测试)
python3 test_scenarios_and_edge_cases.py

3. 检查结果

Total tests: 65
Pass: 65
Fail: 0
Pass rate: 100.0%

测试环境

环境API Base URLWebSocket链 (Chain)
测试网 (Testnet)https://api.8a27.xyzwss://ws.8a27.xyzArbitrum Sepolia (421614)

测试套件概览

可用测试文件

测试文件测试数时长描述
test_api_comprehensive.py44~30sAPI 全面覆盖
test_scenarios_and_edge_cases.py21~45s交易场景测试
test_limit_orders.py20~60s限价单生命周期
test_liquidation.py9~30s清算机制
test_points_phase1.py16~30s积分系统
test_earn_e2e.py10~120sEARN 产品生命周期
test_stress_10k.py8 阶段~90s1万并发压力测试

快速测试命令

# 运行特定测试
python3 test_limit_orders.py

# 运行并显示详细输出
python3 -v test_api_comprehensive.py

# 顺序运行所有测试
./run_api_tests.sh

测试账户设置

默认测试账户

所有测试文件均使用预配置的测试账户:

ADDRESS = "0x29F721B203A9fC9c5DDe35A739d8b8E0E4605489"
PRIVATE_KEY = "0x9b7f11c9a5c41fc4a62ab0aa767a3a18018a16f3bd012b2ca78d3a12ae947041"

使用自己的账户

  1. 生成新钱包或使用现有钱包
  2. 获取测试 USDT (仅限测试网)
  3. 更新测试文件:
ADDRESS = "0xYourAddress"
PRIVATE_KEY = "0xYourPrivateKey"

测试账户充值

对于测试网,请向团队申请或使用水龙头:


API 测试指南

身份验证流程

所有需要身份验证的请求都需要 EIP-712 签名:

# 1. 获取 nonce
GET /api/v1/auth/nonce/{address}

# 2. 对类型化数据进行签名
typed_data = response['typed_data']
signature = sign_typed_data(typed_data, private_key)

# 3. 登录
POST /api/v1/auth/login
{
"address": "0x...",
"signature": "0x...",
"timestamp": 1234567890
}

# 4. 在 Header 中使用 Token
Authorization: Bearer {token}

常用 API 端点

类别端点认证描述
市场GET /api/v1/markets列出所有市场
GET /api/v1/markets/{symbol}/price当前价格
GET /api/v1/markets/{symbol}/ticker24小时行情
GET /api/v1/markets/{symbol}/orderbook订单簿深度
仓位POST /api/v1/positions开仓
GET /api/v1/positions列出仓位
POST /api/v1/positions/{id}/close平仓
订单POST /api/v1/orders创建订单
GET /api/v1/orders列出订单
DELETE /api/v1/orders/{id}取消订单
账户GET /api/v1/account/balance获取余额
GET /api/v1/account/positions仓位历史
积分GET /api/v1/points用户积分
GET /api/v1/leaderboard排行榜
GET /api/v1/epochsEpoch 列表

测试类别

1. API 全面测试 (44 个测试)

文件: test_api_comprehensive.py

测试跨 11 个模块的所有 API 端点:

模块测试数覆盖范围
身份验证3Nonce, 登录, 无效签名
账户7个人资料, 余额, 仓位, 订单, 历史
市场数据7市场列表, 订单簿, 行情, 价格, K线
仓位4开仓, 获取, 预估强平价, 平仓
资金费率4所有费率, 单个费率, 历史
清算4事件, 配置, 保险基金
ADL3排名, 配置, 历史
推荐系统3状态, 面板, 日志
积分系统3用户积分, 排行榜, Epoch
Earn3域名, 产品, 订阅
充值/提现3准备, 历史

2. 场景与边界情况测试 (21 个测试)

文件: test_scenarios_and_edge_cases.py

交易场景

  • 完整交易周期 (开仓 → 检查 → 平仓 → 验证)
  • 部分平仓
  • 加仓 (同向)
  • 反向开仓 (对冲)
  • 多币种仓位
  • 快速连续开平仓

边界情况

  • 最小保证金
  • 最大杠杆 (50倍限制)
  • 无效仓位 ID
  • 防止重复平仓
  • 拒绝无效币种/方向
  • 拒绝零/负保证金
  • 拒绝过期 Token

并发测试

  • 并发开仓
  • 并发平仓同一仓位 (竞争条件)
  • 并发余额查询

3. 限价单测试 (20 个测试)

文件: test_limit_orders.py

类别测试数描述
订单放置6创建、查询、取消订单
仓位触发1验证成交后仓位开启
增加仓位2增加多单/空单
减少仓位2部分平仓
平仓2全额平仓、批量平仓
结算4盈亏 (PnL) 计算
积分3交易/持仓/盈亏积分

4. 清算测试 (9 个测试)

文件: test_liquidation.py

测试描述
清算配置查询所有市场的配置
保险基金查询基金余额
多单强平价验证计算准确性
空单强平价验证计算准确性
清算状态 API检查端点
市场清算事件查询历史
用户清算历史查询历史
杠杆限制测试最大 50 倍
临近清算场景监控高杠杆仓位

关键验证点:

  • 最大杠杆: 50x
  • 维持保证金: 0.50%
  • 清算费用: 0.50%
  • 最小保证金: $10

5. 积分第一阶段测试 (16 个测试)

文件: test_points_phase1.py

类别测试数描述
API 测试6积分, epochs, 排行榜
Epoch 测试1状态验证
排行榜3类型, 排名, 用户查询
等级测试2显示, 逻辑
积分类型3交易, 持仓, 盈亏
汇总1总额计算

积分公式:

交易积分 = 交易量 × 0.0001 × 等级倍数
盈亏积分 = max(盈亏, 0) × 0.001 × 等级倍数
持仓积分 = 仓位价值 × 0.00001 × 小时数 × 等级倍数
推荐积分 = 被推荐人交易量 × 0.00005 (+ 100pt 首单奖励)
质押积分 = 金额 × 0.0002 × 天数

6. EARN 模块测试

文件: test_earn_api.py, test_earn_e2e.py

完整的 EARN 产品生命周期:

  1. 创建产品
  2. 开放订阅
  3. 用户订阅
  4. 激活产品
  5. 结算产品
  6. 用户领取

7. 压力测试

文件: test_stress_10k.py

渐进式负载测试:

  • 100 → 500 → 1000 → 2000 → 3000 → 5000 → 7500 → 10000 并发
  • 每个阶段:10 秒
  • 生成 JSON 报告

预期结果:

  • 2000 并发下稳定:100% 成功率
  • 峰值 RPS: ~2859 (3000 并发时)

运行测试

单个测试文件

python3 test_api_comprehensive.py

特定测试类别

# 仅运行积分测试
python3 test_points_phase1.py

# 仅运行限价单测试
python3 test_limit_orders.py

运行所有测试并生成报告

./run_api_tests.sh 2>&1 | tee test_report.txt

压力测试并生成报告

python3 test_stress_10k.py
# 生成文件: stress_10k_report_{timestamp}.json

预期结果

所有测试通过

======================================================================
Test Summary
======================================================================
Total tests: 44
Pass: 44
Fail: 0
Skip: 0
Pass rate: 100.0%

🎉 All tests passed!

常见失败原因

错误原因解决方案
UNAUTHORIZEDToken 无效或过期重新进行身份验证
INSUFFICIENT_BALANCEUSDT 余额不足为测试账户充值
POSITION_NOT_FOUND仓位已关闭检查仓位状态
SIGNATURE_INVALID签名格式错误检查 EIP-712 结构
CONNECTION_ERROR网络问题检查代理或连接性

调试技巧

1. 检查 API 响应

status, data = await client.get("/api/v1/markets")
print(f"Status: {status}")
print(f"Response: {json.dumps(data, indent=2)}")

2. 详细日志

import logging
logging.basicConfig(level=logging.DEBUG)

3. 检查身份验证

# 测试 nonce 端点
curl https://api.8a27.xyz/api/v1/auth/nonce/0x29F721B203A9fC9c5DDe35A739d8b8E0E4605489

4. 验证签名

# 打印已签名的消息
print(f"Typed data: {json.dumps(typed_data, indent=2)}")
print(f"Signature: {signature}")

测试输出文件

文件描述
stress_10k_report_{ts}.json压力测试结果
test_results/测试输出目录
*.log调试日志

联系与支持

  • 文档: 本站点
  • API 问题: 后端团队
  • 测试环境: DevOps 团队
  • 测试脚本: QA 团队

附录:测试文件模板

使用此模板创建新的测试文件:

#!/usr/bin/env python3
"""
在此处添加测试描述
"""

import asyncio
import aiohttp
import ssl
import certifi
from eth_account import Account
from eth_account.messages import encode_typed_data

BASE_URL = "https://api.8a27.xyz"
ADDRESS = "0x29F721B203A9fC9c5DDe35A739d8b8E0E4605489"
PRIVATE_KEY = "0x9b7f11c9a5c41fc4a62ab0aa767a3a18018a16f3bd012b2ca78d3a12ae947041"

class TestClient:
def __init__(self):
self.account = Account.from_key(PRIVATE_KEY)
self.session = None
self.token = None

async def connect(self):
ssl_context = ssl.create_default_context(cafile=certifi.where())
connector = aiohttp.TCPConnector(ssl=ssl_context)
self.session = aiohttp.ClientSession(connector=connector)

async def close(self):
if self.session:
await self.session.close()

async def authenticate(self):
# 获取 nonce
async with self.session.get(
f"{BASE_URL}/api/v1/auth/nonce/{ADDRESS.lower()}"
) as resp:
data = await resp.json()
typed_data = data["typed_data"]

# 签名
typed_data["message"]["timestamp"] = str(int(time.time()))
signable = encode_typed_data(full_message=typed_data)
signed = self.account.sign_message(signable)
signature = f"0x{signed.signature.hex()}"

# 登录
async with self.session.post(
f"{BASE_URL}/api/v1/auth/login",
json={
"address": ADDRESS.lower(),
"signature": signature,
"timestamp": int(typed_data["message"]["timestamp"])
}
) as resp:
data = await resp.json()
self.token = data["token"]

async def run_tests(self):
results = []
# 在此处添加您的测试
return results

async def main():
client = TestClient()
await client.connect()
await client.authenticate()
results = await client.run_tests()
await client.close()
print(f"Results: {results}")

if __name__ == "__main__":
asyncio.run(main())