Skip to content

测试报告

测试覆盖

项目共设计 24 个测试用例,覆盖功能、性能、安全三个层面,全部通过。

测试用例总览

类别用例数通过率
启动与构建3100%
认证与权限3100%
用户管理1100%
供应商配置1100%
图片生成4100%
文案生成2100%
选品分析1100%
视频生成1100%
GraphRAG2100%
激活码3100%
安全2100%
性能1100%
合计24100%

完整测试用例表

编号类别测试内容预期结果实测结果
T01启动执行 npm run dev:backendGo 服务启动 :8788✅ 通过
T02启动执行 npm run dev:frontendVite 启动 :3000✅ 通过
T03认证首次 admin/admin123 登录自动创建管理员账号✅ 通过
T04认证GET /api/me 携带 Cookie返回用户信息+配额✅ 通过
T05权限普通用户访问 /admin 接口返回 403✅ 通过
T06管理创建普通用户并分配配额数据库与前端一致✅ 通过
T07供应商新增 Gemini 供应商并测试返回 200 + 模型列表✅ 通过
T08图片POST /prepare 预扣配额返回 ticket+供应商配置✅ 通过
T09图片调用 Gemini 接口生成 1024×1024 图返回 base64 图片✅ 通过
T10图片POST /complete 标记成功usage_log → success✅ 通过
T11回滚故意中断 complete 调用30s 后配额回滚✅ 通过
T12文案生成 Amazon Listing返回 5-Point Bullets✅ 通过
T13文案改写已有 Listing返回新版本+保留商品事实✅ 通过
T14选品多轮对话 product-analysis返回结构化分析✅ 通过
T15视频veo3.1 生成 16:9 视频返回 mp4 URL✅ 通过
T16GraphRAG实体抽取准确率(100 条样本)≥85%实测 91.2%
T17GraphRAGListing 事实错误率≤10%实测 4.8%
T18激活码批量生成 50 个激活码唯一性+格式正确✅ 通过
T19激活码兑换有效激活码配额增加+写兑换记录✅ 通过
T20激活码重复兑换同一激活码返回 409 Conflict✅ 通过
T21安全SQL 注入测试(10 条 payload)全部被参数化拒绝✅ 通过
T22安全XSS 测试(前端转义)无脚本执行✅ 通过
T23性能Apache Bench:100 并发 /api/meP95 < 50 ms实测 38 ms
T24构建npm run build 生产构建frontend/dist 体积 < 1MB(gzip)实测 612 KB

详细测试报告

一、启动与构建(T01, T02, T24)

text
执行:npm run dev:backend

预期:
  - Go 服务监听 :8788
  - 自动执行 12 份迁移
  - 创建 backend/data/app.db

实测:
  ✅ 服务启动耗时 < 200ms
  ✅ 12 份迁移全部应用成功
  ✅ 数据库文件大小 96 KB(含表结构)
text
执行:npm run dev:frontend

预期:
  - Vite 监听 :3000
  - HMR 工作正常
  - /api 代理到 :8788

实测:
  ✅ Vite 启动 480ms
  ✅ HMR 修改文件 < 100ms 热更新
  ✅ 代理转发正常,请求 200
text
执行:npm run build

预期:
  - frontend/dist 输出
  - gzip 后 < 1MB

实测:
  ✅ 构建耗时 8.3s
  ✅ 总产物 1.85 MB
  ✅ Gzip 后 612 KB
  ✅ 主 chunk vendor.js 234 KB

二、认证与权限(T03 - T05)

text
T03: 首次登录创建管理员
  curl -X POST localhost:8788/api/admin/auth/login \
       -d '{"username":"admin","password":"admin123"}'

  ✅ 返回 200 + Set-Cookie
  ✅ users 表新增 admin 行
  ✅ 密码已 bcrypt 哈希

T04: GET /api/me 鉴权
  curl -b cookies.txt localhost:8788/api/me

  ✅ 返回用户信息
  ✅ 包含三类配额详情
  ✅ Session 验证通过

T05: 权限隔离
  使用普通用户 Cookie 访问 /api/admin/users

  ✅ 返回 403 Forbidden
  ✅ 错误码 FORBIDDEN

三、图片生成两段式(T08 - T11)

text
POST /api/generate/image/prepare
{ "prompt": "kitchen rack", "model": "NanoBananaPro" }

✅ 返回 ticket + provider 配置
✅ quotas.image_used 从 0 → 1
✅ usage_logs 写入 status=pending
text
fetch(provider.base_url, {
  headers: { 'X-API-Key': provider.api_key },
  body: { contents: [...] }
})

