专家购买流程测试步骤
测试日期: 2026-01-26
测试账户:user1@mbe-test.com/Test@123456
🎯 测试目标
验证专家购买流程的完整功能,包括:
- 购买按钮显示
- 登录验证
- 三种购买类型(永久、订阅、按次)
- 购买记录保存
- 购买记录查询
📝 详细测试步骤
步骤1:访问专家市场
- 打开浏览器
- 访问:
https://mbe.hi-maker.com/ui/market - 检查点:
- 页面正常加载
- 显示"精选专家"和"热门专家"列表
- 专家卡片显示价格(如:¥0.020/千Token)
- 有价格的专家显示"💰 购买"按钮(关键检查点)
如果看不到购买按钮:
- 打开浏览器开发者工具(F12)
- 查看Console标签,检查是否有JavaScript错误
- 查看Network标签,检查
/api/market/的响应 - 确认返回的专家数据包含
model_id和price_per_1k_tokens > 0
步骤2:登录系统
- 如果未登录,点击导航栏的"登录"按钮
- 输入邮箱:
user1@mbe-test.com - 输入密码:
Test@123456 - 点击"登录"
- 检查点:
- 登录成功
- 跳转回专家市场页面(或显示登录成功)
- 导航栏显示用户信息(不再是"登录"按钮)
步骤3:选择专家并点击购买
- 在专家列表中找到有"💰 购买"按钮的专家
- 点击"💰 购买"按钮
- 检查点:
- 弹出购买类型选择对话框
- 对话框显示三种选项:
选择购买类型: 1. 永久购买 (perpetual) 2. 订阅制 (subscription) 3. 按次付费 (pay_per_use) 请输入 1、2 或 3:
如果点击购买没有反应:
- 检查浏览器Console是否有JavaScript错误
- 确认已登录(检查
localStorage.getItem('token'))
步骤4:测试永久购买
在对话框中输入:
1点击"确定"
检查点:
- 弹出确认购买对话框
- 显示专家名称
- 显示购买类型:永久
- 显示价格(基于
pricePer1k * 1000 / 1000)
在确认对话框中点击"确定"
检查点:
- 显示"购买成功!您现在可以使用该专家了。"
- 页面自动刷新
- 浏览器Console没有错误
步骤5:验证购买记录(永久购买)
- 打开浏览器开发者工具(F12)
- 切换到Console标签
- 执行以下代码:
const token = localStorage.getItem('token'); const payload = JSON.parse(atob(token.split('.')[1])); const userId = payload.sub; fetch(`/api/v1/expert-pool/user/${userId}/purchases`, { headers: { 'Authorization': 'Bearer ' + token } }) .then(r => r.json()) .then(data => { console.log('购买记录:', data); if (data.purchases && data.purchases.length > 0) { const lastPurchase = data.purchases[data.purchases.length - 1]; console.log('最新购买:', lastPurchase); console.log('购买类型:', lastPurchase.purchase_type); console.log('过期时间:', lastPurchase.expires_at); console.log('剩余次数:', lastPurchase.remaining_uses); } }); - 检查点:
- 返回购买记录列表
- 包含刚才购买的专家
-
purchase_type为"perpetual" -
expires_at为null -
remaining_uses为null
步骤6:测试订阅制购买
选择另一个有价格的专家
点击"💰 购买"按钮
在购买类型对话框中输入:
2点击"确定"
检查点:
- 弹出订阅天数输入对话框
- 提示:"请输入订阅天数(如:30):"
输入:
30点击"确定"
检查点:
- 弹出确认购买对话框
- 显示购买类型:订阅
- 显示价格
点击"确定"确认购买
检查点:
- 购买成功提示
- 页面刷新
使用Console查询购买记录(同步骤5)
检查点:
- 购买记录中
purchase_type为"subscription" -
expires_at有值(购买时间 + 30天) -
remaining_uses为null
- 购买记录中
步骤7:测试按次付费购买
选择另一个有价格的专家
点击"💰 购买"按钮
在购买类型对话框中输入:
3点击"确定"
检查点:
- 弹出使用次数输入对话框
- 提示:"请输入购买次数(如:100):"
输入:
100点击"确定"
检查点:
- 弹出确认购买对话框
- 显示购买类型:按次
- 显示价格(
pricePer1k * 100 / 1000)
点击"确定"确认购买
检查点:
- 购买成功提示
- 页面刷新
使用Console查询购买记录
检查点:
- 购买记录中
purchase_type为"pay_per_use" -
expires_at为null -
remaining_uses为100
- 购买记录中
🐛 问题排查
问题1:看不到购买按钮
检查步骤:
- 打开浏览器开发者工具(F12)
- 查看Network标签
- 找到
/api/market/请求 - 查看响应数据,确认:
- 专家数据包含
model_id字段 - 专家数据包含
price_per_1k_tokens字段 price_per_1k_tokens > 0
- 专家数据包含
如果数据正确但按钮不显示:
- 检查浏览器Console是否有JavaScript错误
- 尝试强制刷新页面(Ctrl+F5)
- 检查
renderExperts函数中的条件判断
问题2:点击购买没有反应
检查步骤:
- 打开浏览器Console
- 检查是否有JavaScript错误
- 确认
purchaseExpert函数被调用:// 在Console中手动测试 purchaseExpert('test_id', '测试专家', 0.01);
如果函数未定义:
- 检查页面是否完全加载
- 检查JavaScript代码是否正确注入
问题3:购买API返回404或400错误
检查步骤:
- 打开浏览器Network标签
- 找到购买API请求(
/api/v1/expert-pool/{expert_id}/purchase) - 查看请求URL和参数
- 查看响应内容
常见错误:
- 404 "专家不存在":专家ID不正确,或专家未同步到专家池
- 400 "只能购买市场专家":专家不是市场专家(source !== 'market')
- 400 "无效的购买类型":购买类型参数错误
解决方案:
- 确认使用
model_id而不是kb_id - 确认专家已发布到市场(
status === 'published') - 确认购买类型为:
perpetual、subscription或pay_per_use
问题4:购买记录查询不到
检查步骤:
- 确认购买API返回
success: true - 检查Redis连接:
docker exec -it mbe-redis redis-cli KEYS mbe:user:purchases:* - 直接查询Redis:
GET mbe:user:purchases:{user_id}
如果Redis中没有数据:
- 检查购买管理器的保存逻辑
- 检查Redis服务是否正常运行
- 检查购买API是否成功返回
✅ 测试检查清单
功能检查
购买按钮显示
- 有价格的专家显示"💰 购买"按钮
- 无价格的专家不显示购买按钮
- 按钮样式正确(绿色,带💰图标)
登录验证
- 未登录时点击购买,提示登录
- 登录后可以正常购买
购买类型选择
- 永久购买:无需额外输入
- 订阅制:需要输入订阅天数
- 按次付费:需要输入使用次数
价格计算
- 永久购买:
price = pricePer1k * 1000 / 1000 - 订阅制:
price = pricePer1k * 1000 / 1000 - 按次付费:
price = pricePer1k * useCount / 1000
- 永久购买:
API调用
- 正确调用
/api/v1/expert-pool/{expert_id}/purchase - 传递正确的参数
- 包含Authorization header
- 正确调用
购买记录
- 购买记录正确保存到Redis
- 可以通过API查询购买记录
- 购买记录包含所有必要字段
错误处理检查
未登录处理
- 点击购买时提示登录
- 登录后可以继续购买流程
无效输入处理
- 输入无效的购买类型(如4、5)→ 提示"无效的选择"
- 取消购买类型选择 → 不执行购买
- 取消确认对话框 → 不执行购买
API错误处理
- 专家不存在 → 显示错误信息
- 不是市场专家 → 显示错误信息
- 网络错误 → 显示"购买失败,请重试"
📊 测试结果记录
测试场景1:永久购买
| 步骤 | 操作 | 预期结果 | 实际结果 | 状态 |
|---|---|---|---|---|
| 1 | 访问市场 | 页面加载 | ⬜ | |
| 2 | 登录系统 | 登录成功 | ⬜ | |
| 3 | 点击购买 | 弹出选择对话框 | ⬜ | |
| 4 | 选择永久购买 | 显示确认对话框 | ⬜ | |
| 5 | 确认购买 | 购买成功 | ⬜ | |
| 6 | 验证记录 | 记录存在 | ⬜ |
测试场景2:订阅制购买
| 步骤 | 操作 | 预期结果 | 实际结果 | 状态 |
|---|---|---|---|---|
| 1-2 | 访问市场、登录 | 正常 | ⬜ | |
| 3 | 点击购买 | 弹出选择对话框 | ⬜ | |
| 4 | 选择订阅制 | 弹出天数输入 | ⬜ | |
| 5 | 输入30天 | 显示确认对话框 | ⬜ | |
| 6 | 确认购买 | 购买成功 | ⬜ | |
| 7 | 验证记录 | 记录存在,有过期时间 | ⬜ |
测试场景3:按次付费购买
| 步骤 | 操作 | 预期结果 | 实际结果 | 状态 |
|---|---|---|---|---|
| 1-2 | 访问市场、登录 | 正常 | ⬜ | |
| 3 | 点击购买 | 弹出选择对话框 | ⬜ | |
| 4 | 选择按次付费 | 弹出次数输入 | ⬜ | |
| 5 | 输入100次 | 显示确认对话框 | ⬜ | |
| 6 | 确认购买 | 购买成功 | ⬜ | |
| 7 | 验证记录 | 记录存在,剩余100次 | ⬜ |
🔧 调试工具
浏览器Console命令
检查Token和用户ID:
const token = localStorage.getItem('token');
console.log('Token:', token ? '存在' : '不存在');
if (token) {
const payload = JSON.parse(atob(token.split('.')[1]));
console.log('User ID:', payload.sub);
console.log('Role:', payload.role);
}
查询购买记录:
const token = localStorage.getItem('token');
const payload = JSON.parse(atob(token.split('.')[1]));
const userId = payload.sub;
fetch(`/api/v1/expert-pool/user/${userId}/purchases`, {
headers: { 'Authorization': 'Bearer ' + token }
})
.then(r => r.json())
.then(data => {
console.log('购买记录:', data);
if (data.purchases) {
data.purchases.forEach(p => {
console.log(`专家: ${p.expert_id}, 类型: ${p.purchase_type}, 有效: ${p.expires_at ? new Date(p.expires_at) > new Date() : '永久'}`);
});
}
});
测试购买API(直接调用):
const token = localStorage.getItem('token');
const payload = JSON.parse(atob(token.split('.')[1]));
const userId = payload.sub;
const expertId = 'model_xxx'; // 替换为实际的专家ID
fetch(`/api/v1/expert-pool/${expertId}/purchase?user_id=${userId}&purchase_type=perpetual`, {
method: 'POST',
headers: { 'Authorization': 'Bearer ' + token }
})
.then(r => r.json())
.then(data => console.log('购买结果:', data))
.catch(e => console.error('购买失败:', e));
📝 测试报告模板
测试环境
- 测试日期: 2026-01-26
- 测试账户:
user1@mbe-test.com - 浏览器: Chrome / Firefox / Edge
- 测试URL:
https://mbe.hi-maker.com/ui/market
测试结果
永久购买: ✅ 通过 / ❌ 失败
订阅制购买: ✅ 通过 / ❌ 失败
按次付费购买: ✅ 通过 / ❌ 失败
发现的问题
- [问题描述]
- 复现步骤:
- 预期结果:
- 实际结果:
- 截图/日志:
建议
- [改进建议]
最后更新:2026-01-26
版本:v1.0
测试状态:待测试