Some checks failed
CI / E2E Tests (push) Has been cancelled
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
T4 Classroom (health 70→75, +5): - M11-01 P1 blocking_lock 已修复 (try_lock) - M11-02 P1 map_err 已修复 - M11-03 P1 持久化已修复 (SQLite) - M11-06 Date.now→crypto.randomUUID 已修复 - NEW P1: GenerationPipeline 硬编码 model="default" 导致课堂生成 404
5.2 KiB
5.2 KiB
T4 课堂系统 测试报告
执行日期: 2026-04-05 | 测试工具: tauri-mcp execute_js + 代码审查 | V12 基线: 70/100
摘要
- 执行用例数: 7/12(5 个需已生成课堂数据,因 P1 缺陷无法执行)
- 代码审查确认: 8 项 V12 问题验证
- 已修复: 4 ✅
- 未修复: 3 ⚠️
- 新发现缺陷: 1 (P1)
缺陷统计
| 级别 | 数量 | 说明 |
|---|---|---|
| P0 | 0 | - |
| P1 | 1 | GenerationPipeline 硬编码 model="default",SaaS relay 404(新发现) |
| P2 | 2 | LLM 失败无 placeholder 标记; 生成完成强制打开 player |
| P3 | 2 | HTML export 内容不完整; 白板两套渲染实现未统一 |
V12 已知问题验证
| V12 ID | 描述 | V12 严重度 | 验证结果 | 备注 |
|---|---|---|---|---|
| M11-01 | is_cancelled() blocking_lock 死锁 | P1 | ✅ 已修复 | generate.rs:141-147 改用 try_lock(),避免 tokio 死锁 |
| M11-02 | LLM 调用无 map_err | P1 | ✅ 已修复 | mod.rs:431-434 已加 .map_err,错误正确传播 |
| M11-03 | 课堂数据仅存内存 | P1 | ✅ 已修复 | persist.rs 实现了 SQLite 持久化(classrooms.db) |
| M11-04 | LLM 失败静默 fallback | P2 | ⚠️ 未修复 | chat.rs:82-93 LLM 失败 fallback 到 placeholder 无标记 |
| M11-05 | 生成完成强制打开 player | P2 | ⚠️ 未修复 | classroomStore.ts:124 无条件 classroomOpen: true |
| M11-06 | Chat Message ID 用 Date.now() | P2 | ✅ 已修复 | classroomStore.ts:176 使用 crypto.randomUUID() |
| M11-07 | 白板两套渲染实现 | P3 | ⚠️ 未修复 | SceneRenderer 内嵌 SVG + WhiteboardCanvas.tsx 独立组件 |
| M11-08 | HTML export 内容不完整 | P3 | ⚠️ 未修复 | export.rs:97-103 只渲染 title+type+duration,缺 key_points/notes |
测试用例详细结果
❌ TC-4-01 | 课堂生成(正常)
结果: FAIL(新发现 P1 缺陷)
Error: Outline generation failed: LLM error: API error 404 Not Found:
{"error":"NOT_FOUND","message":"未找到: 模型 default 不存在或未启用"}
根因: zclaw-kernel/src/generation/mod.rs:416 — CompletionRequest 硬编码 model: "default",SaaS relay 需要实际模型名(如 glm-4-flash)。Kernel driver 返回模型配置但 GenerationPipeline 未使用。
影响: 课堂生成完全不可用。
✅ TC-4-02 | M11-01 验证: blocking_lock 死锁
结果: PASS(已修复,代码审查确认)
generate.rs:141-147 使用 try_lock() + Err(_) fallback,不会阻塞 tokio runtime。
✅ TC-4-03 | M11-02 验证: LLM 无 map_err
结果: PASS(已修复,代码审查确认)
mod.rs:431-434 .map_err(|e| ZclawError::LlmError(...)),Stage 1/2 均有 .map_err。
⏭️ TC-4-04~TC-4-09 | 场景播放/TTS/白板/持久化/聊天/导出
结果: SKIP
依赖课堂生成成功。因 TC-4-01 P1 缺陷,无法执行端到端测试。
✅ TC-4-07 | M11-03 验证: 课堂数据持久化(代码审查)
结果: PASS(已修复)
classroom_commands/persist.rs: SQLite 持久化实现完整- DB 路径:
{app_data_dir}/classroom/classrooms.db - 表:
classrooms+classroom_chats - 生成/聊天后自动保存(generate.rs:223, chat.rs:108)
✅ TC-4-10 | M11-04 验证: LLM 失败静默 fallback(代码审查)
结果: FAIL(未修复)
chat.rs:82-93:
let agent_responses = match generate_llm_responses(...).await {
Ok(responses) => responses,
Err(e) => {
tracing::warn!("LLM chat generation failed, using placeholders: {}", e);
generate_placeholder_responses(...) // 无 isPlaceholder 标记
}
};
✅ TC-4-11 | M11-05 验证: 生成完成强制打开(代码审查)
结果: FAIL(未修复)
classroomStore.ts:124:
set({ classroomOpen: true }); // 无条件设置,不检查用户是否手动关闭
✅ TC-4-12 | classroom_list/classroom_get 基本验证
结果: PASS
classroom_list→[](空列表,正确)classroom_get("nonexistent-id")→"Classroom 'nonexistent-id' not found"(错误信息明确)
新发现问题
| TC-ID | 描述 | 场景类型 | 优先级 | 状态 |
|---|---|---|---|---|
| TC-4-D01 | GenerationPipeline 硬编码 model="default",SaaS relay 404 | 正常 | P1 | 新发现 |
TC-4-D01 详情:
- 文件:
crates/zclaw-kernel/src/generation/mod.rs:416和:490 CompletionRequest { model: "default".to_string(), ... }— SaaS relay 需要实际模型名- 修复建议: 从 kernel config 获取
llm.model字段传入 GenerationPipeline
健康度评估
| 维度 | V12 基线 | 本次评估 | 变化 |
|---|---|---|---|
| 综合 | 70/100 | 75/100 | +5 |
提升原因:
- M11-01 P1 死锁风险已修复(try_lock)
- M11-02 P1 LLM 错误处理已修复(map_err)
- M11-03 P1 数据持久化已修复(SQLite)
- M11-06 Chat ID 碰撞已修复(crypto.randomUUID)
残留风险:
- P1: GenerationPipeline 硬编码 "default" 模型 → 课堂生成完全不可用
- P2: LLM 失败 placeholder 无标记(M11-04)
- P2: 生成完成强制打开 player(M11-05)