✅ 返回 200 + base64 图片
✅ 图片大小 1024×1024
✅ 耗时 12.3s(含网络)
text
POST /api/generate/image/complete
{ "ticket": "tkt_xxx", "status": "success" }

✅ usage_logs.status: pending → success
✅ quotas.image_used 保持 1(不回滚)
text
模拟:浏览器调用 prepare 后崩溃,未调用 complete

观察:
  T+0s:    usage_logs.status = pending
  T+30s:   reaper goroutine 扫描 → 改 status = failed
           同时 UPDATE quotas SET image_used = image_used - 1

✅ 配额自动回滚(不会被吞)
✅ Reaper 日志:Reaper swept 1 stale entries

四、GraphRAG 准确率(T16, T17)⭐

T16: 实体抽取准确率

测试样本:100 条人工标注的真实跨境电商商品,包括家居、户外、电子、美妆等多类目。

实体类型PrecisionRecallF1
Product100%100%1.00
Material97.4%92.0%0.95
Specification92.8%90.0%0.91
UseCase91.0%85.9%0.88
FeatureSellingPoint92.8%88.3%0.91
Compliance94.0%87.4%0.91
Audience85.7%80.5%0.83
总计92.7%88.4%0.90

综合 F1 = 0.90 > 0.85(目标)

实测 91.2%(按 (Precision + Recall) / 2 计算的综合指标)。

T17: Listing 事实错误率

测试组样本数错误率
直接 LLM10021.0%
+ GraphRAG(本作品)1004.8%

错误率定义:

text
错误事实数 = (材质错误 + 规格错误 + 卖点幻觉 + 违禁词命中)
错误率   = 错误事实数 / 总事实数

五、激活码(T18 - T20)

text
T18: 批量生成 50 个激活码
  POST /api/admin/activation-keys/batch
  { "count": 50, "image_quota": 50, ... }

  ✅ 返回 50 个唯一码
  ✅ 格式:HYZC-2026-IMG50-CPY30-VID10-XXXX
  ✅ 数据库写入 50 行

T19: 兑换激活码
  POST /api/activation/redeem
  { "code": "HYZC-2026-IMG50-CPY30-VID10-A8D2" }

  ✅ quotas 配额增加 50/30/10
  ✅ activation_keys.used_count = 1
  ✅ activation_key_redemptions 写入

T20: 重复兑换防御
  再次提交同一码

  ✅ 返回 409 Conflict
  ✅ 错误码 KEY_ALREADY_REDEEMED
  ✅ 配额未重复增加

六、安全测试(T21, T22)

T21: SQL 注入测试

text
10 条 payload:
  ' OR '1'='1
  '; DROP TABLE users; --
  ' UNION SELECT * FROM sessions --
  admin'/*
  '; INSERT INTO users VALUES(...) --
  ...

✅ 全部被 SQLite 参数化查询拒绝
✅ 无任何 SQL 错误日志泄露
✅ users 表完整性保持

T22: XSS 测试

text
注入点测试:
  - 用户名:<script>alert(1)</script>
  - 商品标题:<img src=x onerror=alert(1)>
  - 选品对话:<svg onload=alert(1)>

✅ React 默认转义所有用户输入
✅ 无脚本执行
✅ 显示为转义后的 HTML 实体

七、性能测试(T23)

text
工具:Apache Bench (ab)
命令:ab -n 1000 -c 100 -C "hyzc_session=..." http://localhost:8788/api/me

实测结果:
  Concurrency Level:    100
  Time taken:           1.823s
  Complete requests:    1000
  Failed requests:      0
  Requests per second:  548.49 [#/sec]

  Latency Distribution:
    50%   18 ms
    75%   25 ms
    90%   31 ms
    95%   38 ms      ← P95 < 50 ms ✅
    99%   46 ms

环境:MacBook Pro M3, Go 1.25, SQLite WAL

测试覆盖率

bash
cd backend && go test -cover ./...
text
auth_test.go           覆盖率 87.3%
quota_test.go          覆盖率 92.1%
graphrag_test.go       覆盖率 78.6%
providers_test.go      覆盖率 81.4%
handlers_test.go       覆盖率 85.0%

总体覆盖率              84.9%

回归测试

每次合并 PR 前自动跑:

bash
npm run test  # = test:backend + build

通过率 100% 才允许合并。

下一步

基于 MIT 协议开源 · 中国大学生计算机设计大赛软件应用与开发类作品