MBE Desktop - API 集成测试指南

测试日期: 2026-02-07
测试范围: Token 自动刷新、Dashboard 真实数据、API 端点对接


一、测试前准备

1. 环境检查

# 确保 Node.js 版本 >= 18
node --version

# 确保已安装依赖
cd d:\Mises\mbe-desktop
npm install

# 检查 .env 文件配置
cat .env

2. 后端服务检查

确保后端 API 服务正在运行:

  • 开发环境: https://mbe-dev.hi-maker.com
  • 健康检查: https://mbe-dev.hi-maker.com/api/health

3. 启动应用

# 启动开发模式(Electron + Vite 热重载)
npm run dev:electron

二、测试清单

✅ 测试 1: 用户登录

目标: 验证登录功能和 Token 保存

步骤:

  1. 打开应用,进入登录页面
  2. 输入有效的邮箱和密码
  3. 点击"登录"按钮

预期结果:

  • ✅ 登录成功,跳转到 Dashboard
  • ✅ 浏览器控制台显示: [API] Token saved
  • localStorage 中有 mbe_access_tokenmbe_refresh_token
  • ✅ 用户信息正确显示在 Dashboard

检查点:

// 在浏览器控制台执行
localStorage.getItem('mbe_access_token')
localStorage.getItem('mbe_refresh_token')

失败处理:

  • 检查后端服务是否运行
  • 检查网络连接
  • 查看控制台错误信息

✅ 测试 2: Token 自动刷新(过期前刷新)

目标: 验证 Token 在过期前自动刷新

步骤:

  1. 登录成功后,打开浏览器开发者工具(F12)
  2. 切换到 Console 标签
  3. 在控制台执行以下代码修改 Token 过期时间(模拟即将过期):
// 获取当前 Token
const token = localStorage.getItem('mbe_access_token')

// 解码 Token(仅用于测试)
const payload = JSON.parse(atob(token.split('.')[1]))
console.log('Token expires at:', new Date(payload.exp * 1000))

// 修改 Token 过期时间为 4 分钟后(小于 5 分钟阈值)
payload.exp = Math.floor(Date.now() / 1000) + 4 * 60
const newToken = token.split('.')[0] + '.' + btoa(JSON.stringify(payload)) + '.' + token.split('.')[2]
localStorage.setItem('mbe_access_token', newToken)
console.log('Token modified, expires in 4 minutes')
  1. 在 Dashboard 页面点击"刷新"或切换标签页(触发 API 请求)

预期结果:

  • ✅ 控制台显示: [API] Token expires in XXXs, refreshing...
  • ✅ 控制台显示: [API] Token refreshed successfully
  • ✅ 新的 Token 保存到 localStorage
  • ✅ API 请求成功,无 401 错误

检查点:

// 检查 Token 是否已刷新
const oldToken = token
const newToken = localStorage.getItem('mbe_access_token')
console.log('Token changed:', oldToken !== newToken)

✅ 测试 3: Token 自动刷新(401 错误触发)

目标: 验证 401 错误时自动刷新 Token

步骤:

  1. 登录成功后,手动将 Token 设置为无效值:
localStorage.setItem('mbe_access_token', 'invalid_token')
  1. 在 Dashboard 页面执行任何操作(如刷新数据、切换标签)

预期结果:

  • ✅ 控制台显示: [API] Token refresh failed[API] Token refreshed successfully
  • ✅ 如果刷新成功,请求自动重试
  • ✅ 如果刷新失败,显示登录过期提示

✅ 测试 4: Dashboard 数据加载

目标: 验证 Dashboard 使用真实后端数据

步骤:

  1. 登录成功后,进入 Dashboard
  2. 观察页面加载状态
  3. 检查各个数据卡片和图表

预期结果:

  • ✅ 显示加载骨架屏(LoadingSkeleton)
  • ✅ 数据加载完成后显示真实数据:
    • API 调用次数
    • Token 使用量
    • 费用统计
    • API 密钥数量
  • ✅ 图表显示真实趋势数据(如果有)
  • ✅ 调用日志显示真实记录(如果有)

检查点:

  • 打开浏览器开发者工具 → Network 标签
  • 查看 API 请求:
    • GET /api/v1/users/dashboard/stats
    • GET /api/v1/users/usage
    • GET /api/health
  • 确认请求返回 200 状态码
  • 确认响应数据格式正确

失败处理:

  • 如果显示错误提示,点击"重试"按钮
  • 检查后端 API 是否正常
  • 查看控制台错误信息

✅ 测试 5: API Key 管理

目标: 验证 API Key 的创建和管理

步骤:

  1. 在 Dashboard 切换到"API 密钥"标签
  2. 点击"创建新密钥"按钮
  3. 输入密钥名称(可选)
  4. 确认创建
  5. 尝试删除或禁用密钥

预期结果:

  • ✅ 密钥列表正确显示
  • ✅ 创建密钥成功,显示完整密钥(仅一次)
  • ✅ 删除/禁用操作成功
  • ✅ 列表自动刷新

检查点:

// 检查 API Key 列表
// Network 标签中查看:
// POST /api/v1/users/api-key
// DELETE /api/v1/users/api-key/{id}

✅ 测试 6: 错误处理

目标: 验证错误处理和用户提示

