尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
青砚 OJ 测试实践(三):核心业务接口回归——从题目发布到判题与历史记录
1. 测试背景与目标前两轮已经围绕账号、会话、修改密码以及角色权限和数据归属进行了测试。本轮进一步验证 OJ 平台的核心业务题目查询 → 创建草稿 → 发布前试运行 → 发布题目 → 用户提交 → 查询判题结果 → 查看历史记录。为了控制项目规模本轮将题目查询、题目管理、判题和提交记录合并测试重点验证关键链路及容易影响业务正确性的异常场景不对每个功能进行穷举。测试采用Python Requests Pytest在 PyCharm 中执行通过 pytest-html 生成报告。同时保留请求编号、脱敏响应和测试资源编号方便失败时定位问题。本轮共设计并执行24 项自动化测试测试通过。2. 测试范围与组织方式本轮测试分为四组分组数量主要内容查询与筛选13列表与详情、关键词、难度、编号、页码及非法参数判题结果6AC、WA、CE、RE、TLE以及数组题正常提交非法提交3空白代码、代码字段类型错误、版本字段类型错误生命周期与历史一致性2试运行发布门禁、版本冲突、题目修改后的历史记录合计24覆盖核心业务链路及典型异常这里的“24 项”是 Pytest 收集到的测试数量不是 HTTP 请求数量。例如一项题目生命周期测试会连续调用创建、试运行、发布、下架和修改等接口并包含多个断言。测试设计主要使用等价类与边界分析区分合法查询、非法参数和不同判题结果。状态转换验证草稿、已发布、已下架之间的业务规则。业务链路关联将接口返回的题目编号、版本和提交编号用于后续请求。数据一致性检查确认题目变化不会改写既有提交记录。3. 测试数据与环境准备测试对象部署在 Ubuntu 云服务器包含 Web 服务、异步判题 Worker、编译运行服务和 MySQL。自动化脚本在本地 Windows 的 PyCharm 中运行通过 HTTP 访问服务器。为了避免影响正式题库脚本创建带随机CORE_前缀的专用测试题并注册独立普通用户。管理员使用已有网站账号登录用于准备和管理本轮测试资源。测试结束后脚本将本轮发布的测试题下架保留草稿、归档题目和提交记录用于复查不直接删除数据库数据。执行前检查以下条件Web、Worker、编译服务和数据库正常运行。本机直连公网 IP 已被云端防火墙放行。测试期间不同时执行压测或其他认证测试。不在浏览器重新登录脚本使用的管理员账号避免触发单账号会话替换。这种准备方式既保证测试数据可区分也减少了对原有题目和账号的影响。4. 题目查询、搜索与筛选测试4.1 列表和详情的响应检查题目列表与详情不仅需要返回 HTTP 200还应返回正确的数据内容。本轮检查列表包含目标已发布题目页码、每页数量和是否存在下一页等字段符合预期详情中的标题、版本和初始代码模板与测试题一致公开详情不包含测试驱动、题目内部快照等字段。初始代码模板是公开题目功能的一部分因此不能将详情中出现code字段直接判断为答案泄露。4.2 搜索与筛选组合围绕唯一测试题标题分别验证场景预期按标题搜索能找到目标题目关键词前后带空白去除首尾空白后仍能匹配关键词结合正确难度返回符合条件的题目按题目编号查询结果中包含目标题目唯一标题过滤后查询第二页返回空列表且没有下一页关键词结合不匹配的难度返回空列表其中第二页场景验证的是过滤结果不足一页时的空页行为没有额外构造 21 条数据进行完整分页容量验证。4.3 非法查询参数异常参数覆盖页码为 0页码为非数字页码超过允许范围重复传入页码难度值不在允许范围关键词超过长度限制。这些请求预期返回 HTTP 400 和INVALID_REQUEST而不是服务器异常或含义不明确的成功结果。5. 题目管理与发布前试运行题目管理涉及多个状态不能只测试“创建成功”和“发布成功”。本轮按照以下路径组织测试创建草稿 ↓ 未试运行时发布被拒绝 ↓ 错误答案试运行后发布仍被拒绝 ↓ 正确答案试运行通过 ↓ 发布成功公开接口可查询 ↓ 下架并修改题目 ↓ 旧试运行不再满足新版本的发布要求 ↓ 重新试运行通过后发布5.1 草稿不能被公开读取管理员创建题目后题目应处于草稿状态。此时通过公开列表搜索不应出现该题直接访问公开详情接口也应返回题目不可用而不是泄露草稿内容。5.2 发布必须经过有效试运行没有试运行记录时发布预期返回HTTP 409 VALIDATION_REQUIRED使用错误答案试运行后即使任务正常执行完成也不能发布因为结果没有全部通过。使用正确参考代码试运行并确认最终结果为 AC 后才允许发布。这里需要区分任务完成后台已经处理完任务。试运行通过代码执行结果符合全部用例预期。任务完成不代表满足发布条件。5.3 题目修改后需要重新验证题目下架并修改后版本会发生变化。旧版本的试运行结果不能继续作为当前版本的发布依据需要重新试运行。这一检查避免出现“之前试运行通过但修改内容后没有重新验证就直接发布”的情况。6. 版本控制与冲突检查版本号用于防止客户端使用旧数据覆盖新内容。例如两个操作基于相同版本读取题目其中一个已经保存修改另一个再使用旧版本提交就可能覆盖前一个操作。本轮检查以下规则已发布题目不能直接编辑需要先下架修改成功后版本递增使用旧版本再次修改返回VERSION_CONFLICT被拒绝后当前标题和版本保持为最近一次成功修改的结果题目重新发布后用户携带旧版本提交代码也应被拒绝。这些检查同时关注错误响应和资源状态避免只验证“返回了 409”却没有确认当前数据是否受到影响。7. 五类判题结果验证判题是 OJ 的核心能力。本轮选择一道简单题通过不同代码样本触发不同结果。题目要求返回整数 x 的两倍。公开用例为输入期望输出-3-600714预期值直接由题目规则确定不使用接口返回值反过来作为测试预期。7.1 判题样本设计结果含义样本设计AC — Accepted答案正确返回x * 2WA — Wrong Answer答案错误固定返回 0CE — Compilation Error编译错误故意缺少分号RE — Runtime Error运行错误调用std::abort()TLE — Time Limit Exceeded超过时间限制带 volatile 计数的无限循环对于这些测试不能只检查判题状态接口是否返回 HTTP 200还需要检查任务是否进入预期终态任务层和结果层的 verdict 是否一致业务状态值是否符合预期提交关联的题目版本是否正确。CE 场景还检查编译诊断不为空确保用户能够获得错误反馈。7.2 WA 场景为什么会有部分用例通过固定返回 0 的错误代码其预期表现为输入期望实际是否通过-3-60否000是7140否因此整体结果应为 WA但通过数量应为1/3。自动化不仅断言 WA还检查总用例数、完成数量、通过数量以及各用例的输入、期望值、实际值和通过状态。这能够区分“整体判定正确”和“用例详情统计正确”避免只检查最终标签而遗漏明细错误。7.3 补充不同输入类型除了整数输入本轮还使用数组求和题验证另一类正常提交[1,2,3] → 6[] → 0[-2,5] → 3这组数据覆盖普通数组、空数组和包含负数的情况确认判题流程并非只在一种函数输入形式下可用。8. 异步结果查询与非法提交8.1 不能把 202 当成判题通过当前平台采用异步判题。提交请求返回 HTTP 202表示任务已经受理不表示答案正确也不表示后台已经执行完成。自动化流程为提交代码 ↓ 检查 202 和任务编号 ↓ 根据返回地址轮询状态 ↓ 等待终态 ↓ 验证判题结果状态查询可能返回排队中、运行中或终态。任务执行较快时客户端可能直接观察到终态因此没有强制要求每次都必须看到中间的 RUNNING。如果任务最终进入ERROR即使轮询接口返回 HTTP 200也不能判为测试通过。本轮只验证正常业务所需的受理与结果查询队列持久化、重复请求和服务恢复留到后续异步专项。8.2 非法提交不能产生新记录本轮检查三种非法输入代码只有空白字符代码字段为数字题目版本字段为错误类型。预期返回 HTTP 400 和INVALID_REQUEST。同时对比请求前后的个人提交列表确认这些非法请求没有生成新的可见提交记录。这样可以补充验证“请求被拒绝后没有继续进入正常提交流程”。9. 历史记录与题目修改的一致性提交记录应反映提交发生时的情况不能因为管理员之后修改题目而悄悄变化。本轮执行以下流程创建并发布测试题。普通用户提交正确代码等待 AC。读取提交详情保存原始信息。管理员下架题目修改标题和描述。再次读取原提交详情并进行对比。重点核对提交编号与代码提交时的题目标题和版本判题状态与结果创建、开始和完成时间。预期以上历史信息保持不变。同时检查状态查询接口不返回提交代码而详情接口能够返回本人的代码个人列表中也能够找到该记录。这个场景从接口表现验证了历史记录的稳定性没有将其扩大描述为对全部内部快照字段的完整验证。10. 自动化执行与证据保存本轮沿用账号模块的测试工程新增core_tests目录core_tests/ ├─ conftest.py ├─ samples.py ├─ workflow.py ├─ test_catalog.py ├─ test_judging.py └─ test_lifecycle.py职责划分如下samples.py维护题目、参考代码、错误代码和公开期望值。workflow.py封装创建、试运行、发布、提交、轮询与清理流程。conftest.py准备管理员和普通用户客户端。测试文件按照查询、判题、生命周期组织断言。执行命令python -m pytest core_tests -v -s --base-url http://服务器IP:8080 --htmlreports/core.html --self-contained-html --junitxmlreports/core.xml运行过程中保留证据用途HTML 报告查看通过、失败和错误情况环境与版本记录明确本轮测试对象请求编号与脱敏响应与服务器日志关联测试题编号和清理状态复查测试资源提交编号与终态结果核对异步任务处理结果日志中的单次请求耗时只用于辅助观察本轮没有据此得出性能结论。清理过程同样纳入检查。如果测试断言通过但下架测试题失败会产生清理阶段错误需要继续处理不能只看前面的 PASSED。11. 测试结果与范围说明本轮 24 项核心业务接口回归测试通过覆盖了查询筛选、试运行发布、版本冲突、五类判题结果、非法提交和历史记录一致性。其中故意提交的错误代码返回 WA、CE、RE、TLE属于预期结果因此对应自动化测试通过。代码答案是否通过与测试用例是否通过是两个不同层次的判断。后续将在这组核心回归基础上继续验证最小异步专项并使用 JMeter 开展性能与稳定性测试。
RELATED

