[T.16] 团队项目:Beta 阶段测试报告
| 这个作业属于哪个课程 | 北航2026年春季软件工程 |
|---|---|
| 这个作业的要求在哪里 | 团队项目:测试报告 |
| 我在这个课程的目标是 | 完成软件开发,感受软件工程流程 |
| 这个作业在哪个具体方面帮助我实现目标 | 系统地完成软件测试并量化质量 |
一、测试计划
1.1 测试目标
依据规格说明书,对后端每个模块的正常路径、边界条件、异常与权限分支进行验证,做到可在任意机器与 CI 中稳定复现,并量化代码覆盖率,为 Beta 发布提供质量依据。
1.2 测试范围
覆盖后端四层全部模块:
- 核心层:配置(
config)、安全(JWT/bcrypt,security)、依赖与鉴权(dependencies); - 服务层:用户、POI、Token 黑名单、学期信息、课表解析、AI 学习计划、预习、体育配置、知识库、教务系统对接;
- 数据层:ORM 模型、Pydantic Schema 校验;
- 接口层:认证、用户、日程、POI、预习、空教室、教务导入、学习计划、AI 对话等路由。
异步用例统一 asyncio_mode = auto,接口测试使用 httpx.AsyncClient + ASGITransport 进程内调用。
1.3 测试规模
26 个测试文件,165 个测试用例,覆盖核心层、服务层、数据层、接口层全部模块。
二、测试过程
2.1 运行方式
cd backend
export JWT_SECRET_KEY="test-secret-key-for-testing-only-32chars"
pip install pytest pytest-asyncio pytest-cov httpx
pytest tests/ --cov=app --cov-report=term-missing -q
三、测试结果
| 指标 | 数值 |
|---|---|
| 用例总数 | 165 |
| 通过 (passed) | 163 |
| 预期失败 (xfailed) | 2(对应已定位 Bug) |
| 失败 (failed) | 0 |
| 代码覆盖率 | 94%(1356 行语句,未覆盖 82 行) |
| 耗时 | 约 27s |
分模块覆盖率(节选): 核心安全/配置、ORM 模型、全部 Schema、user_service、poi_service、knowledge_service、token_blacklist、sports/study/user/preview API 等达 100%;study_plan_service 93%、semester_service 92%、timetable_parser 86%、edu_system 80%、preview 82%。未覆盖主要集中在外部依赖(教务、AI)的异常分支与 dependencies.py(68%) 的部分鉴权回退路径。
四、问题回答
4.1 在测试过程中发现了多少 Bug?
测试共发现 3 个问题(1 个功能性 Bug + 2 个安全/配置隐患):
| # | 问题 | 严重级 | 修复状态 |
|---|---|---|---|
| 1 | app/api/sports.py:SportsVenueResponse(name=..., **venue.model_dump()) 中 model_dump() 已含 name,关键字重复 → 调用 /sports/、/sports/{venue_name} 抛 TypeError(HTTP 500),场馆列表/详情接口不可用 |
高(功能 500) | 【待确认】改为 SportsVenueResponse(**venue.model_dump()) |
| 2 | app/services/preview.py:硬编码真实形态的 MiniMax API Key |
高(安全) | 【待确认】改为环境变量读取并轮换密钥 |
| 3 | main.py:CORS allow_origins=["*"] 过宽 |
中(配置) | 【待确认】上线前收敛允许来源 |
4.2 你是怎么进行场景测试的?
围绕"不同用户如何使用本系统"设计端到端场景,验证功能组合是否满足真实需求。
用户画像与需求:
| 用户 | 目标 / 需求 | 用到的功能组合 |
|---|---|---|
| 新生 | 注册账号、首次配置课表 | 注册(8 位数字邮箱前缀自动提取学号)→ 登录拿 Token → 教务系统导入课表 → 冲突处理 |
| 在校生(日常) | 管理日程,避免时段冲突 | 登录 → 日程增删改查 → 时段冲突校验 |
| 备考学生 | 生成 AI 学习计划并落地 | 登录 → 输入目标/周期/已占用时段 → 生成计划存 Redis → 确认导入日程 |
| 找场地/空教室的学生 | 查场馆、空教室、校内地点 | 体育场馆列表/详情 → 空教室入口 → POI 按分类/关键词/距离查询 |
| 预习/资料用户 | 获取预习资料、管理知识库 | 预习助手(本地→联网→兜底)→ 知识库上传/列表/删除(按用户隔离 + 权限校验) |
这些场景如何被测试覆盖:
- 认证全链路:注册 → 登录 → 访问受保护接口 → 登出(Token 入 Redis 黑名单)→ 刷新 Token;验证黑名单后旧 Token 失效、用户不存在/Token 失效均返回 401。
- 权限组合:POI 查询公开,增改删需管理员——分别用普通客户端与管理员客户端验证 403/200 分流。
- 日程冲突:插入重叠时段校验冲突逻辑,验证课表批量初始化。
- AI 学习计划两步式:生成(存 Redis)与确认(导入日程)分开测;并测无 Key / 调用失败时回退本地兜底计划。
- 预习三级回退:本地命中 → 联网生成 → 占位兜底,分别验证返回的
source为 local/online/none。 - 教务导入:mock CAS 登录与课表下载,验证 Excel 解析(真实生成 xlsx 解析)与导入冲突处理。
每个场景都覆盖"正常 + 边界 + 失败回退"三类路径,确保功能组合在依赖不可用时仍有合理降级。
4.3 测试矩阵
| 维度 | 取值 |
|---|---|
| 被测层 | FastAPI 后端(API + 服务 + 数据层) |
| 操作系统 | Linux(Ubuntu 系容器) |
| 数据库 | SQLite 内存库(替代 MySQL) |
| 缓存 | FakeRedis(替代 Redis 7) |
| 外部服务 | 教务 CAS、MiniMax —— httpx 打桩 |
| 测试类型 | 单元 + 接口集成(进程内 ASGI) |
前端(微信小程序)建议矩阵:
| 维度 | 建议取值 |
|---|---|
| 小程序端 | 微信开发者工具模拟器 + 真机:iOS、Android、鸿蒙 |
| 微信版本 | 当前稳定版 + 上一版本(验证基础库兼容) |
| 屏幕/分辨率 | 小屏(如 iPhone SE)、大屏(主流安卓/iPhone Pro Max) |
| 网络 | 正常 / 弱网 / 离线(验证降级与兜底) |
4.4 Beta 版本的出口条件
满足以下条件即认定软件足够好、可发布 Beta:
- 核心场景可用:注册登录、教务导入课表、日程增删改查与冲突校验、AI 学习计划生成并回填、地图/场馆/空教室/POI 查询等典型场景端到端跑通,无阻断性故障。
- 无未关闭的高/严重级 Bug:所有 P0/P1 Bug(如 sports 接口 500、硬编码密钥)均已在 Issue 记录并修复关闭。
- 测试全绿:后端代码覆盖率 ≥ 90%(当前 94%),Ruff 与 mypy 检查通过。
- 真机验证通过:微信小程序在至少 iOS + Android 各一款主流机型上完成冒烟测试与核心流程真机调试,关键页面无崩溃/错位。
- 发布前置就绪:域名/服务器备案完成、后端在服务器稳定运行、小程序通过微信审核。
五、结论
后端测试通过率 100%(163 passed / 2 xfailed / 0 failed),覆盖率 94%,并定位出 1 个功能性 Bug 与 2 个安全/配置隐患。
浙公网安备 33010602011771号