# AirShelf/core 全站测试报告 · 2026-06-10 > 依据 `test-agent.md` 四层测试体系(A 代码 → B/E 浏览器 → D 端到端 → C 报告)。 > 数据策略:**全真实数据**(真实后端 127.0.0.1:8010 + 真实 SQLite,禁 mock)。 > 不重新生成视频(用户指定);其余链路全测,含团队 / 成员 / 消费多用户场景。 ## 测试概览 | 层 | 范围 | 结果 | |---|---|---| | A 代码 | 后端 Django test + 前端 tsc + vite build | ✅ 后端 10/10(原 8 + 新增 2 充值权限回归)· tsc 0 错 · build 成功 | | B/E 浏览器 | 登录/工作台/商品/项目/资产/图片生成/团队/消费/消息/设置 + pipeline 五阶段 | ✅ 逐页控制台无 P0 报错,截图人审通过 | | D 端到端 | 多用户(owner+成员)权限 / 数据隔离 / 限额 / 账单归属 | ✅ 发现 1 个 P0 越权 bug 已修 | | E 移动端 | iPhone 13 视口逐页 | ✅ 发现 2 个移动端 bug 已修 | **判定:首轮发现 9 个 bug(8 修复 + 1 确认非缺陷),全部复验通过。** --- ## Bug 清单(全部已修复并复验) | # | 严重度 | 类型 | 描述 | 定位 | 复验 | |---|---|---|---|---|---| | 1 | **P0** | 权限越权 | **普通成员能给团队充值**:`POST /api/billing/recharge/` 只校验登录不校验角色,成员调用返回 201 并真实加钱(实测余额 ¥14906→¥15006) | `apps/billing/views.py:recharge` | 成员调用→403;owner→201;加回归测试 2 条 | | 2 | P1 | 功能缺失 | **设置页「退出登录」点确认无反应**:`onLogout` 没从 App 传进 SettingsPage,确认按钮只关弹窗不退登 | `App.tsx` + `routes/settings.tsx` | 确认→清 token→跳 /login ✓ | | 3 | P1 | 移动端可用性 | **窄屏无法导航**:`@media(max-width:1100px)` 把侧栏和收窄键都 `display:none`,移动端没有任何菜单入口 | `design-restraint.css` + `components/app-shell.tsx` | 新增汉堡键+抽屉+遮罩,点导航跳转并自动收起 ✓ | | 4 | P1 | 移动端布局 | **宽数据表被裁切**:项目列表(715px)/成员表/账单表在窄屏溢出且无横向滚动,右侧列(状态/操作)点不到 | `design-restraint.css` + projects/team/account.tsx | 包 `overflow-x:auto` 容器,表内横向滚动,页面不再侧滑 ✓ | | 5 | P2 | 文案 | **登录失败提示英文**:错误密码/空提交弹后端原文 `invalid credentials` | `routes/auth-screen.tsx` | 映射成「邮箱或密码不正确」✓ | | 6 | P2 | 安全/体验 | **登录页预填设计稿假账号** `li@shop.com / demo-1234`,真实环境误导 | `routes/auth-screen.tsx` | 字段从空开始 + 前端必填校验 ✓ | | 7 | P2 | 体验 | **新建项目默认名固定 v1**:连建多个项目重名,易混淆 | `routes/projects.tsx` | 按已有项目自动递增 v1→v2…实测「南卡·痛点种草·v2」✓ | | 8 | P2 | 体验 | **慢操作无反馈**:新建项目「开始」、上传资产「上传资产」按钮点击后无 loading 态,用户疑似没点上 | projects.tsx / library.tsx | 加「创建中…」「上传中…」禁用态 ✓ | | 9 | P2 | 体验 | **建成员失败丢表单**:用户名重复等失败时弹窗仍关闭并清空,要重填 | `routes/team.tsx` | 失败保留弹窗与已填内容,仅成功才清 ✓ | > 移动端统计卡标签竖排("总/项/目")一并修复(加 `.stat .lbl { white-space: nowrap }`)。 --- ## D 层 · 多用户 / 消费链路验证(真实数据) | 验证项 | 方法 | 结果 | |---|---|---| | 建成员 | 团队页创建 `qa-member-0610`,月限额 ¥1 | ✅ 落库,成员表出现 | | 成员登录 | 该成员凭证登录 | ✅ 进工作台,身份=成员、团队=同团队 | | 数据共享(同团队) | 成员可见团队 8 商品 | ✅ TeamScopedViewSetMixin 按 team 过滤 | | 数据隔离(跨团队) | 各团队 product/project queryset 按 team 隔离 | ✅ 结构性强隔离 | | 权限·改他人限额 | 成员 PATCH owner 限额 | ✅ 403 | | 权限·建成员 | 成员 POST members | ✅ 403 | | 权限·充值 | 成员 POST recharge | ❌→✅ **修复前 201(bug#1),修复后 403** | | 月限额拦截 | `_enforce_member_monthly_limit` 限额 ¥1 | ✅ ¥1 任务放行、¥2 拦截 | | 账单归属 | ledger 带 `user`/`user_label`,成员列消费可追溯 | ✅ 每笔扣费挂触发人 | 测试数据已清理:QA 成员已删、误充 ¥100 已回退(余额复原 ¥14906)、QA 测试商品/项目/音频资产均删除。 --- ## A 层 · 代码测试输出 ``` 后端:python manage.py test --settings=airshelf.settings.test Ran 10 tests — OK(新增 RechargePermissionTests: owner 可充值 / 成员 403 余额不变) 前端:tsc --noEmit → 0 errors vite build → 成功 ``` ## 环境 | 服务 | 状态 | 说明 | |---|---|---| | 后端 Django | ✅ 127.0.0.1:8010 | .venv/bin/python · SQLite · StatReloader 热载 | | 前端 Vite | ✅ 127.0.0.1:5173 | 真实 /api 代理 | | Playwright | ✅ headed chromium | MCP 驱动,iPhone 13 视口测移动端 | --- ## 资金核算深度审计(2026-06-11 补) > 用户追问"数据流转、金额核算有没有出错"。写了核算审计脚本 `qa/audit_billing.py`,对真实 DB **17 个团队账户**逐条验证 8 项账目不变量。 | 不变量 | 含义 | 结果 | |---|---|---| | I1 余额=流水终点 | `account.balance` == 末条动账流水 `balance_after` | ✅ 全过 | | I2 冻结自洽 | `reserved_balance` == Σ(ACTIVE 预留) | ✅ 全过 | | I3 非负&可用 | balance/reserved ≥ 0 且 balance ≥ reserved | ✅ 全过 | | I4 预留闭环 | reservation 状态与扣费/释放流水一致,扣费 ≤ 预留 | ✅ 全过 | | I5 失败不扣费 | 失败/取消 task 的预留不得为 CHARGED | ✅ 全过 | | I6 无重复扣费 | 同 task 不得多扣(净额=预留) | ✅ 全过 | | **I7 逐笔差分自洽** | **每条 `balance_after` == 前一条 ± 本笔金额** | ✅ 全过 | | I8 流水完整 | 开户额度有 genesis 凭证(可从首条对账) | ✅ 修复后全过 | **结论:金额核算零错误。** 每个账户余额、冻结、逐笔差分账都精确自洽,无多扣/少扣/重复扣/冻结泄漏。 ### 审计中查实的两件事 1. **历史双扣(已自愈,账平)**:`E2E 桥接测试团队` task `8b9745b8` 在 2026-06-10 03:08:25 同秒两条 ¥1 扣费(并发竞态历史脏数据),但 06:32 已有一条 `adjustment +¥1` 回冲,净扣 ¥1=预留 ¥1。当前 `charge_reserved_credit` 已加 `select_for_update` 锁内重读幂等,不会复发。 2. **Bug #10(P1 可审计性)· 开户赠送额度不进流水**:注册开户(`accounts/serializers.py`)给 `DEFAULT_TRIAL_CREDITS` 试用额度直接写进 `balance`,**不记任何 ledger**。后果:这笔钱在账单流水里查无凭证,无法对账、无法向用户解释余额来源(17 个账户全中)。 - **余额数字本身没错**(初始额度 + 流水净额 = 真实余额,逐团队核对分毫不差),纯属可审计性缺陷。 - **修复**:开户时补记一条 `recharge` 赠送流水(`balance_after`=赠送额),加回归测试 `test_register_trial_grant_is_recorded_in_ledger`;历史 17 个账户用 `qa/backfill_genesis_ledger.py` 回填 genesis 凭证(**只补凭证,不动余额**)。回填后审计 I8 全过。 > 复跑审计:`cd backend && DJANGO_SETTINGS_MODULE=airshelf.settings.development .venv/bin/python ../qa/audit_billing.py` → `✓ 全部账户账目自洽,无金额核算错误`。后端测试 11/11。 --- ## 遗留 / 未测(用户指定跳过) - **视频生成 / 拼接导出**:用户指定不重跑。pipeline 五阶段页面渲染、弹窗、控制台已查,生成动作本身未触发。 - 真实第三方(火山 ARK / TOS)出图出片未联网触发。