相关推荐

5、使用STM32CubeMX新建工程(手把手教会你)

5、使用STM32CubeMX新建工程(手把手教会你)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/11/2 15:26:30
从企业微信三层对接,到「避坑 vs 寻优」的对比——一个 Agent 的自学笔记

从企业微信三层对接,到「避坑 vs 寻优」的对比——一个 Agent 的自学笔记

原文链接:https://mp.weixin.qq.com/s/w5YewCcxNJ8SE8udZ3LpqA 免责声明:本文为月牙寂(龚浩华)与月绡凝的个人 AI 工程化实践探索记录,仅供学习参考,不构成任何商业建议、技术承诺,也不构成对企…

📅 2026/11/2 15:21:29
千问办公,如何成为组织生产力底座?

千问办公,如何成为组织生产力底座?

企业办公软件越来越多,效率却未必同步增长。 查资料要开浏览器,确认事项要翻群聊,整理数据要进表格,写报告要用文档,做汇报又切到 PPT,最后还可能需要制作网页、海报或客户展示材料。每个工具都解决了一个…

📅 2026/11/2 15:21:29
MORE NEWS

更多资讯

📰

Wincoot NCS tools实战:连接状态诊断、僵尸清理与配置迁移技巧

1. 从"这玩意儿到底干嘛的"说起:NCS tools 的定位与适用边界第一次在 Wincoot 的菜单栏里翻到 NCS tools 这个入口时,我的反应大概是很多人的共同反应——名字太抽象了,NCS 三个字母既不像某个功能的缩写,也不像某个常见…

