Appearance
QA 要点:对话画像提案 + 全项目回归清单
面向测试同学:功能说明、专项用例与全站回归要点。实现细节见 modules/frontend.md、modules/sse.md、modules/backend.md、modules/api_routes.md。
文档结构
| 章节 | 范围 |
|---|---|
| 下文「功能要点」至「TC-7」 | 仅对话结束后 profileProposal(画像/人脉提案) |
| 「全项目 QA 回归清单」 | 认证、人脉、对话通用能力、策略、订阅、国际化、页面、健康检查等 |
功能要点
- 触发时机 用户在 对话页 发送消息,流式回复正常结束后,若服务端在 最后一条 SSE(
done: true)里带上profileProposal,前端会进入资料更新流程。未点「应用所选」前,服务端不应因该提案单独改库(以实际 API 行为为准:写入仅发生在用户确认的 PUT)。 - 三种
reason
**incomplete_self**:系统认为「我的画像」偏空。- 先出现 居中引导(标题类似「完善画像与档案」)。
- 点「去更新」→ 大卡片刻画确认:仅展示 「我的画像」 侧,包含 全部5 个字段(摘要、目标、沟通风格、边界、补充背景等,与设置页一致)。
- 后端可能只回了少数 LLM 抽取行;弹窗会 拉取当前 self-profile 与 patch 合并,缺省每一行勾选,可「全不选 / 全选」或单项改文案再应用。
**incomplete_person**:认为 当前关联的人脉档案偏空。- 同样 先居中引导,再进确认卡;仅展示 人脉 侧,单人多块时每人一块。
- 字段为产品定义的完整集合(姓名、昵称、关系类型、性别、年龄段、标签、初识场景、现状、工作/教育经历、备注、重要度等)。
- 会 拉取人脉详情(或内存
personMap)补全行;默认全部勾选。
**refinement**:上下文已较完整时的 精炼补充。- 无 居中引导;输入区上方 底部提示条 + 约 30 秒倒计时,可直接打开确认卡。
- 弹窗内容主要为 后端给出的 patch 列表,默认全选(与偏空完整表策略不同)。
- 加载与文案
- 偏空场景打开确认卡时,可能有短瞬间显示 「正在加载完整表单…」(
profileProposalLoading)。 - 偏空场景下另有 完整表单说明(
profileProposalFullFormHint)。
- 应用与取消
- 应用所选:仅对 勾选且 proposed 非空(trim后) 的字段提交(与实现一致:空串行不会作为更新提交)。
- 暂不应用 / 关闭 / 底部条倒计时结束:应 清除待处理提案,不再重复弹出(直至下一轮触发)。
- 国际化
- 界面语言切换中/英后,上述弹窗与引导文案应随
vue-i18n切换;对话回复语言仍由对话locale控制,与本次 UI 无关。
测试前准备
| 项目 | 说明 |
|---|---|
| 账号 | 已登录 Web(http://localhost:3000 或测试环境)。 |
| 数据 A | 画像为空或极短:设置页「我的画像」各字段留空或仅极少字,便于触发 incomplete_self。 |
| 数据 B | 新建人脉:必填项填齐,其它大段文本留空,对话中 关联该人,便于 incomplete_person。 |
| 数据 C | 画像与人脉均较满:用于更容易出现 refinement 与底部条(依赖后端门控,不保证每轮必现)。 |
| 网络 | 可开 DevTools 观察 /api/v1/chat/stream 结束帧是否含 profileProposal。 |
建议用例与步骤
TC-1:incomplete_self 居中引导 + 完整表单
- 使用数据 A;进入对话页,不关联人脉或关联与否均可(以能触发 self 偏空为准)。
- 发送一条与自身相关的消息,等待流结束。
- 预期:出现 居中引导;点「去更新」后出现大卡;仅「我的画像」区块,约 5 个字段均有行;短暂可能出现加载文案。
- 修改其中一行,取消勾选其它行,点「应用所选」。
- 预期:成功提示;设置页「我的画像」与修改一致;未勾选字段不变。
TC-2:incomplete_person 仅人脉、完整字段
- 使用数据 B;对话顶部 关联该人脉。
- 发送描述该人的消息,等待流结束。
- 预期:居中引导 →确认卡中 仅人脉(标题含人名或 ID hint),多个字段行(远不止「备注」一项);
incomplete_self侧不应出现。 - 勾选部分字段修改后应用。
- 预期:人脉详情页字段与提交一致;设置页画像不应被误改。
TC-3:refinement 底部条
- 使用数据 C;完成一轮可触发精炼的对话(若未出现则记录环境/后端配置,非阻塞缺陷需产品确认频率)。
- 预期:无 居中引导;出现 底部提示条 与 倒计时;可点开确认卡;关闭或倒计时结束后提案消失。
TC-4:全选 / 全不选 / 关闭
- 在 TC-1 或 TC-2 的确认卡中点「全不选」,再「应用所选」。
- 预期:无 PUT 或成功但无有效字段(不应误清空已有内容)。
- 点「暂不应用」或关闭弹窗。
- 预期:提案清除,无残留弹层。
TC-5:并发与切换会话
- 在提案未处理时 切换会话或新建会话(按产品预期:通常应清除或仅绑定当前会话;以实际实现为准)。
- 预期:无卡死、无错误 toast;旧提案不应错误套到新会话。
TC-6:中英文
- 顶栏切换 English,重复 TC-1 关键路径。
- 预期:引导与确认卡为英文键对应译文;布局无截断。
TC-7:失败与重试
- 在打开确认卡前用 DevTools 断网 或 模拟 401,再点「应用所选」。
- 预期:失败提示;数据不一致时以服务端为准;恢复网络后可再次从设置/人脉修正。
已知注意点(便于判责)
- 是否弹出提案 由后端门控 + LLM 抽取决定,QA 应用多轮/多数据尝试,避免「未弹出」直接判前端缺陷。
- 默认全选 仅适用于
incomplete_self/incomplete_person展开后的完整表;refinement为 patch 列表默认全选,但字段数量可能较少。 - 重要度 等字段为文本输入数字时,非法值可能不会写入(与
UpdatePersonRequest校验一致)。
全项目 QA 回归清单
路由与权限以 internal/handler/router.go 及 modules/api_routes.md 为准。下列为按模块整理的要点,非穷尽逐字段用例,可在此基础上扩展。
A. 认证与账号
| 要点 | 建议验证 |
|---|---|
| 注册 / 登录 | 合法注册;重复邮箱;错误密码;响应含 accessToken / refreshToken / user |
| 刷新 Token | POST /api/v1/auth/refresh;过期 refresh 行为 |
| OAuth(若环境已配) | Google / WeChat 跳转与回调;取消授权 |
| 用户资料 | GET/PUT /api/v1/auth/profile |
| 我的画像(设置与 API) | GET/PUT /api/v1/auth/self-profile 与对话上下文注入一致 |
B. 人脉
| 要点 | 建议验证 |
|---|---|
| CRUD | 列表分页、搜索、筛选;创建 / 详情 / 编辑 / 删除 |
| 导入 | POST .../import-url、import-text、import-image(大文件/超时/无效内容) |
| 权限隔离 | 用户 A 无法访问用户 B 的 persons/:id(预期 404 或业务错误) |
C. 对话(通用,不含 profileProposal 专项)
| 要点 | 建议验证 |
|---|---|
| 非流式 | POST /api/v1/chat 整包返回 |
| 流式 SSE | POST /api/v1/chat/stream:content 增量、agent 字段、done:true、可选 sessionId;首包前 UI等待态 |
| 停止生成 | 流式中途 Abort,无卡死;会话状态一致 |
regenerate | 请求体 regenerate: true 时重放上一轮用户话并重新生成 |
| 参数 | personIds、scenarioType、model、locale 抽样:回复语言与关联上下文是否合理 |
| 会话管理 | GET/DELETE .../chat/sessions、GET .../sessions/:id、GET .../chat/stats |
| 额度 | 免费「每日首问」、同会话追问上限;策略线程追问;429 与 reason(如 daily_first_messages);设置页与 GET /subscription/usage 展示 |
D. 策略(Strategy)
| 要点 | 建议验证 |
|---|---|
| 三接口 | POST .../strategy/analyze、advise、script |
| 多轮线程 | strategyThreadId 传入与返回;Redis 线程历史是否连贯 |
| 额度 | 与对话类似的追问/首问策略(以当前后端为准) |
locale | 回复语言与界面语言独立时的表现 |
E. 订阅
| 要点 | 建议验证 |
|---|---|
| 用量 | GET /api/v1/subscription/usage 与额度消耗一致 |
| Mock 升级 | 仅演示环境:mock-activate 后付费额度或标识变化 |
F. 国际化与外观
| 要点 | 建议验证 |
|---|---|
| 界面语言 | 顶栏 zh/en;MainLayout / Settings / 对话关键文案无漏翻 |
| 暗色模式 | 切换与刷新后保持 |
| 对话语言 | 与界面语言独立:locale 传后端后回复语言 |
G. 静态页面与导航
| 要点 | 建议验证 |
|---|---|
| Dashboard / Guide | 入口、加载、无控制台错误 |
| 法律页 | Privacy、Terms 可访问 |
| 登录态路由 | 未登录跳转登录;已登录访问 guest 路由行为 |
H. 健康与部署(冒烟)
| 要点 | 建议验证 |
|---|---|
| 探活 | GET /health → code:0 |
| 生产(若测) | 静态资源 try_files;API 反代;SSE proxy_buffering off、长连接 |
I. Electron 桌面壳(可选)
| 要点 | 建议验证 |
|---|---|
| 开发 | pnpm dev:desktop:Vite 3000 与壳一致 |
| 安装包 | pnpm build:desktop 或 pack 后启动;file:// 下路由为 hash |
J. 可观测与后端行为(可选)
| 要点 | 建议验证 |
|---|---|
| Langfuse | 开启配置时 trace 是否入库(非功能阻断) |
| 情绪快照 | 对话结束后 DB emotion_snapshots是否有新行(非 Mock 时) |
相关文件(研发自测 — 画像提案专项)
| 区域 | 路径 |
|---|---|
| 弹窗合并逻辑 | frontend/apps/web/src/components/chat/ProfileProposalModal.vue |
| 引导 / 底部条 | frontend/apps/web/src/views/chat/ChatView.vue |
| 文案 | frontend/apps/web/src/locales/zh.json、en.json(chat.profileProposal* 等) |
| SSE 类型 | frontend/packages/shared 中 ProfileProposal 等 |
| 后端模型 | backend/internal/model/profile_proposal.go |
全接口对照:modules/api_routes.md · 产品进度:progress.md