1. 问卷考试系统测试报告解析
最近在帮客户验收一个在线问卷考试系统,完整跑了一遍测试流程。这个系统主要用于企业内训考核和学校在线测试场景,支持单选、多选、填空、简答等题型,具备自动组卷、防作弊和成绩分析功能。作为经历过十多个同类项目的测试老手,我把核心测试要点和踩坑经验整理成这份报告,特别适合需要实施在线考试系统的团队参考。
测试过程中发现,这类系统最关键的不仅是功能实现,更要关注高并发下的稳定性、不同题型评分逻辑的准确性,以及防作弊机制的可靠性。我们模拟了200人同时在线考试的场景,针对系统反应速度、数据一致性、异常处理等维度进行了全面验证。以下是具体测试方案和结果分析。
2. 测试环境与准备工作
2.1 硬件配置方案
测试服务器采用4核8G内存的云主机,带宽10Mbps,这个配置能满足100-200人同时在线的需求。数据库单独部署在2核4G的实例上,使用MySQL 5.7版本。实际部署时建议根据预估考生人数调整配置,每增加100人需要增加1核CPU和2G内存。
重要提示:一定要在测试环境模拟生产环境的配置,很多性能问题在低配测试机上无法复现
2.2 测试数据准备
我们使用Python脚本生成了三类测试数据:
- 用户数据:500个虚拟考生账号,包含不同权限角色
- 题库数据:20套试卷模板,共计1000道题目
- 考试记录:预生成300条历史考试数据用于统计分析测试
# 示例题库生成代码 import random import string def generate_question(question_type): if question_type == "single_choice": options = [''.join(random.choices(string.ascii_uppercase, k=10)) for _ in range(4)] return { "question": "示例单选题" + str(random.randint(1,100)), "options": options, "answer": random.choice(options) }2.3 测试工具选型
主要使用了以下测试工具组合:
- JMeter:用于并发压力测试
- Selenium:界面自动化测试
- Postman:API接口测试
- LoadRunner:极限负载测试
- Fiddler:网络请求监控
工具组合的选择考虑了测试全面性和执行效率,特别是JMeter和Selenium的组合可以模拟真实用户操作路径。
3. 核心功能测试方案
3.1 用户权限测试矩阵
设计6种角色进行权限验证:
| 角色 | 组卷权限 | 阅卷权限 | 考试权限 | 数据导出 |
|---|---|---|---|---|
| 超级管理员 | ✓ | ✓ | ✓ | ✓ |
| 题库管理员 | ✓ | × | × | × |
| 阅卷老师 | × | ✓ | × | × |
| 考生 | × | × | ✓ | × |
| 班主任 | × | × | × | ✓ |
| 审计员 | × | × | × | ✓ |
测试发现班主任角色实际上需要阅卷权限,这是需求理解偏差导致的,需要调整权限配置。
3.2 题型评分逻辑验证
重点测试了不同题型的自动评分准确性:
- 单选题:严格匹配答案选项
- 多选题:测试了三种计分方式:
- 全对才得分
- 部分正确按比例得分
- 漏选得一半分
- 填空题:测试了精确匹配和关键词匹配两种模式
- 简答题:验证人工评分的流程完整性
发现多选题在"部分正确按比例得分"模式下,当考生选择全部选项时会错误得满分,这是算法边界条件未处理导致的。
3.3 防作弊机制测试
实施了以下测试方案:
- 标签页切换检测:尝试在考试期间打开新标签页
- 复制粘贴拦截:测试文本复制功能
- 人脸识别抽查:模拟5次识别失败情况
- 答题时间分析:检测异常快速的答题速度
实测发现系统在Firefox浏览器下无法有效拦截右键菜单的复制操作,需要针对不同浏览器做兼容性处理。
4. 性能测试与优化
4.1 并发测试场景设计
设计了4个典型场景:
- 50用户同时登录
- 100用户同时提交试卷
- 200用户持续操作30分钟
- 300用户峰值压力测试
使用JMeter模拟的线程组配置示例:
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="100用户提交测试"> <intProp name="ThreadGroup.num_threads">100</intProp> <intProp name="ThreadGroup.ramp_time">60</intProp> <longProp name="ThreadGroup.duration">300</longProp> </ThreadGroup>4.2 性能瓶颈分析
测试发现的三个主要性能问题:
数据库查询瓶颈:
- 试卷查询未使用缓存
- 考生列表分页查询效率低
前端渲染性能:
- 多选题选项过多时页面卡顿
- 考试倒计时频繁重绘
网络带宽占用:
- 考试监控截图上传未压缩
- 实时保存答题记录频率过高
4.3 优化方案实施
针对性地实施了以下优化:
数据库层面:
- 添加Redis缓存热门试卷
- 优化考生表索引结构
- 引入读写分离
前端优化:
- 实现虚拟滚动加载长列表
- 使用Web Worker处理倒计时
- 图片懒加载
网络传输:
- 启用Gzip压缩
- 调整自动保存间隔为30秒
- 监控图片降质处理
优化后,200并发下的平均响应时间从3.2秒降低到0.8秒,服务器CPU占用率从90%降至45%。
5. 安全测试重点
5.1 常见漏洞扫描
使用OWASP ZAP进行了全面扫描,发现的主要问题:
- XSS漏洞:题库导入处未过滤HTML标签
- CSRF风险:关键操作缺少Token验证
- SQL注入:成绩查询接口存在注入点
- 敏感信息泄露:错误消息暴露服务器路径
5.2 数据安全验证
重点检查了三个方面的安全性:
数据传输:
- 是否全程HTTPS
- 敏感字段是否额外加密
数据存储:
- 密码是否加盐哈希
- 考生答案是否加密
数据隔离:
- 多租户数据是否严格分离
- 权限控制是否到位
发现考生身份证号在数据库中是明文存储,不符合最新个人信息保护要求,需要改为加密存储。
5.3 日志与审计测试
验证了以下日志功能:
- 关键操作日志记录完整性
- 日志防篡改机制
- 审计报表生成准确性
- 异常登录检测灵敏度
建议增加考生操作日志的详细程度,目前缺少答题修改记录的追踪。
6. 兼容性测试要点
6.1 浏览器兼容矩阵
测试了主流浏览器及其不同版本:
| 浏览器 | 版本 | 考试功能 | 监控功能 | 成绩查询 |
|---|---|---|---|---|
| Chrome | 89+ | ✓ | ✓ | ✓ |
| Firefox | 78+ | ✓ | ✓ | × |
| Edge | 44+ | ✓ | ✓ | ✓ |
| Safari | 14+ | ✓ | × | ✓ |
| 微信内置 | - | × | × | ✓ |
发现微信内置浏览器无法正常使用人脸识别监控功能,需要特殊处理。
6.2 移动端适配测试
在三种典型设备上验证:
小屏手机(iPhone SE):
- 选择题选项换行问题
- 答题卡按钮太小
平板设备(iPad Pro):
- 分屏模式下的功能异常
- 横竖屏切换时的布局错乱
大屏手机(Galaxy S21 Ultra):
- 字体缩放比例失调
- 提交按钮位置偏移
建议增加移动端专属的答题界面,简化复杂操作。
7. 测试问题汇总与解决方案
7.1 关键问题清单
整理出优先级最高的5个问题:
- 高并发下成绩统计错误(P0)
- Firefox浏览器复制绕过(P1)
- 多选题评分算法缺陷(P1)
- 移动端布局错乱(P2)
- 微信浏览器兼容性问题(P2)
7.2 典型问题分析示例
以"高并发下成绩统计错误"为例:
问题现象: 当超过150人同时提交试卷时,约5%的考生成绩计算不准确。
原因分析:
- 成绩统计使用单一数据库事务
- 计算过程中产生锁竞争
- 部分更新操作未包含在事务中
解决方案:
- 引入消息队列异步处理成绩计算
- 拆分大事务为多个小事务
- 增加最终一致性校验机制
- 实现成绩重算功能
7.3 测试经验总结
三个最重要的经验教训:
- 提前准备真实规模的测试数据,小数据量测试会掩盖很多并发问题
- 不同题型的评分逻辑要单独验证,这是最容易出错的模块
- 防作弊测试需要覆盖各种浏览器和设备,安全策略的实现方式差异很大
建议在项目早期就建立自动化测试套件,特别是对于核心的组卷和评分功能,每次代码变更都应该跑一遍基础测试用例。