后端: - 新增 celery_health 生成前置闸——无 worker 在线时图片/视频生成入口 一律 503,防"提交到 ARK 后无人轮询、结果悬空+额度冻结"的数据丢失 - 拼接导出:帧率跟随源众数、字幕逐句重映射、原声/BGM 混音修复 - 资金核算审计脚本 + genesis 账目回填 + 滞留预留清理命令 - 接入 yunqi provider 与豆包 TTS 模型(catalog/migrations/bootstrap 命令) 前端:全站页面更新(pipeline/library/products/projects/team/account 等), 新增共享 pager 分页组件 QA:刷新 function-audit 全量输出,新增 full-qa 报告 文档:BP 产品介绍资料、design/CLAUDE.md Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
7.5 KiB
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 凭证(可从首条对账) | ✅ 修复后全过 |
结论:金额核算零错误。 每个账户余额、冻结、逐笔差分账都精确自洽,无多扣/少扣/重复扣/冻结泄漏。
审计中查实的两件事
-
历史双扣(已自愈,账平):
E2E 桥接测试团队task8b9745b8在 2026-06-10 03:08:25 同秒两条 ¥1 扣费(并发竞态历史脏数据),但 06:32 已有一条adjustment +¥1回冲,净扣 ¥1=预留 ¥1。当前charge_reserved_credit已加select_for_update锁内重读幂等,不会复发。 -
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)出图出片未联网触发。