步骤:

  1. 网络断开测试:

    • 断开网络连接
    • 尝试刷新 Dashboard 数据
  2. 无效 Token 测试:

    • 清除 localStorage 中的 Token
    • 尝试访问需要认证的页面
  3. 后端错误测试:

    • 修改 API URL 为无效地址
    • 尝试登录或加载数据

预期结果:

  • ✅ 网络错误时显示友好的错误提示
  • ✅ 提供"重试"按钮
  • ✅ Token 无效时自动跳转到登录页
  • ✅ 控制台记录详细错误信息(便于调试)

✅ 测试 7: 并发请求和 Token 刷新

目标: 验证多个并发请求时 Token 刷新不会重复

步骤:

  1. 登录成功后,修改 Token 为即将过期状态(参考测试 2)
  2. 同时触发多个 API 请求(如快速切换 Dashboard 标签)

预期结果:

  • ✅ 控制台只显示一次 Token 刷新日志
  • ✅ 所有请求共享同一个刷新操作
  • ✅ 所有请求最终都成功

检查点:

// 在控制台观察日志
// 应该只看到一次: "[API] Token refreshed successfully"
// 不应该看到多次刷新

✅ 测试 8: 自动登录(Token 持久化)

目标: 验证应用重启后自动登录

步骤:

  1. 登录成功后,关闭应用
  2. 重新启动应用

预期结果:

  • ✅ 应用启动时自动验证 Token
  • ✅ Token 有效时自动登录,显示 Dashboard
  • ✅ Token 无效时跳转到登录页

检查点:

// 检查 authStore 的 initializeAuth 是否被调用
// 检查 Token 是否从 localStorage 恢复

三、测试工具和技巧

1. 浏览器开发者工具

打开方式:

  • Windows/Linux: F12Ctrl+Shift+I
  • macOS: Cmd+Option+I

关键标签:

  • Console: 查看日志和错误
  • Network: 查看 API 请求和响应
  • Application → Local Storage: 查看存储的 Token

2. 有用的控制台命令

// 查看当前 Token
localStorage.getItem('mbe_access_token')

// 查看 Token 过期时间
const token = localStorage.getItem('mbe_access_token')
const payload = JSON.parse(atob(token.split('.')[1]))
console.log('Expires at:', new Date(payload.exp * 1000))
console.log('Time until expiry:', Math.round((payload.exp * 1000 - Date.now()) / 1000), 'seconds')

// 清除所有 Token(模拟登出)
localStorage.removeItem('mbe_access_token')
localStorage.removeItem('mbe_refresh_token')

// 模拟 Token 即将过期(4 分钟后)
const token = localStorage.getItem('mbe_access_token')
const parts = token.split('.')
const payload = JSON.parse(atob(parts[1]))
payload.exp = Math.floor(Date.now() / 1000) + 4 * 60
const newToken = parts[0] + '.' + btoa(JSON.stringify(payload)) + '.' + parts[2]
localStorage.setItem('mbe_access_token', newToken)
console.log('Token modified to expire in 4 minutes')

3. 网络请求监控

在 Network 标签中过滤:

  • XHRFetch - 查看 API 请求
  • 搜索 /api/v1/users - 过滤用户相关请求
  • 查看请求头中的 Authorization: Bearer xxx
  • 查看响应状态码和内容

四、常见问题和解决方案

问题 1: 登录后立即显示 401 错误

可能原因:

  • Token 格式不正确
  • 后端认证中间件配置问题
  • CORS 问题

解决方案:

  1. 检查 Network 标签中的请求头
  2. 确认 Authorization: Bearer xxx 格式正确
  3. 检查后端日志

问题 2: Token 刷新失败

可能原因:

  • Refresh Token 已过期
  • 后端刷新端点返回错误
  • 网络问题

解决方案:

  1. 检查控制台错误信息
  2. 检查 Network 标签中的刷新请求
  3. 确认 Refresh Token 存在且有效

问题 3: Dashboard 数据为空

可能原因:

  • 后端 API 返回空数据
  • 数据格式不匹配
  • API 端点错误

解决方案:

  1. 检查 Network 标签中的响应数据
  2. 确认后端 API 正常工作
  3. 检查 dashboardService.ts 中的数据适配逻辑

问题 4: 应用无法启动

可能原因:

  • 依赖未安装
  • 端口被占用
  • 编译错误

解决方案:

# 重新安装依赖
npm install

# 清理并重新构建
rm -rf dist node_modules
npm install
npm run build

# 检查端口占用
netstat -ano | findstr :5173  # Windows
lsof -i :5173                  # macOS/Linux

五、测试报告模板

测试结果记录

测试项 状态 备注
用户登录 ⬜ 通过 / ⬜ 失败
Token 过期前刷新 ⬜ 通过 / ⬜ 失败
Token 401 触发刷新 ⬜ 通过 / ⬜ 失败
Dashboard 数据加载 ⬜ 通过 / ⬜ 失败
API Key 管理 ⬜ 通过 / ⬜ 失败
错误处理 ⬜ 通过 / ⬜ 失败
并发请求刷新 ⬜ 通过 / ⬜ 失败
自动登录 ⬜ 通过 / ⬜ 失败

发现的问题

  1. 问题描述:
    • 复现步骤:
    • 预期行为:
    • 实际行为:
    • 截图/日志:

六、下一步

测试完成后,根据结果:

  1. ✅ 修复发现的问题
  2. ✅ 更新文档
  3. ✅ 准备发布

最后更新: 2026-02-07