码上面试平台测试报告
| 项目 |
内容 |
| 项目名称 |
码上面试平台 |
| 测试对象 |
前端页面、后端接口、自动化单元测试、JMeter 性能测试 |
| 测试时间 |
2026-07-20 |
| 测试环境 |
Windows 11、本地 Docker 依赖、Spring Boot 后端、Vite 前端 |
| 测试账号 |
2023212064 / 111111;补充注册账号 test_20260720 / 111111 |
| 测试结论 |
前端页面与接口登录主链路可用;前端单元测试通过;后端全量单元测试存在 2 个失败;JMeter 登录接口触发限流,性能结果需按"部分通过"处理 |
一、项目背景
码上面试平台是一个面向求职面试训练的 AI 模拟面试系统,前端基于 React + Vite,后端基于 Spring Boot 3 + Java 17+,核心能力包括用户登录注册、AI 聊天、简历驱动模拟面试、面试报告、语音转写与 TTS 等。
本次测试报告用于验证项目在本地环境下的基础可用性、接口稳定性、自动化测试健康度和核心接口并发表现。参考 CSDN 测试报告类文章的组织方式,本报告以"测试用例设计、测试执行截图、测试代码/日志证据、性能测试结果、缺陷统计"为主线展开。
二、项目概述
2.1 已实现的主要功能
| 功能模块 |
说明 |
| 用户认证 |
登录、注册、登录态检查、退出登录 |
| 首页与导航 |
平台首页、登录入口、面试入口、聊天入口 |
| AI 聊天 |
聊天页加载、会话入口、流式响应前端承载 |
| 模拟面试 |
面试介绍页、简历上传入口、面试房间、面试策略 |
| 面试报告 |
面试记录列表、报告详情、雷达图、复盘建议 |
| 语音媒体 |
实时语音转写、TTS 播放、麦克风错误处理 |
| 稳定性治理 |
AI Guard、Single-flight、限流、幂等、防重复提交 |
2.2 当前系统存在的不足
| 编号 |
不足 |
影响 |
| R-01 |
后端全量 Maven 单元测试存在 2 个失败 |
CI 质量门禁不能直接判定通过 |
| R-02 |
登录接口在 20 线程压测下出现 429 |
说明登录接口受限流保护,性能结论不能写成 100% 成功 |
| R-03 |
依赖 AI/讯飞密钥的完整面试链路不适合直接做无桩压测 |
本报告仅验证本地可控接口与页面 |
| R-04 |
参考博客正文无法通过本机浏览器读取 |
格式无法逐字核对,只能按样例结构和真实证据还原 |
三、测试目标
| 目标编号 |
测试目标 |
验收标准 |
| T-01 |
验证前端页面可访问 |
首页、登录页、登录后核心页面正常渲染 |
| T-02 |
验证用户认证链路 |
登录接口返回 token,前端登录后可进入受保护页面 |
| T-03 |
验证接口基础可用性 |
健康检查、登录、注册、登录态检查返回符合预期 |
| T-04 |
验证自动化测试健康度 |
前端 Vitest 通过;后端 Maven 测试结果如实记录 |
| T-05 |
验证核心接口性能 |
JMeter 生成 .jtl 与 HTML Dashboard,统计响应时间、吞吐量、错误率 |
| T-06 |
发现并记录缺陷 |
对失败测试和性能错误做缺陷归类 |
四、测试环境
| 类型 |
配置 |
| 操作系统 |
Windows 11 |
| 前端运行地址 |
http://localhost:5173 |
| 后端运行地址 |
http://localhost:8002 |
| 数据库依赖 |
MySQL 8.4 Docker 容器,宿主机端口 3307 |
| 缓存依赖 |
Redis 7.2 Docker 容器,端口 6379 |
| 文档数据库 |
MongoDB 7.0 Docker 容器,端口 27017 |
| 前端测试 |
Vitest 4.0.18 |
| 后端测试 |
Maven 3.6.3 + JDK 21 |
| 性能测试 |
Apache JMeter 5.5 |
| 浏览器截图 |
Chrome + Playwright |
五、测试安排
| 阶段 |
内容 |
产物 |
| 需求与结构梳理 |
分析前后端模块、接口路径、认证方式 |
测试范围、用例思维导图 |
| 环境启动 |
启动 Docker 依赖、确认前后端服务 |
健康检查、页面访问截图 |
| 功能测试 |
登录、注册、页面跳转、移动端访问 |
页面截图 |
| 接口测试 |
健康检查、登录、注册、登录态检查 |
api-smoke-result.json |
| 自动化测试 |
前端 Vitest、后端 Maven test |
测试日志、失败用例 |
| 性能测试 |
JMeter 20 线程、5 次循环 |
.jmx、.jtl、Dashboard、截图 |
| 缺陷统计 |
汇总自动化失败和性能限流 |
缺陷表 |
六、测试用例思维导图
补测后按"登录注册、面试主流程、简历异常、答题追问、报告会话、权限安全、多媒体草稿板、执行证据"重新整理未完成用例,分类图如下:
七、功能测试
7.1 功能测试用例
| 用例编号 |
模块 |
测试点 |
操作步骤 |
预期结果 |
实际结果 |
结论 |
| F-01 |
首页 |
首页首屏加载 |
访问 / |
页面正常显示平台首页 |
正常显示 |
通过 |
| F-02 |
登录页 |
登录表单展示 |
访问 /auth |
用户名、密码、登录按钮显示 |
正常显示 |
通过 |
| F-03 |
登录页 |
正确账号登录 |
输入 2023212064/111111 点击登录进入 |
跳转首页或进入登录态 |
跳转到首页 |
通过 |
| F-04 |
注册接口 |
创建测试账号 |
调用注册接口创建 codex_test_20260720 |
返回 success |
返回 success |
通过 |
| F-05 |
面试入口 |
登录后访问 /interview |
登录后打开面试入口 |
页面正常显示 |
正常显示 |
通过 |
| F-06 |
聊天页 |
登录后访问 /chat |
登录后打开聊天页 |
页面正常显示 |
正常显示 |
通过 |
| F-07 |
报告页 |
登录后访问 /interview/report |
登录后打开报告页 |
页面正常显示 |
正常显示 |
通过 |
| F-08 |
路由保护 |
未登录访问受保护路由 |
未登录访问 /chat |
跳转登录页 |
首次截图停留登录页 |
通过 |
| F-09 |
移动端首页 |
390px 宽度访问首页 |
移动端视口打开首页 |
页面不白屏、不明显错位 |
正常显示 |
通过 |
| F-10 |
移动端面试页 |
390px 宽度访问面试入口 |
移动端视口打开 /interview |
页面可访问 |
正常显示 |
通过 |
7.2 页面截图
7.3 UI 全覆盖截图补充
本节用于补足 UI 覆盖,覆盖范围不只包括首页和登录,而是扩展到注册、受保护路由、面试房间、策略选择、构思板、摄像头异常、报告详情异常态和移动端页面。以下截图均由本机 Chrome + Playwright 访问本地前端得到;其中依赖硬件权限、外部 AI 或历史报告数据的状态按 UI 状态验证处理,不等同于完整业务链路已跑通。
| 覆盖编号 |
UI 区域 |
状态 |
截图 |
结论 |
| UI-01 |
登录页 |
默认登录态 |
ui-02-login-before.png |
已覆盖 |
| UI-02 |
登录页 |
输入账号密码 |
ui-03-login-filled.png |
已覆盖 |
| UI-03 |
注册页 |
注册模式 |
ui-15-register-tab.png |
已覆盖 |
| UI-04 |
注册页 |
密码不一致输入态 |
ui-16-register-password-mismatch.png |
已覆盖 |
| UI-05 |
未登录保护 |
面试房间跳转登录 |
ui-24-guest-interview-room-redirect.png |
已覆盖 |
| UI-06 |
未登录保护 |
报告页跳转登录 |
ui-25-guest-report-redirect.png |
已覆盖 |
| UI-07 |
面试入口 |
登录态入口页 |
ui-09-interview-intro-logged-in.png |
已覆盖 |
| UI-08 |
面试房间 |
待上传简历 |
ui-14-interview-room-upload-state.png |
已覆盖 |
| UI-09 |
面试策略 |
项目深挖选中 |
ui-17-strategy-project-deep-dive.png |
已覆盖 |
| UI-10 |
面试策略 |
基础摸排选中 |
ui-18-strategy-foundation-scan.png |
已覆盖 |
| UI-11 |
面试策略 |
查漏补缺选中 |
ui-19-strategy-gap-targeting.png |
已覆盖 |
| UI-12 |
构思板 |
空构思板打开 |
ui-20-sketchpad-open-empty.png |
已覆盖 |
| UI-13 |
摄像头 |
权限/不可用异常态 |
ui-21-camera-permission-error.png |
已覆盖 |
| UI-14 |
简历上传 |
非 PDF 文件选择/异常态 |
ui-22-upload-non-pdf-state.png |
已覆盖 |
| UI-15 |
聊天页 |
登录态聊天页 |
ui-10-chat-logged-in.png |
已覆盖 |
| UI-16 |
报告列表 |
登录态报告页 |
ui-11-report-list-logged-in.png |
已覆盖 |
| UI-17 |
报告详情 |
缺少 sessionId |
ui-23-report-detail-no-session.png |
已覆盖 |
| UI-18 |
移动端 |
移动端首页 |
ui-12-mobile-home.png |
已覆盖 |
| UI-19 |
移动端 |
移动端面试入口 |
ui-13-mobile-interview.png |
已覆盖 |
| UI-20 |
移动端 |
移动端登录页 |
ui-26-mobile-auth.png |
已覆盖 |
| UI-21 |
移动端 |
移动端面试房间 |
ui-27-mobile-interview-room.png |
已覆盖 |
| UI-22 |
移动端 |
移动端报告页 |
ui-28-mobile-report-list.png |
已覆盖 |
7.4 补充测试用例矩阵
说明:本节按参考博客"按页面/模块拆分用例"的方式整理。上一版中尚未完成的补充用例已在本次补测中改为真实浏览器、真实 API、前端自动化、后端单元测试或 Mock 异常测试执行;发现不符合预期的场景单独标为"已执行,记录缺陷"。
| 用例编号 |
模块 |
测试点 |
前置条件 |
预期结果 |
执行状态 |
| F-11 |
登录页 |
用户名输入框显示 |
访问 /auth |
输入框可见、可输入 |
已执行 |
| F-12 |
登录页 |
密码输入框显示 |
访问 /auth |
密码框可见,输入内容隐藏 |
已执行 |
| F-13 |
登录页 |
正确账号密码登录 |
输入 2023212064/111111 |
登录成功并跳转首页 |
已执行 |
| F-14 |
登录页 |
空用户名登录 |
清空用户名后提交 |
页面提示或阻止提交 |
已执行(真实浏览器+前端自动化) |
| F-15 |
登录页 |
空密码登录 |
清空密码后提交 |
页面提示或阻止提交 |
已执行(真实浏览器+前端自动化) |
| F-16 |
登录页 |
错误密码登录 |
输入错误密码 |
登录失败并提示 |
已执行(真实浏览器+真实 API) |
| F-17 |
注册页 |
切换注册模式 |
点击注册标签 |
展示确认密码字段 |
已执行(真实浏览器+前端自动化) |
| F-18 |
注册页 |
新用户注册 |
使用新用户名注册 |
注册接口返回成功 |
已执行 |
| F-19 |
注册页 |
重复用户名注册 |
使用已存在用户名注册 |
返回重复用户名提示 |
已执行(真实 API+前端自动化) |
| F-20 |
首页 |
首页首屏加载 |
访问 / |
首页内容完整显示 |
已执行 |
| F-21 |
首页 |
未登录点击面试入口 |
未登录状态 |
跳转登录页 |
已执行 |
| F-22 |
首页 |
登录后点击面试入口 |
登录状态 |
进入面试介绍页 |
已执行 |
| F-23 |
首页 |
登录后点击聊天入口 |
登录状态 |
进入聊天页 |
已执行 |
| F-24 |
面试介绍页 |
页面基础信息展示 |
登录后访问 /interview |
面试介绍页正常显示 |
已执行 |
| F-25 |
面试介绍页 |
简历上传入口展示 |
登录后访问 /interview |
上传入口可见 |
已执行(真实浏览器) |
| F-26 |
面试介绍页 |
策略模式选择 |
登录后访问 /interview |
可选择面试策略 |
已执行(真实浏览器) |
| F-27 |
面试房间 |
未选择简历直接开始 |
登录状态 |
页面给出限制或提示 |
已执行(真实浏览器) |
| F-28 |
面试房间 |
答题输入框 |
已进入面试房间 |
输入框可编辑 |
已执行(真实浏览器) |
| F-29 |
面试房间 |
答案提交 |
已生成问题 |
提交后进入评分/追问流程 |
已执行(前端自动化 Mock AI) |
| F-30 |
聊天页 |
页面加载 |
登录后访问 /chat |
聊天页正常显示 |
已执行 |
| F-31 |
聊天页 |
空消息提交 |
聊天页 |
阻止空提交 |
已执行(前端自动化) |
| F-32 |
聊天页 |
普通消息发送 |
登录状态 |
展示用户消息和 AI 响应 |
已执行(前端自动化 Mock AI) |
| F-33 |
报告页 |
报告列表加载 |
登录后访问 /interview/report |
页面正常显示 |
已执行 |
| F-34 |
报告页 |
空数据展示 |
无面试记录 |
显示空状态或引导 |
已执行 |
| F-35 |
报告详情页 |
详情路由访问 |
有报告 ID |
显示分数、雷达图、复盘内容 |
已执行(报告数据自动化+真实浏览器缺失态) |
| F-36 |
退出登录 |
点击退出 |
登录状态 |
清除登录态并跳转登录页 |
已执行(前端自动化) |
| F-37 |
路由保护 |
未登录访问 /chat |
清除 token |
自动跳转 /auth |
已执行 |
| F-38 |
路由保护 |
未登录访问 /interview/report |
清除 token |
自动跳转 /auth |
已执行 |
| F-39 |
移动端 |
移动端首页 |
390px 宽度 |
不白屏、不横向溢出 |
已执行 |
| F-40 |
移动端 |
移动端面试页 |
390px 宽度 |
页面主要内容可见 |
已执行 |
| F-41 |
浏览器兼容 |
Chrome 桌面端访问 |
Chrome |
页面正常加载 |
已执行 |
| F-42 |
浏览器兼容 |
刷新登录态页面 |
登录后刷新 |
不丢失登录态 |
已执行 |
| F-43 |
接口鉴权 |
无 token 访问保护接口 |
不带 token |
返回未登录或被拦截 |
已执行,记录缺陷(真实 API 返回系统异常) |
| F-44 |
接口鉴权 |
Bearer token 访问 |
登录后带 token |
返回当前用户状态 |
已执行 |
| F-45 |
性能 |
5 线程并发登录 |
JMeter 顺序执行 |
0 错误或错误可解释 |
已执行 |
| F-46 |
性能 |
10 线程并发登录 |
JMeter 顺序执行 |
0 错误或错误可解释 |
已执行 |
| F-47 |
性能 |
20 线程并发登录 |
JMeter 执行 |
记录响应时间与错误率 |
已执行 |
| F-48 |
安全 |
登录接口限流 |
并发请求 |
超阈值时返回 429 |
已执行 |
| F-49 |
安全 |
报告隐藏 token |
写报告时处理 |
不展示真实 token |
已执行 |
| F-50 |
可用性 |
错误提示可读性 |
触发错误 |
提示文案明确 |
已执行(真实浏览器+自动化) |
7.5 核心面试流程专项测试设计
前一版报告覆盖了登录、首页、面试入口和报告页,但对核心业务链路覆盖不足。本次补测已把面试主流程拆成正常流、简历异常、答题追问异常、会话报告恢复、权限并发、多媒体草稿板六类;外部 AI 不稳定的场景使用 Mock 返回或构造异常执行,并在状态中注明证据来源。
7.5.1 正常主流程用例
| 用例编号 |
阶段 |
测试点 |
操作步骤 |
预期结果 |
状态 |
| IV-01 |
会话创建 |
创建默认面试会话 |
登录后进入 /interview/room |
页面进入面试房间,等待上传简历 |
已执行 |
| IV-02 |
会话创建 |
选择基础摸排策略 |
在面试房间选择 FOUNDATION_SCAN |
创建会话时携带策略模式 |
已有自动化覆盖 |
| IV-03 |
会话创建 |
选择项目深挖策略 |
选择 PROJECT_DEEP_DIVE 后上传简历 |
后端按项目深挖策略生成题目 |
已执行(真实 API+前端自动化) |
| IV-04 |
会话创建 |
选择查漏补缺策略 |
选择 GAP_TARGETING 后答题 |
答题请求携带策略配置 |
已有自动化覆盖 |
| IV-05 |
简历上传 |
上传合法 PDF 简历 |
选择 .pdf 简历文件 |
上传成功,展示文件名和解析状态 |
已执行(前端自动化 Mock 服务) |
| IV-06 |
简历解析 |
触发简历出题 |
上传 PDF 后等待解析 |
返回题目、建议、简历分数 |
已执行(前端自动化 Mock AI) |
| IV-07 |
题目展示 |
首题加载 |
简历解析成功后进入答题区 |
显示第 1 题和题号 |
已有自动化覆盖 |
| IV-08 |
答题提交 |
正常提交文本答案 |
输入有效回答并提交 |
展示用户回答、AI 反馈、下一题 |
已有自动化覆盖 |
| IV-09 |
追问流程 |
后端返回追问 |
提交回答后后端返回 isFollowUp=true |
页面显示"追问第 N 轮"标识 |
已有自动化覆盖 |
| IV-10 |
策略反馈 |
返回策略决策 |
答题后返回 strategyDecision |
页面展示当前聚焦点、决策原因、下一步动作 |
已有自动化覆盖 |
| IV-11 |
流程推进 |
非追问进入下一题 |
答题后返回下一题号 |
当前题号更新,下一题展示 |
已有自动化覆盖 |
| IV-12 |
面试结束 |
答完最后一题 |
后端返回 finished=true |
页面显示面试完成和总分 |
已有自动化覆盖 |
| IV-13 |
报告保存 |
自动保存报告 |
面试完成后触发保存 |
只保存一次并提示成功 |
已有自动化覆盖 |
| IV-14 |
报告跳转 |
手动结束面试 |
点击结束面试 |
调用 finish 接口并跳转报告页 |
已有自动化覆盖 |
| IV-15 |
报告查看 |
通过 sessionId 查看报告 |
访问 /interview/report?sessionId=... |
展示报告数据、雷达图、复盘建议 |
已执行(报告视图模型自动化) |
7.5.2 简历上传与解析异常用例
| 用例编号 |
异常类型 |
操作步骤 |
预期结果 |
状态 |
| IV-E01 |
未上传简历直接答题 |
进入面试房间后直接输入答案 |
输入框应禁用或提示先上传简历 |
已执行(真实浏览器+交互断言) |
| IV-E02 |
上传非 PDF 文件 |
选择 .docx/.png/.txt 文件 |
前端或后端拒绝,提示文件格式不支持 |
已执行(前端自动化) |
| IV-E03 |
上传空 PDF |
选择 0KB PDF |
拒绝上传或解析失败提示 |
已执行(前端自动化 Mock 异常) |
| IV-E04 |
上传超大 PDF |
选择超过限制的 PDF |
返回文件大小限制提示 |
已执行(前端自动化 Mock 异常) |
| IV-E05 |
上传损坏 PDF |
选择无法解析的 PDF |
预览失败或解析失败提示 |
已执行(前端自动化 Mock 异常) |
| IV-E06 |
上传过程中断网 |
上传时断开后端服务 |
页面显示上传失败,可重新选择文件 |
已执行(前端自动化 Mock 网络异常) |
| IV-E07 |
简历解析超时 |
AI 出题接口超过超时时间 |
页面显示解析失败或重试提示 |
已执行(前端自动化 Mock 超时) |
| IV-E08 |
简历解析返回空题目 |
Mock 后端返回空 questions |
页面不进入可答题状态,提示解析异常 |
已执行(前端自动化 Mock 空结果) |
| IV-E09 |
简历预览非 PDF 响应 |
后端预览返回文本错误 |
前端显示预览错误,不误当 PDF 渲染 |
已执行(service 单元测试) |
| IV-E10 |
重复上传简历 |
同一会话重复选择文件 |
状态更新为最新文件或提示覆盖 |
已执行(前端自动化) |
7.5.3 答题与追问异常用例
| 用例编号 |
异常类型 |
操作步骤 |
预期结果 |
状态 |
| IV-E11 |
空答案提交 |
题目加载后提交空内容 |
阻止提交或提示请输入答案 |
已执行(前端自动化) |
| IV-E12 |
超长答案提交 |
输入超过 5000 字 |
后端校验失败,页面展示错误 |
已执行(前端自动化 Mock 失败) |
| IV-E13 |
当前题号缺失 |
当前题号为空时提交 |
不调用答题接口,提示题号缺失 |
已有自动化覆盖 |
| IV-E14 |
答题接口返回失败 |
后端返回 isSuccess=false |
停止思考状态,展示错误消息 |
已有自动化覆盖 |
| IV-E15 |
答题接口 500 |
服务端异常 |
页面显示失败提示,不丢失用户答案 |
已执行(前端自动化 Mock 500) |
| IV-E16 |
答题接口超时 |
AI 评分超时 |
页面显示超时/重试提示 |
已执行(前端自动化 Mock 超时) |
| IV-E17 |
重复点击提交 |
快速连续点击发送 |
防重复提交或只处理一次 |
已执行(前端自动化) |
| IV-E18 |
requestId 重放 |
使用相同 requestId 重复提交 |
后端幂等返回或拒绝重复处理 |
已执行(前端 requestPolicy 单元测试) |
| IV-E19 |
追问次数上限 |
连续触发追问 |
达到上限后进入下一题 |
已执行(service 归一化单元测试) |
| IV-E20 |
追问问题为空 |
后端返回 isFollowUp=true 但问题为空 |
页面不追加空追问,提示异常 |
已执行(前端自动化) |
| IV-E21 |
分数为空 |
后端反馈无 score |
页面不崩溃,按缺省值展示 |
已执行(service 单元测试) |
| IV-E22 |
策略决策为空 |
后端无 strategyDecision |
策略卡片不展示,流程继续 |
已执行(组件单元测试) |
| IV-E23 |
策略服务异常 |
策略决策失败但追问规则可用 |
回退到原追问规则 |
已有自动化覆盖 |
| IV-E24 |
AI 反馈含 Markdown |
返回列表/代码块 |
页面正确渲染 Markdown |
已执行(前端自动化) |
| IV-E25 |
AI 反馈含特殊字符 |
返回 emoji、尖括号、换行 |
页面不乱码、不注入脚本 |
已执行(前端自动化) |
7.5.4 会话恢复、结束与报告异常用例
| 用例编号 |
场景 |
操作步骤 |
预期结果 |
状态 |
| IV-R01 |
路由会话恢复 |
访问 /interview/room/{sessionId} |
同步路由 sessionId 并加载当前题 |
已有自动化覆盖 |
| IV-R02 |
空路由不自动恢复 |
本地有旧 session 但路由为空 |
不自动恢复旧会话 |
已有自动化覆盖 |
| IV-R03 |
会话 DRAFT 状态恢复 |
恢复未上传简历会话 |
页面停留上传简历状态 |
已执行(真实 API) |
| IV-R04 |
会话 READY 状态恢复 |
恢复已生成题目会话 |
页面显示当前题 |
已执行(前端自动化 Mock 恢复) |
| IV-R05 |
会话 IN_PROGRESS 状态恢复 |
答题中刷新页面 |
消息和当前题恢复 |
已执行(前端自动化) |
| IV-R06 |
会话 COMPLETED 状态恢复 |
已完成会话进入房间 |
引导查看报告 |
已执行(前端自动化) |
| IV-R07 |
手动结束未开始会话 |
未上传简历时点击结束 |
后端安全结束或前端阻止 |
已执行(真实 API) |
| IV-R08 |
手动结束进行中会话 |
答题中点击结束 |
调用 finish 并跳转报告页 |
已有自动化覆盖 |
| IV-R09 |
自动保存重复触发 |
完成状态多次 rerender |
finishInterviewSession 只调用一次 |
已有自动化覆盖 |
| IV-R10 |
保存报告时并发请求 |
多个线程保存同一 session |
只有一个成功,其余提示处理中 |
后端压力测试覆盖 |
| IV-R11 |
报告列表为空 |
新用户访问报告页 |
显示空状态 |
已执行 |
| IV-R12 |
报告详情不存在 |
访问不存在 sessionId |
返回错误提示或空状态 |
已执行(真实浏览器+真实 API,记录返回空成功缺陷) |
| IV-R13 |
雷达图数据为空 |
后端无 radar 数据 |
页面不崩溃,显示缺省/空状态 |
已执行(报告视图模型自动化) |
| IV-R14 |
复盘总结为空 |
后端无 reflectionSummary |
页面展示基础报告,不报错 |
已执行(报告视图模型自动化) |
| IV-R15 |
历史消息分页 |
会话消息超过分页大小 |
分页正确,无重复/缺失 |
已执行(聊天历史自动化) |
7.5.5 权限、隔离与并发异常用例
| 用例编号 |
场景 |
操作步骤 |
预期结果 |
状态 |
| IV-S01 |
未登录创建会话 |
不带 token 调用 /sessions |
被拦截或返回未登录 |
已执行,记录缺陷(真实 API 返回系统异常) |
| IV-S02 |
未登录上传简历 |
不带 token 上传文件 |
被拦截 |
已执行(前端 request 鉴权单元测试) |
| IV-S03 |
未登录答题 |
不带 token 调答题接口 |
被拦截 |
已执行(前端 request 鉴权单元测试) |
| IV-S04 |
越权查看会话 |
用户 A 访问用户 B 的 sessionId |
返回无权限或不存在 |
已执行(后端鉴权单元测试) |
| IV-S05 |
越权查看报告 |
用户 A 查看用户 B 报告 |
返回无权限或不存在 |
已执行(后端鉴权单元测试) |
| IV-S06 |
token 过期恢复会话 |
清除 token 后刷新房间 |
跳转登录页 |
已执行(路由保护自动化+真实浏览器) |
| IV-S07 |
多标签页同会话答题 |
两个页面同时提交答案 |
后端幂等/锁保护,不重复扣题 |
已执行(前端重复提交自动化+后端压力测试) |
| IV-S08 |
AI Single-flight 去重 |
同一题同一 requestKey 并发 |
只执行一次 AI 调用或结果回放 |
后端单元/压力测试部分覆盖 |
| IV-S09 |
答题限流 |
高频提交答题请求 |
超阈值时拒绝 |
后端限流测试覆盖 |
| IV-S10 |
大量报告分页查询 |
高频查询报告列表 |
响应稳定且分页正确 |
已执行(真实 API) |
7.5.6 语音、摄像头与草稿板异常用例
| 用例编号 |
场景 |
操作步骤 |
预期结果 |
状态 |
| IV-M01 |
麦克风授权拒绝 |
浏览器拒绝麦克风 |
清理录音资源并提示失败 |
前端自动化覆盖 |
| IV-M02 |
语音转写连接失败 |
WebSocket 连接失败 |
页面提示语音不可用,不影响文本答题 |
已执行(前端自动化) |
| IV-M03 |
转写结果重复片段 |
AST 返回重叠片段 |
前端/后端去重,不重复显示 |
后端当前有失败用例 |
| IV-M04 |
摄像头授权拒绝 |
点击摄像头后拒绝权限 |
显示摄像头错误提示 |
已执行(真实浏览器) |
| IV-M05 |
神态分析图片为空 |
上传空图片 |
后端拒绝并提示 |
已执行(后端单元测试/服务异常覆盖) |
| IV-M06 |
神态分析 AI 超时 |
表情分析超时 |
不阻塞主答题流程 |
已执行(前端自动化 Mock 异常) |
| IV-M07 |
草稿板打开关闭 |
点击草稿板 |
正常打开/关闭 |
已执行(真实浏览器+前端自动化) |
| IV-M08 |
草稿插入答案 |
草稿板写内容后插入 |
内容进入答题输入框 |
已执行(前端自动化) |
| IV-M09 |
草稿为空插入 |
空草稿点击插入 |
不改变输入框 |
已执行(前端自动化) |
| IV-M10 |
简历参考卡预览失败 |
PDF 预览失败 |
显示预览错误,不影响答题 |
已执行(前端自动化) |
7.6 未完成用例补测执行记录
本次补测没有删除原有测试项,而是在原有矩阵基础上补充真实浏览器、真实接口和自动化执行证据。依赖外部 AI、摄像头、麦克风或用户历史数据的场景,以可控 Mock、权限拒绝、异常返回和空状态方式验证前端兜底逻辑;真实接口不符合预期的项目进入缺陷表。
| 执行类型 |
覆盖范围 |
执行结果 |
证据 |
| 前端全量自动化 |
登录注册、面试流程、简历预览、报告数据、草稿板、路由 |
25 个测试文件、127 条用例全部通过 |
results/frontend-vitest-supplemental.log |
| 真实 API 补测 |
登录、错误密码、注册、重复注册、鉴权、创建会话、恢复会话、结束会话、报告列表、缺失报告 |
12 条已执行,3 条记录为接口缺陷或兼容风险 |
results/supplemental-api-results.json |
| 真实浏览器补测 |
登录空值、错误密码、注册密码不一致、首页、面试入口、面试房间、草稿板、聊天、报告、缺失报告 |
12 张截图已留存 |
assets/screenshots/supplemental-ui/ |
| 异常与边界补测 |
空答案、重复提交、后端 500、请求超时、非 PDF、空 PDF、预览失败、Markdown 特殊字符 |
前端自动化通过 |
frontend/AI-Meeting-Frontend/src/hooks/interview/** |
八、接口测试
8.1 接口测试用例
| 用例编号 |
接口 |
方法 |
输入 |
预期结果 |
实际结果 |
结论 |
| I-01 |
/actuator/health |
GET |
无 |
返回 UP |
返回 UP |
通过 |
| I-02 |
/api/xunzhi/v1/users/login |
POST |
2023212064/111111 |
success=true,返回 token |
返回 36 位 token |
通过 |
| I-03 |
/api/xunzhi/v1/users/register |
POST |
codex_test_20260720/111111 |
注册成功 |
返回 success=true |
通过 |
| I-04 |
/api/xunzhi/v1/users/check-login |
GET |
Authorization: Bearer <token> |
返回已登录用户 |
isLogin=true,用户为 2023212064 |
通过 |
8.2 接口冒烟结果
{
"health": "UP",
"loginSuccess": true,
"loginUser": "2023212064",
"tokenLength": 36,
"checkLoginSuccess": true,
"checkLoginIsLogin": true,
"checkLoginUser": "2023212064"
}
8.3 真实 API 补测结果
执行脚本:docs/testing/scripts/run_supplemental_api_tests.mjs
| 用例编号 |
接口/场景 |
状态码 |
实际结果 |
结论 |
| API-LOGIN-OK |
正确账号登录 |
200 |
code=0,返回 token |
通过 |
| API-LOGIN-BAD-PASSWORD |
错误密码登录 |
200 |
code=A000001,success=false |
通过 |
| API-REGISTER-NEW |
新账号注册 |
200 |
code=0,注册成功 |
通过 |
| API-REGISTER-DUPLICATE |
重复用户名注册 |
200 |
code=B000201,提示用户名已存在 |
通过 |
| API-PROTECTED-NO-TOKEN |
无 token 创建会话 |
200 |
code=B000001,提示系统执行出错 |
已执行,记录缺陷 |
| API-CHECK-LOGIN |
token 登录态检查 |
200 |
code=0,登录态有效 |
通过 |
| API-CREATE-SESSION |
创建 PROJECT_DEEP_DIVE 面试会话 |
200 |
code=0,返回 DRAFT 会话 |
通过 |
| API-RESTORE-DRAFT |
恢复 DRAFT 会话 |
200 |
code=0,返回会话数据 |
通过 |
| API-FINISH-DRAFT |
手动结束 DRAFT 会话 |
200 |
code=0,结束成功 |
通过 |
| API-REPORT-PAGE |
报告列表主路径 |
200 |
code=0,返回列表结构 |
通过 |
| API-MISSING-REPORT |
缺失报告详情 |
200 |
code=0,但缺少有效报告数据 |
已执行,记录缺陷 |
| API-REPORT-PAGE-LEGACY |
旧报告列表路径 |
200 |
code=B000001,系统执行出错 |
已执行,记录兼容风险 |
九、自动化测试
9.1 前端单元测试
执行命令:
npm.cmd run test:run
执行结果:
| 指标 |
结果 |
| 测试文件 |
25 passed / 25 |
| 测试用例 |
127 passed / 127 |
| 耗时 |
7.99s |
| 结论 |
通过 |
补测日志:results/frontend-vitest-supplemental.log,其中新增覆盖登录注册错误提示、面试答题异常、简历异常、报告空数据和草稿板异常。
前端自动化测试代码截图:
9.2 后端单元测试
执行命令:
$env:JAVA_HOME='D:\Program Files\Java\jdk-21'
$env:Path="$env:JAVA_HOME\bin;$env:Path"
.\mvnw.cmd -B -ntp test
执行结果:
| 指标 |
结果 |
| 测试总数 |
94 |
| 失败数 |
2 |
| 错误数 |
0 |
| 跳过数 |
0 |
| 构建结果 |
BUILD FAILURE |
| 结论 |
不通过,需要修复 |
失败用例:
| 用例 |
失败原因 |
InterviewRecordServiceImplTest.shouldFinishInterviewSessionBeforePersistingRecordFromRedis |
期望 requireOwnedSession("interview-session-1", 1001L) 调用 1 次,实际调用 3 次 |
XunfeiAudioServiceAssemblerTest.noPgsPartial_ShouldReplaceCurrentLiveSnapshot |
期望转写片段结果为 AB,实际为 AAB |
十、性能测试
10.1 测试目标
性能测试严格围绕本地稳定可访问接口执行,不压测依赖外部 AI/讯飞密钥的长链路,避免把外部服务波动误判为本系统性能问题。
10.2 JMeter 测试设计
| 项目 |
配置 |
| 测试工具 |
Apache JMeter 5.5 |
| 测试计划 |
assets/jmeter/ai-meeting-performance.jmx |
| 线程数 |
20 |
| Ramp-Up |
5 秒 |
| 循环次数 |
5 |
| 请求总数 |
200 |
| 请求接口 |
GET /actuator/health、POST /api/xunzhi/v1/users/login |
| 输出文件 |
.jtl、JMeter HTML Dashboard、运行日志 |
执行命令:
E:\JavaSoft\apache-jmeter-5.5\apache-jmeter-5.5\bin\jmeter.bat `
-n `
-t docs\testing\assets\jmeter\ai-meeting-performance.jmx `
-l docs\testing\assets\jmeter\ai-meeting-performance.jtl `
-e `
-o docs\testing\assets\jmeter\dashboard `
-j docs\testing\assets\jmeter\jmeter-run.log
10.3 JMeter 汇总结果
| 指标 |
Total |
健康检查接口 |
登录接口 |
| 样本数 |
200 |
100 |
100 |
| 错误数 |
9 |
0 |
9 |
| 错误率 |
4.5% |
0% |
9.0% |
| 平均响应时间 |
7.63ms |
6.46ms |
8.80ms |
| 中位数响应时间 |
7ms |
5ms |
8ms |
| 最小响应时间 |
2ms |
3ms |
2ms |
| 最大响应时间 |
37ms |
37ms |
28ms |
| P90 |
10ms |
8ms |
11ms |
| P95 |
13.95ms |
15.70ms |
13.95ms |
| P99 |
28.99ms |
36.92ms |
27.95ms |
| 吞吐量 |
42.22/s |
21.14/s |
21.29/s |
10.4 性能结果分析
本次 JMeter 压测显示,健康检查接口 100 次请求全部成功,平均响应 6.46ms;登录接口 100 次请求中 91 次成功、9 次返回 429。429 不是网络错误,而是系统限流策略在并发登录场景下生效。因此性能结论不能写成"全部通过",应写为:
- 健康检查接口响应稳定,低延迟。
- 登录接口平均响应时间较低,但在 20 线程并发下触发限流。
- 如果业务目标是保护登录接口、防暴力破解,429 属于预期防护效果。
- 如果业务目标是支持更高并发登录,需要调整限流阈值或增加登录流量白名单/分桶策略。
10.5 JMeter 额外对比压测
原 20 线程 JMeter 压测结果保留不变。为了补足参考博客中"结合不同结果图进一步分析"的写法,本节额外增加 5 线程、10 线程顺序压测,与原 20 线程结果做对比。
需要注意:5 线程和 10 线程不能与 20 线程同时运行,否则多个测试计划会共享登录接口限流桶,导致错误率互相污染。因此本节采用顺序执行:先执行 5 线程,等待限流窗口恢复,再执行 10 线程,最后与原 20 线程结果对比。
| 对比组 |
线程数 |
Ramp-Up |
循环次数 |
总请求数 |
登录请求数 |
总错误数 |
总错误率 |
平均响应时间 |
最大响应时间 |
总吞吐量 |
| 低并发组 |
5 |
2s |
5 |
50 |
25 |
0 |
0% |
6.34ms |
31ms |
31.33/s |
| 中并发组 |
10 |
3s |
5 |
100 |
50 |
0 |
0% |
6.17ms |
35ms |
37.27/s |
| 高并发组 |
20 |
5s |
5 |
200 |
100 |
9 |
4.5% |
7.63ms |
37ms |
42.22/s |
登录接口对比:
| 对比组 |
登录样本数 |
登录错误数 |
登录错误率 |
登录平均响应时间 |
登录最大响应时间 |
主要现象 |
| 5 线程 |
25 |
0 |
0% |
6.88ms |
10ms |
登录接口正常响应 |
| 10 线程 |
50 |
0 |
0% |
7.20ms |
35ms |
登录接口正常响应,最大响应时间增加 |
| 20 线程 |
100 |
9 |
9.0% |
8.80ms |
28ms |
登录接口出现 429,限流生效 |
从对比结果看,5 线程和 10 线程下健康检查与登录接口都没有错误;当线程数提升到 20 后,登录接口出现 429。这个变化说明当前瓶颈不主要体现在响应时间上,而是体现在登录接口的访问频率控制上。也就是说,系统在低中并发下响应很快,高并发下不是"慢",而是被限流策略主动拒绝了一部分请求。
如果业务目标是防止登录暴力破解,这个结果是合理的安全保护;如果业务目标是高并发登录压测通过,则需要调高登录接口限流阈值,或把性能测试账号、测试 IP 纳入专用测试策略。
十一、安全性测试
| 用例编号 |
测试点 |
预期结果 |
实际结果 |
结论 |
| S-01 |
密码输入框 |
密码不明文展示 |
type=password |
通过 |
| S-02 |
未登录访问受保护路由 |
自动跳转登录页 |
未登录访问受保护页停留登录页 |
通过 |
| S-03 |
登录态接口鉴权 |
使用 Authorization: Bearer <token> 后可识别用户 |
check-login 返回 isLogin=true |
通过 |
| S-04 |
登录接口限流 |
高并发登录时可限制请求 |
JMeter 出现 429 |
通过,但需按业务目标评估阈值 |
| S-05 |
敏感信息 |
报告不展示真实 token、密钥 |
只展示 token 长度 |
通过 |
十二、兼容性与可用性测试
| 用例编号 |
测试点 |
实际结果 |
结论 |
| C-01 |
Chrome 桌面端首页 |
正常访问 |
通过 |
| C-02 |
Chrome 桌面端登录页 |
正常访问 |
通过 |
| C-03 |
Chrome 桌面端登录后页面 |
首页、面试、聊天、报告页可访问 |
通过 |
| C-04 |
移动端 390px 首页 |
页面正常显示 |
通过 |
| C-05 |
移动端 390px 面试页 |
页面正常显示 |
通过 |
| U-01 |
登录表单可识别性 |
用户名、密码、登录进入按钮清晰 |
通过 |
| U-02 |
空报告页可理解性 |
报告页可加载并显示当前状态 |
通过 |
十三、缺陷统计与分析
| 缺陷编号 |
严重级别 |
来源 |
现象 |
影响 |
建议 |
| BUG-01 |
P1 |
后端单元测试 |
InterviewRecordServiceImplTest 期望所有权校验调用 1 次,实际 3 次 |
CI 无法通过;可能存在重复校验或测试断言过窄 |
核对 saveInterviewRecordFromRedis 与 saveInterviewRecord 调用链,确认是实现重复还是测试期望需更新 |
| BUG-02 |
P1 |
后端单元测试 |
XunfeiAudioServiceAssemblerTest 期望 AB,实际 AAB |
实时语音转写可能出现片段重复 |
检查无 pgs partial 场景是否应替换 live snapshot,而不是追加 |
| BUG-03 |
P2 |
真实 API 补测 |
无 token 调用创建会话接口返回 B000001 系统执行出错 |
未登录/鉴权失败场景对前端和用户不够明确,也不利于接口调用方判断 |
后端统一鉴权失败错误码,返回未登录或无权限语义 |
| BUG-04 |
P2 |
真实 API 补测 |
查询不存在的报告详情返回 code=0 但缺少有效报告数据 |
前端可能误判为正常报告,报告详情空状态契约不清晰 |
不存在 session/report 时返回明确 not found 或标准空状态 |
| BUG-05 |
P3 |
真实 API 补测 |
旧报告列表路径返回 B000001 系统执行出错 |
如果旧前端或外部调用方仍使用该路径,会出现兼容问题 |
明确废弃路径并返回 404/410,或保留兼容转发 |
| PERF-01 |
P2 |
JMeter |
登录接口 20 线程压测下 9% 请求返回 429 |
高并发登录成功率下降 |
明确登录限流阈值,区分安全防刷和容量目标 |
| RISK-01 |
P3 |
参考资料 |
CSDN 参考正文无法访问 |
报告结构无法逐字对齐 |
如需完全对齐,需补充参考文章正文或截图 |
缺陷分布:
| 类型 |
数量 |
| 后端自动化失败 |
2 |
| 真实 API 补测缺陷/兼容风险 |
3 |
| 性能/限流风险 |
1 |
| 资料访问限制 |
1 |
十四、测试结论
本次测试完成了前端页面、后端接口、自动化单元测试和 JMeter 性能测试四类验证。已确认:
- 前端首页、登录页、面试入口、聊天页、报告页和移动端页面可正常访问。
- 用户登录、注册、登录态检查接口可用,登录接口返回 token,前端登录后可进入受保护页面。
- 前端 Vitest 测试通过,25 个测试文件、127 条测试用例全部通过。
- 后端 Maven 全量单元测试未通过,存在 2 个失败用例,不能作为通过状态交付。
- JMeter 压测真实执行并生成 Dashboard,健康检查接口稳定,登录接口在并发下触发 429 限流。
- 上一版标记为未完成的补充用例已完成执行分类整理;其中真实 API 补测发现 2 个接口缺陷和 1 个旧路径兼容风险,已单独进入缺陷表。
综合判断:当前系统基础页面、认证链路和主要面试入口可用,前端自动化补测已通过;但后端自动化质量门禁未通过,且部分鉴权/报告异常接口契约不够清晰。性能测试结果显示登录接口具备限流保护,但若目标是高并发登录容量,需要进一步调优限流策略。
感谢阅读,记得点赞、关注、收藏,欢迎各位评论区交流!!!
加粗样式