所属角色:
shu-zi-neng-liang-test-engineer基于: phase1-product-plan.md, phase1-user-stories.md, system-spec.md 版本: v1.0
| 模块 | 文件/组件 | 优先级 |
|---|---|---|
| 首页输入 | index.js + index.wxml + index.wxss | P0 |
| 三角形命盘 | chart.js + chart.wxml + chart.wxss + triangle组件 | P0 |
| AI解读 | reading.js + reading.wxml + reading.wxss | P0 |
| 付费订阅 | subscribe.js + subscribe.wxml + subscribe.wxss | P0 |
| 个人中心 | profile.js + profile.wxml + profile.wxss | P1 |
| 分销面板 | distribution.js + distribution.wxml + distribution.wxss | P1 |
| 计算引擎 | calculator.js | P0 |
| App全局 | app.js + app.wxss + app.json | P1 |
| 云函数: 用户注册 | registerUser/index.js | P1 |
| 云函数: 会话检查 | checkSession/index.js | P1 |
| 云函数: AI解读 | generateReading/index.js | P0 |
| 云函数: 支付创建 | createPayment/index.js | P0 |
| 云函数: 佣金查询 | getCommission/index.js | P1 |
| 云函数: 提现申请 | applyWithdraw/index.js | P1 |
| 云函数: 二维码 | getQRCode/index.js | P1 |
| 云函数: 上级查询 | getReferrerInfo/index.js | P1 |
| 云函数: 支付回调 | paymentCallback/index.js | P0 |
| # | 用例 | 输入 | 预期结果 |
|---|---|---|---|
| 1.1 | 个位数原样返回 | reduceToDigit(5) | 5 |
| 1.2 | 两位数归约 | reduceToDigit(10) | 1 |
| 1.3 | 多位数归约 | reduceToDigit(99) | 9 |
| 1.4 | 多位数归约链 | reduceToDigit(999) | 9 |
| 1.5 | 卓越数11保留 | reduceToDigit(11) | 11 |
| 1.6 | 卓越数22保留 | reduceToDigit(22) | 22 |
| 1.7 | 卓越数33保留 | reduceToDigit(33) | 33 |
| 1.8 | 完整命盘-已知日期 | calculateTriangle(1990, 1, 1) | 手算验真15个位置 |
| 1.9 | 完整命盘-月份两位数 | calculateTriangle(1985, 12, 25) | D=3, E=7 |
| 1.10 | 完整命盘-日两位数 | calculateTriangle(2000, 6, 15) | D=6, E=6 |
| 1.11 | 完整命盘-年份奇数 | calculateTriangle(2001, 3, 8) | A=2, B=0, C=1 |
| 1.12 | 主性格卓越数 | calculateTriangle(1994, 5, 12) | O 可能是22/33 |
| 1.13 | 五区sum值 | 各场景 | sum=reduceToDigit(各位置值和) |
| 1.14 | 数字含义1-9完整 | 1-9 | 均有title和trait |
| 1.15 | 卓越数字含义 | 11, 22, 33 | 有特殊含义 |
| # | 用例 | 步骤 | 预期结果 |
|---|---|---|---|
| 2.1 | 未登录用户可输入 | 打开首页,填写日期 | 可操作,不强制登录 |
| 2.2 | 推广链接打开 | URL带?ref=ABC123 | 底部显示分享者信息,缓存推广码 |
| 2.3 | 免费用户3次限制 | 连续生成4次命盘 | 第4次弹出"次数已用完"引导订阅 |
| 2.4 | 能量师无限生成 | 能量师身份不限次 | 不会触发次数限制 |
| 2.5 | 跨午夜重置 | 00:00后检查 | 免费配额重置为0/3 |
| 2.6 | 无效日期输入 | 月份=13, 日期=32 | 显示验证错误提示 |
| 2.7 | 空字段提交 | 不选择年月日直接点生成 | 提示"请填写完整的出生日期" |
| 2.8 | chart页历史id查找 | 点击历史记录中的命盘 | 正确加载对应命盘数据 |
| 2.9 | chart页无效id | URL手动修改为不存在id | 显示空状态/错误提示 |
| 2.10 | 免费用户解读限制 | 免费用户查看AI解读 | 仅显示主性格概要 |
| 2.11 | 能量师完整解读 | 能量师查看AI解读 | 显示主性格+五区完整内容 |
| 2.12 | 解读缓存 | 两次进入同一命盘解读页 | 第二次不调用云函数,使用本地缓存 |
| 2.13 | 解读加载状态 | 首次进入解读页 | 显示骨架屏/loading动画 |
| 2.14 | 解读内容折叠展开 | 点击章节标题 | 正确折叠/展开内容卡片 |
| 2.15 | 免责声明存在 | 解读页底部 | 显示"本解读由AI生成,仅供参考" |
| # | 用例 | 步骤 | 预期结果 |
|---|---|---|---|
| 3.1 | 五层十五格绘制 | 生成命盘 → chart页 | 5层15个数字卡片完整绘制 |
| 3.2 | 连接线 | 检查线条 | 底层→顶层所有连接线正确 |
| 3.3 | 数字颜色 | 1-9每个数字 | 颜色与DIGIT_COLORS配置一致 |
| 3.4 | 卓越数高亮 | 主性格=11/22/33 | 金底+星标+边框加粗 |
| 3.5 | 位置标签 | 每个数字下方 | 显示getPositionName的对应名称 |
| 3.6 | 点击交互 | 点击数字卡片 | 弹出含义面板(title+trait+position) |
| 3.7 | 区域背景色 | 五区 | 使用ZONE_COLORS颜色区分 |
| 3.8 | 姓名生日显示 | 命盘上方 | 显示姓名和出生日期 |
| 3.9 | 320px宽屏幕 | iPhone SE | 不溢出,数字不重叠 |
| 3.10 | 414px宽屏幕 | iPhone Plus | 布局适配 |
| 3.11 | 2x倍屏 | devicePixelRatio=2 | 渲染清晰无锯齿 |
| 3.12 | 3x倍屏 | devicePixelRatio=3 | 渲染清晰无锯齿 |
| # | 用例 | 输入 | 预期结果 |
|---|---|---|---|
| 4.1 | 正常请求 | 完整chartData + name | code=0, 6段解读字符串非空 |
| 4.2 | 缺少positions | {} | code=400, error="缺少命盘数据" |
| 4.3 | LLM超时 | 模拟超时 | 触发_fallbackReading降级解读 |
| 4.4 | LLM返回非JSON | 非法响应 | code=0, mainCharacter=原始文本 |
| 4.5 | LLM返回JSON in markdown | json ... |
正确解析JSON内容 |
| 4.6 | 缓存读取 | 第二次请求同命盘 | 不走云函数,从本地存储读取 |
| # | 用例 | 步骤 | 预期结果 |
|---|---|---|---|
| 5.1 | 未登录跳转支付 | 未登录用户点击订阅 | 引导登录或正常跳转 |
| 5.2 | 支付loading | 点击"立即开通" | 按钮变为loading状态,不可重复点击 |
| 5.3 | 支付成功 | 模拟支付成功回调 | role→practitioner, expireAt→+1年 |
| 5.4 | 支付后推广码 | 支付成功后的checkSession | referralCode非空(6位) |
| 5.5 | 支付取消 | 用户取消支付 | 停留在当前页,角色不变 |
| 5.6 | 支付失败 | 模拟支付失败 | 显示"支付失败,请重试" |
| 5.7 | 功能对比表 | 订阅页内容 | 正确展示免费vs能量师差异 |
| 5.8 | 价格显示 | 订阅页 | ¥398/年,¥1.09/天正确 |
| # | 用例 | 步骤 | 预期结果 |
|---|---|---|---|
| 6.1 | 推广码自动生成 | 支付成功后 | 6位字母+数字唯一码 |
| 6.2 | 推广码持久化 | 重新登录 | 推广码不变 |
| 6.3 | 分享卡片携带ref | 能量师分享 | path包含?ref=CODE |
| 6.4 | 推广链接打开参数 | onLoad(options) | 正确读取ref并缓存 |
| 6.5 | 注册时绑定上级 | 新用户带ref注册 | invitedBy=上级openid |
| 6.6 | 上级统计更新 | 新用户注册 | directCount+1 |
| 6.7 | 关系终身锁定 | 第二次通过他人链接注册 | 不覆盖原有invitedBy |
| 6.8 | 自邀请不绑定 | 自己扫自己的码 | invitedBy为空 |
| 6.9 | 一级佣金结算 | 下级付费¥398 | 佣金=¥119.4, status=available |
| 6.10 | 二级佣金结算 | 下级的下级付费 | 佣金=¥39.8, status=available |
| 6.11 | 佣金取值精确 | 浮动计算 | 两位小数精确 |
| 6.12 | 佣金状态流转 | pending→available→completed | 按业务规则流转 |
| 6.13 | 提现条件验证 | 可提现金额<¥100 | "申请提现"不可点击 |
| 6.14 | 提现申请提交 | 金额合法 | 记录创建status=pending |
| 6.15 | 提全额按钮 | 点击"全部提现" | 输入框填充可提现金额 |
| 6.16 | 超额提现拦截 | 输入>可提现 | 提示"超出可提现金额" |
| # | 用例 | 步骤 | 预期结果 |
|---|---|---|---|
| 7.1 | 微信登录 | 点击微信登录 | 获取用户信息,创建/查询用户 |
| 7.2 | 重复登录 | 同一用户再次登录 | 返回isNew=false |
| 7.3 | 登录后状态持久化 | 关闭重开小程序 | token有效时自动登录 |
| 7.4 | 会话过期 | token无效 | 自动跳转为未登录状态 |
| 7.5 | 历史列表显示 | 个人中心页 | 按时间倒序,显示姓名/生日/主性格 |
| 7.6 | 历史点击跳转 | 点击历史记录 | 跳转到对应chart页 |
| 7.7 | 免费用户7天限制 | 8天前的记录 | 不显示 |
| 7.8 | 能量师全部历史 | 所有记录 | 全部显示 |
| 7.9 | 历史记录超100条 | 生成101+命盘 | 仅保留最近100条 |
| 7.10 | 订阅状态显示 | 个人中心 | 能量师显示"已开通"+到期日 |
| # | 用例 | 预期结果 |
|---|---|---|
| 8.1 | 年月日全部为空 | 提示填写完整日期 |
| 8.2 | 年份=1899 | 日期选择器不可选 |
| 8.3 | 年份=2100 | 不可选(超过当前年份) |
| 8.4 | 月份=0 | picker限制不可选 |
| 8.5 | 月份=13 | picker限制不可选 |
| 8.6 | 日期=0 | picker限制不可选 |
| 8.7 | 日期=32 | picker限制不可选 |
| 8.8 | 闰年2/29 | 合法输入,正常计算 |
| 8.9 | 非闰年2/29 | picker不可选 |
| 8.10 | 姓名20字符 | 截断处理 |
| 8.11 | 姓名全空格 | 显示"未知" |
| 8.12 | 姓名特殊字符 | 正常显示 |
| 8.13 | 命盘id含特殊字符 | 能正确查找 |
| 8.14 | 弱网场景(3G模拟) | 云函数超时能有降级UI |
| 8.15 | 断网场景 | 提示网络错误,不崩溃 |
| 8.16 | 存储空间满 | 存储失败时的降级 |
| # | 检查项 | 通过标准 |
|---|---|---|
| 9.1 | 首页文案 | 不含"算命、占卜、预测、占星" |
| 9.2 | AI解读免责声明 | 末尾包含"本解读由AI生成,仅供参考" |
| 9.3 | 用户协议链接 | 可点击,打开的页面有效 |
| 9.4 | 隐私政策链接 | 可点击,打开的页面有效 |
| 9.5 | 不得收集敏感信息 | 无身份证/银行卡输入 |
| 9.6 | 支付合规 | 微信支付规范无违规文案 |
| 9.7 | 分销合规 | 两级分销,无团队计酬,无入门费 |
| 项目 | 配置 |
|---|---|
| 微信基础库 | 3.7.1+ |
| iOS | iPhone 13/14/15, iOS 16+ |
| Android | 华为/小米/OPPO, Android 12+ |
| 微信版本 | 8.0+ |
| 云开发环境 | test/dev独立环境(非production) |
| 测试账号 | 至少3个:普通用户A、能量师B、普通用户C(从B邀请注册) |
| 等级 | 定义 | 响应时间 |
|---|---|---|
| S0-Critical | 核心链路阻塞(无法生成命盘/支付/解读) | 立即修复 |
| S1-Major | 功能严重异常(计算错误/状态错乱/数据丢失) | 24h内 |
| S2-Minor | 功能可用但体验缺陷(UI错位/文案错误) | 下一迭代 |
| S3-Trivial | 视觉/文案微调建议 | 积攒修复 |