Repository navigation
test: 教师 AI 建议接入真实入口集成测试,并补异步任务失败兜底 - #74
Merged
XiaoCow666 merged 2 commits intoSep 26, 2026
Merged
XiaoCow666 merged 2 commits into
XiaoCow666 merged 2 commits into
Conversation
新增 tests/test_teacher_advice_integration.py:经真实 HTTP SSE 路由断言 XiaoCow666#70 的低分口径说明与历史综合分送达 LLM,验证旧功能(落地页/SSE协议/状态接口/持久化)可用,并覆盖流式失败/不可用走规则兜底。generate_class_suggestions_async 增加外层异常保护:工作线程保护范围外错误原先杀死线程、记录永久 pending,现正式账户把 pending/processing 标记 failed,demo 账户走 _mark_demo_suggestion_failed。
XiaoCow666
reviewed
Sep 26, 2026
XiaoCow666
left a comment
Owner
There was a problem hiding this comment.
CodeSense 自动评审
当前无法完成可靠的代码审查:GitHub 返回 503,实际 diff 不可用。PR 描述中的测试结果可作为提交者声明,但不足以在未查看改动的情况下批准代码变更。
需要先处理的问题
- 无法审查新增集成测试及 services/teacher_ai_advisor.py 的实际实现,因此无法确认异步失败兜底是否会正确更新状态、是否引入回归,也无法核对测试断言覆盖的真实入口。
请按下面的步骤修改
- 位置:PR diff;现在:GitHub 返回 503,当前事件仅提供变更文件统计和 PR 描述,无法查看具体补丁;改成:提供可访问的完整 diff,或重新触发包含这两个文件补丁的审查事件;交给 AI:请重新加载并审查 tests/test_teacher_advice_integration.py 与 services/teacher_ai_advisor.py 的完整 diff,并在确认无阻塞问题后运行可用的相关检查。
已有验证信息
- PR 描述声称 pytest tests/test_teacher_advice_integration.py -q:5 passed。
- PR 描述声称 pytest tests/test_teacher_advice_integration.py tests/test_teacher_ai_suggestions.py -q:13 passed in 40.28s。
- PR 描述声称 pytest tests/ -q:871 passed in 991.27s;这些结果未在当前事件中独立执行或验证。
评审事件:a4379610-b94e-11f1-8775-52bc114e926d
Contributor
Author
|
感谢审查。503 是 GitHub 的临时故障,与改动无关。完整 diff 可通过以下永久链接获取(无需登录即可查看原始补丁):
请在 GitHub 恢复后重新触发审查事件,或直接基于 |
XiaoCow666
approved these changes
Sep 26, 2026
XiaoCow666
left a comment
Owner
There was a problem hiding this comment.
CodeSense 自动评审
未发现会导致安全风险、数据损坏、明显回归或无法运行的阻塞问题,异步任务异常兜底与真实入口集成测试均覆盖了 PR 目标。根据 PR 提供的检查证据,新增测试、相关回归测试及全量测试均通过。
已有验证信息
- PR 提供证据:pytest tests/test_teacher_advice_integration.py -q,5 passed。
- PR 提供证据:pytest tests/test_teacher_advice_integration.py tests/test_teacher_ai_suggestions.py -q,13 passed in 40.28s。
- PR 提供证据:pytest tests/ -q,871 passed in 991.27s。
评审事件:986641d0-b9ba-11f1-9fbf-c5bd02d35d32
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
背景
阶段十四(#70,已合并)修复了教师 AI 周报"低分标签 + 最近得分100 → 误报数据异常"的问题:新增纯函数
utils/teacher_advice_prompt.py,给 prompt 补低分标签口径说明、给学生数据补历史综合分。但 #70 的测试全部停在 纯函数单元层 ,没有证明这些内容真的随 真实 HTTP 入口 送达 LLM。本 PR 把改进接入真实使用路径:通过真实入口做集成验证,并补上异步入口缺失的失败兜底。
真实入口(集成范围)
教师路径的真实链路:
1
2
3
4
GET /teacher/ai_suggestions 落地页(只读渲染) └─ GET/POST /api/teacher/stream_suggestions SSE 流式生成(首次生成唯一路径) POST /api/teacher/generate_suggestions 刷新按钮 → 后台线程异步生成 GET /api/teacher/suggestion_status/<class_id> 前端轮询状态集成测试全部通过
app.test_client()驱动上述 HTTP 路由,临时 SQLite、无网络/Redis。变更范围
仅 2 个文件,不涉及 DB 结构、权限、安全策略、部署配置:
tests/test_teacher_advice_integration.py(5 个集成测试)test_real_sse_entry_delivers_risk_tag_caliber_to_llm:用捕获 messages 的 FakeLLM 走真实 SSE 路由,断言 system prompt 含低分口径说明("历史综合分"/60),孙三型学生行同时含历史综合分 44、最近一次 100 和"低分标签来自历史综合分"标注,且request_kind="interactive"。test_real_sse_entry_completes_persists_and_page_still_renders:SSE 协议 status→start→done 完整、记录持久化、落地页 200、状态接口正常。test_sse_stream_error_falls_back_without_stuck_processing:流式 LLM 抛错时规则引擎兜底,done 收尾,状态为 completed 而非卡在 processing。test_sse_llm_unavailable_uses_rules_fallback:LLM 不可用时同样规则兜底。test_async_entry_unexpected_error_marks_failed:异步工作线程发生保护范围外的意外错误时,状态从 pending 翻成 failed(修复前线程直接死亡、永久 pending)。services/teacher_ai_advisor.py:generate_class_suggestions_async增加外层兜底 。generate_class_suggestions自身已捕获业务异常并标记 failed;但工作线程内若发生其保护范围之外的错误(如应用上下文异常),异常会杀死线程,记录永久停在 pending、前端轮询无法收口。现统一捕获:正式账户把 pending/processing 翻成 failed(不回退已完成结果);demo 账户走_mark_demo_suggestion_failed;清理本身再失败仅记日志,不向外抛。验证(实际执行结果)
环境:仓库内隔离 venv
.tmp_pytest_env(未装系统盘),Windows + PowerShell。1
2
pytest tests/test_teacher_advice_integration.py -q 5 passed1
2
pytest tests/test_teacher_advice_integration.py tests/test_teacher_ai_suggestions.py -q 13 passed in 40.28s1
2
pytest tests/ -q 871 passed in 991.27s (0:16:31)可复现命令(任意检出本分支的环境):
PowerShell
运行
1
python -m pytest tests/test_teacher_advice_integration.py -v失败处理说明
失败场景 处理 用户可见结果 流式 LLM 中途异常(非 demo) 捕获并转规则引擎 规则报告 + done,状态 completed 流式 LLM 不可用 规则引擎兜底 规则报告 + done 异步线程意外错误(本 PR 新增) 捕获并标记 failed 轮询得到 failed,可重试,不再永久 pending demo 会话 AI 失败 标记 failed + error 事件 错误提示,可重新进入演示 失败状态清理本身再失败 仅记日志,不外抛 不产生二次异常
事实 / 推断边界
影响范围与后续风险