Skip to content

fix: distinguish unavailable sandbox results - #57

Merged
XiaoCow666 merged 1 commit into
XiaoCow666:mainfrom
ggboyxkw666:fix/student-sandbox-feedback
Sep 18, 2026
Merged

XiaoCow666 merged 1 commit into
XiaoCow666:mainfrom
ggboyxkw666:fix/student-sandbox-feedback

Conversation

@ggboyxkw666

Copy link
Copy Markdown
Contributor

变更摘要

修复学生查看提交结果时的状态提示误导:当 C++ 测试环境不可用时,结果页不再把它显示成“通过 0/N”,而是显示“测试环境未就绪”。正常的“通过 N/N”提示保持不变。

本 PR 只修改结果模板和回归测试,不修改生产配置、数据库结构、权限、沙箱执行器、队列协议或 AI 服务调用。

阅读范围与调用链

我实际阅读并运行了学生端提交和结果反馈相关路径:

  1. 学生访问 /submit/assignment_id,routes/assignments.py::submit_code 创建 Submission(status='pending'),然后把评测交给线程或 RQ。
  2. tasks/submission_tasks.py 读取提交和测试用例,调用 AI 评估与 utils.sandbox_runner.run_test_cases,把 score、feedback、sandbox_status、通过数和总数写回 Submission。
  3. templates/submission_evaluating.html 轮询 /api/submissions/submission_id/status;完成后跳转到 /view_submission/submission_id。
  4. routes/assignments.py::view_submission 读取提交详情,templates/submission_detail.html 渲染分数、AI/常规反馈和沙箱结果。

问题与复现证据

事实:沙箱返回 status='unavailable' 时,评测任务仍会保存测试用例总数。结果模板原先先判断 sandbox_total is not none,所以会输出“通过 0/2”;后面的“测试环境未就绪”分支不会执行。

复现方式:在隔离 Flask 测试数据库中创建学生提交,将 sandbox_status 设为 unavailable、sandbox_passed=0、sandbox_total=2,登录后请求 /view_submission/submission_id。

修复前运行:

python -m pytest -q tests/test_submission_knowledge_views.py -k "unavailable_sandbox or passed_sandbox_badge"

结果:1 failed, 1 passed。失败断言确认页面包含误导性的“通过 0/2”。

改动

  • 在 templates/submission_detail.html 中优先判断 sandbox_status == 'unavailable',显示“测试环境未就绪”。
  • 保留 sandbox_total 对测试明细区域的作用,因此学生仍能看到环境提示,不会丢失状态上下文。
  • 新增一个 unavailable 回归测试,并增加一个 passed 兼容路径测试,证明正常通过状态仍显示“通过 2/2”。

验证命令与结果

使用系统临时目录中的隔离 Python 3.12 环境运行:

  • python -m pytest -q tests/test_submission_knowledge_views.py -k "unavailable_sandbox or passed_sandbox_badge":2 passed。
  • python -m pytest -q tests/test_submission_knowledge_views.py tests/test_submission_api_queue.py tests/test_submission_worker.py tests/test_sandbox_features.py:25 passed,303 warnings。
  • git diff --check:通过。

首次在工作区创建虚拟环境时,安装过程因 Windows 文件占用报 WinError 32;改用系统临时目录的全新隔离环境后依赖安装成功。该安装问题不属于代码测试失败。

兼容性、回滚与边界

  • 线程/RQ 提交路径、状态轮询、评分和反馈数据结构未改动。
  • passed、partial 以及测试明细渲染逻辑未改动;本 PR 只改变 unavailable 徽章的优先级。
  • 回滚方式是恢复提交 e242a5a,无需数据库迁移或配置回滚。
  • 未验证真实生产服务器、真实 g++ 缺失环境、真实 Redis/RQ 调度、浏览器端完整交互、外部 AI 服务和线上数据。
  • 测试中的知识点检索使用 mock,未调用真实 AI;unavailable 状态在测试中直接写入与 worker 契约一致的持久化字段,因此验证的是跨路由和模板的反馈契约,不把它描述成生产环境实测。

AI 辅助说明

AI 用于检索目录、解释提交到反馈的调用链、提出候选问题和生成测试草稿。我先核对了实际文件和状态字段,再用修复前测试确认问题;只有失败证据出现后才采用本次模板分支调整。没有采用扩大到 worker、数据库或沙箱实现的建议,因为本问题可以在结果渲染边界内安全修复。

@XiaoCow666 XiaoCow666 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CodeSense 自动评审

核心目标已完成:当沙箱不可用时优先显示“测试环境未就绪”,正常通过状态仍显示通过数。未发现安全风险、明显回归或无法运行的问题。

已有验证信息

  • PR 描述提供的定向测试结果:2 passed。
  • PR 描述提供的相关测试集合结果:25 passed,303 warnings。
  • PR 描述提供的 git diff --check 结果:通过。

评审事件:6b581500-b37b-11f1-80d7-0041f2e8cbfc

@XiaoCow666
XiaoCow666 merged commit 4860a65 into XiaoCow666:main Sep 18, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants