5.1 制定测试计划:明确范围、环境与优先级¶
不要等到项目“差不多完成”才开始随便点一点¶
测试计划不是一张形式表格
第四篇的集成验收已经证明项目能够连续演示,但这不等于全部功能、异常情况和权限规则都经过了系统验证。
测试计划要回答:这个版本测什么、暂时不测什么、怎样测、谁来测、什么结果算通过、发现问题后怎样处理。 先有计划,后面编写测试用例、记录缺陷和部署验证才不会遗漏重点。
本节学习目标
基于需求分析说明书、系统设计说明书和 v0.5 集成版本,确定测试基线、测试范围、测试环境、测试数据、优先级与通过标准,完成一份可以实际执行的《测试计划》。
🎯 本节完成后,你要交付¶
| 成果 | 要求 |
|---|---|
| 测试基线 | 明确本次测试对应的需求、设计、代码分支或提交版本 |
| 测试范围 | 列出必测功能、核心流程、权限、异常与边界;同时写明暂不测试内容 |
| 测试环境说明 | 记录系统版本、数据库、浏览器、访问地址、部署方式和测试账号 |
| 测试数据方案 | 说明初始化数据、专用测试数据和数据恢复方式 |
| 测试优先级 | 区分阻断、核心、高优先级和一般优化问题 |
| 通过标准 | 写清每一类测试怎样算通过,哪些问题必须修复 |
| 《测试计划》 | 一份后续可以据此编写测试用例并执行的计划文档 |
本节不要求马上把全部问题修完
本节的重点是设计可执行的测试工作。发现问题可以先记录;下一节再通过测试用例获取证据,后续小节再修复并进行回归验证。
一、先理解:测试计划、测试用例和测试报告有什么不同¶
很多同学会把三者混在一起。它们分别解决不同问题:
| 文档 | 主要问题 | 编写时机 | 典型内容 |
|---|---|---|---|
| 测试计划 | 为什么测、测什么、怎样组织? | 测试开始前 | 范围、环境、人员、优先级、通过标准、风险 |
| 测试用例 | 某个功能具体怎样操作和判断? | 执行测试前或执行中 | 前置条件、步骤、预期结果、实际结果 |
| 缺陷记录 | 发现了什么问题,怎样复现和处理? | 发现问题后 | 现象、影响、严重程度、复现步骤、状态 |
| 测试报告 | 最后测了什么、结果怎样、还有什么风险? | 测试结束后 | 覆盖情况、通过率、缺陷统计、结论 |
可以把它们理解为:
课程项目的测试重点
课程项目不要求进行大型商业系统的全量性能压测或安全渗透测试,但必须验证:项目能启动、核心流程能闭环、权限不能绕过、异常有明确处理、部署后仍可运行。
二、第一步:冻结本次测试基线¶
测试必须对应一个明确版本。否则今天测的是一套代码,明天修复时又混入新功能,测试结果就无法说明问题。
在《测试计划》开头记录:
1. 记录代码版本¶
在开始测试前执行:
确认:
- 当前工作区没有忘记提交的关键代码;
- 测试版本能够通过分支、标签或提交编号定位;
- 需求、设计、数据库脚本和代码属于同一阶段;
- 测试期间不随意合并无关功能;
- 修复问题后会产生新的提交,便于回归测试。
2. 建议创建测试分支或版本标签¶
个人项目至少在 README 或测试计划中写清提交编号;条件允许时,可建立测试分支或标签:
不要测试“脑海中的版本”
如果不能说清当前测试的是哪一个版本,就无法判断某个问题是否已经修复,也无法在部署后复现测试结果。
三、第二步:从需求中提取测试范围¶
测试范围不能只按页面菜单罗列。应从用户、功能、业务规则、权限、状态和验收条件出发,确保测试能够回答“需求是否真正实现”。
1. 先确定必测范围¶
课程项目建议至少覆盖以下六类内容:
| 范围 | 必须回答的问题 | 示例 |
|---|---|---|
| 启动与基础能力 | 系统能否安装、启动、连接数据库? | 初始化脚本能否执行、首页能否打开 |
| 身份认证 | 用户能否正确注册、登录、退出? | 错误密码是否拒绝、登录过期如何处理 |
| 核心功能 | 每个必做功能是否完成? | 新增、查询、修改、删除、分页 |
| 核心业务流程 | 多角色能否连续完成业务闭环? | 学生报修 → 管理员分配 → 维修处理 → 学生确认 |
| 规则与状态 | 非法操作是否被拒绝且数据不被错误修改? | 名额已满不能报名、已取消记录不能再次确认 |
| 权限与数据范围 | 用户能否只访问自己有权操作的数据? | 普通用户不能调用管理员接口 |
2. 使用“需求—测试点”对应表¶
把《需求分析说明书》中的必做需求逐项列入。每条需求至少有一个测试点,不能只写“已测试”。
| 需求编号 | 需求或规则 | 用户角色 | 测试点 | 优先级 | 证据类型 |
|---|---|---|---|---|---|
| FR-01 | 用户可以使用账号密码登录 | 所有用户 | 正确密码成功、错误密码失败、未登录访问限制 | P0 | 页面截图、接口响应 |
| FR-02 | 用户可以提交【业务对象】 | 普通用户 | 必填校验、正常提交、重复提交 | P0 | 页面、数据库记录 |
| BR-03 | 【状态】后不可重复操作 | 普通用户/管理员 | 再次操作被拒绝,数据不变 | P0 | 接口响应、数据库查询 |
| PR-01 | 管理员才能维护【业务对象】 | 管理员 | 普通用户页面与接口均被拒绝 | P0 | 403/401 响应 |
| FR-04 | 支持条件查询和分页 | 所有用户 | 空条件、组合条件、首页、末页、空结果 | P1 | 页面、接口响应 |
优先级建议:
| 优先级 | 含义 | 处理要求 |
|---|---|---|
| P0 | 阻断启动、登录、核心流程、数据正确性或权限安全 | 必须测试;发现问题必须修复后才能交付 |
| P1 | 重要功能和常用异常场景 | 必须测试;严重问题应修复或明确说明限制 |
| P2 | 体验优化、非核心页面、低频边界 | 尽量测试;可以放入后续优化清单 |
先测 P0,再测 P1
如果项目无法登录、核心流程无法闭环或普通用户能修改管理员数据,页面颜色、动画和排版再好也不能算可交付。
四、第三步:围绕核心流程设计测试场景¶
单个 CRUD 功能通过,不代表业务流程正确。对第四篇已经完成的核心闭环,应从开始到结束设计场景。
示例:活动报名系统¶
可提取的测试场景:
| 场景 | 前置条件 | 关键验证点 | 预期结果 |
|---|---|---|---|
| 正常报名 | 活动已发布且有剩余名额 | 页面、接口、数据库记录、名额变化 | 报名成功,名单可见,剩余名额减少 |
| 重复报名 | 当前学生已报名 | 业务规则和数据一致性 | 操作被拒绝,名额不再减少 |
| 名额已满 | 剩余名额为 0 | 边界状态 | 操作被拒绝,给出明确提示 |
| 未登录报名 | 未登录 | 登录权限 | 被要求登录,不能写入报名记录 |
| 普通用户发布活动 | 普通用户登录 | 管理员权限 | 页面入口隐藏且接口拒绝 |
核心流程测试问题清单¶
针对自己的项目逐一回答:
- 核心流程由哪些角色依次完成?
- 每一步需要哪些前置数据和状态?
- 成功后哪些表、字段或统计值发生变化?
- 失败时是否会留下半完成数据?
- 重复点击或重复请求会怎样?
- 切换到下一角色后,是否能看到正确任务或结果?
- 使用不同账号是否会发生越权访问?
- 重新启动或部署后,流程是否还能完成?
五、第四步:明确暂不测试的内容¶
“范围有限”不是逃避测试,而是明确课程项目的测试边界,防止做出无法证明的承诺。
可以在计划中写:
不能把“没有测”写成“没有问题”
例如没有做并发测试,就不能宣称系统支持高并发;没有接入真实支付,就不能在演示中说支付功能已上线。
六、第五步:准备测试环境和账号¶
测试环境要尽量接近最终交付环境,并且能够重复恢复。
1. 环境记录表¶
| 项目 | 实际值 | 说明 |
|---|---|---|
| 操作系统 | 【填写】 | Windows / macOS / Linux |
| JDK / Node / Tomcat 版本 | 【填写】 | 按所选技术路线填写 |
| 数据库版本 | 【填写】 | 例如 MySQL 8.x |
| 浏览器 | 【填写】 | 建议 Chrome 或 Edge 最新版 |
| 启动方式 | 【填写】 | IDEA、命令行、Docker Compose 等 |
| 前端访问地址 | 【填写】 | 例如 http://localhost:5173 |
| 后端或应用地址 | 【填写】 | 例如 http://localhost:8080 |
| 数据库初始化方式 | 【填写】 | SQL 脚本、Flyway、迁移命令 |
| 代码版本 | 【填写】 | 分支、标签或提交编号 |
2. 测试账号至少覆盖角色差异¶
| 角色 | 账号 | 用途 | 是否可重置 |
|---|---|---|---|
| 管理员 | 【填写】 | 发布、审核、维护、统计等管理操作 | 是 / 否 |
| 普通用户 | 【填写】 | 提交、查询、查看个人记录 | 是 / 否 |
| 其他业务角色 | 【填写】 | 处理、确认、配送、维修等 | 是 / 否 |
| 未登录状态 | 不登录 | 验证受限页面和接口 | 不适用 |
不要使用个人真实密码、手机号、邮箱和身份证信息作为测试数据。
3. 测试数据应具备可控状态¶
准备数据时,不要只放几条“看起来正常”的记录。至少准备:
- 一条可以顺利走完整流程的正常数据;
- 一条处于中间状态、等待下一角色处理的数据;
- 一条已经完成或取消的数据,用于验证非法状态操作;
- 一条属于其他用户的数据,用于验证数据权限;
- 空列表、最大值或接近上限的数据,用于边界场景;
- 可以通过 SQL 或迁移脚本恢复的初始数据。
测试后要能恢复
核心流程测试会改变状态。请记录如何重新导入 SQL、清理测试记录或恢复数据库快照,否则后续测试无法重复执行。
七、第六步:定义通过标准和停止条件¶
测试计划不只写“测一测”,还要规定何时可以进入部署和交付。
1. 最低通过标准¶
以下内容建议设为交付前必须满足:
- 项目可按 README 从相对干净的环境启动;
- 数据库脚本或迁移可以从空库执行;
- P0 功能和核心业务流程测试全部通过;
- 正确账号可以登录,错误账号或密码被拒绝;
- 未登录和越权操作被后端拒绝;
- 关键状态变化不需要手工修改数据库;
- 已知阻断和严重缺陷已修复并完成回归测试;
- 测试中发现的未修复限制已记录在 README 或交付说明;
- 测试证据可以定位到页面截图、接口响应、日志或数据库记录;
- Git 工作区干净,测试对应版本可定位。
2. 停止测试与返回开发的条件¶
遇到下面情况,不要继续“完成更多测试数量”,而应优先回到开发阶段:
| 情况 | 建议处理 |
|---|---|
| 项目无法启动或连接数据库 | 记录为阻断缺陷,修复环境或配置后重新开始冒烟测试 |
| 登录不可用 | 停止后续受限功能测试,优先修复认证链路 |
| 核心流程中断 | 停止扩展功能测试,先定位流程、状态或数据问题 |
| 普通用户可调用管理员接口 | 视为严重权限问题,优先修复后回归 |
| 每次测试都需手改数据库 | 补充页面/接口/脚本,形成可重复流程 |
| 需求或设计本身互相矛盾 | 返回第三篇修订文档,不在代码中临时猜测规则 |
八、第七步:安排测试执行顺序¶
建议按风险从高到低执行,而不是从菜单第一个页面一路点到最后。
推荐的执行分工¶
个人项目也应区分“开发者视角”和“使用者视角”:
| 角色 | 主要工作 |
|---|---|
| 开发者本人 | 准备环境、修复问题、执行接口与数据库验证 |
| 同学体验者 | 按测试步骤操作页面,记录难理解、找不到入口和提示不清的问题 |
| 教师或助教 | 抽查核心流程、需求覆盖和项目真实性 |
| AI 助手 | 协助从需求提取测试点、生成初稿、检查遗漏;不能虚构测试结果 |
AI 可以帮你设计测试,但不能代替你执行
AI 给出的测试用例必须结合真实页面、接口、账号、数据和运行结果确认。截图、日志和实际结果必须由你在系统中取得。
九、填写《测试计划》模板¶
将以下内容复制到项目的 docs/03-测试报告.md 或单独创建 docs/测试计划.md,按项目实际情况填写。
十、提交前自查¶
- 已写清本次测试的代码版本、需求版本和设计版本;
- 每条必做需求至少能找到一个测试点;
- 已覆盖启动、登录、核心流程、状态、异常和权限;
- 已明确不在本次测试范围内的内容;
- 已准备多角色测试账号和可恢复的测试数据;
- 已定义 P0、P1、P2 的优先级;
- 已写清通过标准和必须修复的问题类型;
- 测试环境和启动方式能够由其他同学复现;
- 没有把“还没有测试”写成“已经支持”;
- 测试计划内容与需求、设计和当前代码版本一致。
本节小结¶
测试计划的价值不在于文档写得多,而在于让后面的测试有明确重点:
先确认版本和范围 → 从需求提取测试点 → 优先验证核心流程与权限 → 准备可重复的环境和数据 → 定义通过标准 → 按风险执行测试。
完成本节后,不要直接宣布项目“没有问题”。下一节将把测试计划拆成可执行的测试用例,实际操作系统、记录结果并保存证据。