📰

牛客小白月赛130算法题解析与竞赛技巧

1. 赛事背景与题目特点牛客小白月赛是面向编程新手的系列赛事,第130场延续了经典赛制,包含6道不同难度的算法题。这类比赛通常考察基础数据结构应用、经典算法变形和边界条件处理能力,特别适合刚接触算法竞赛的选手练手。作为参赛老手&#x…

📰

基于1.25μm CMOS的四位移位寄存器设计与仿真:从D触发器到功耗时序分析

简介:这份文档面向电子设计与集成电路相关专业的学习者,围绕四位移位寄存器的仿真与设计展开,适合正在学习数字电路、CMOS 工艺或 EDA 工具实践的中级读者参考。压缩包内共 1 个 doc 文件,约 274KB,内容以设计报告形式…

📰

Metasploit框架Web渗透模块详解与应用实践

1. Metasploit框架与Web渗透模块概述在网络安全领域,Metasploit框架早已成为渗透测试工程师的"瑞士军刀"。这个由HD Moore于2003年创建的开源项目,经过近二十年的发展,已经成长为最全面、最强大的渗透测试平台之一。根据2023年SANS…

📰

微电网MPC调度优化:MVO算法提升光伏消纳率23.7%

## 1. 项目背景与核心挑战微电网作为分布式能源系统的重要形态,其调度优化直接影响运行经济性和供电可靠性。传统调度方法面临两大核心挑战:一是光伏发电的间歇性和随机性导致功率波动,二是分时电价机制下的成本优化需求。我们团队针对某社区…

📰

Elasticsearch分片数量与副本数量上限及容量规划

分片数量和副本数量这两个参数,几乎是每个接触 Elasticsearch 的人在建第一个正式索引时都会被要求填的两个数字,也是最容易被当成填空题随手带过去的两个数字。我见过太多索引在创建时number_of_shards写成 5、number_of_replicas写成 1,然后…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