简介:这份资源是面向软件测试人员、质量管理人员及软件开发团队的一份通用型《软件产品测试计划书》PDF文档,依照ISO9000质量管理体系认证要求编写,以「XXXX分析软件」为样例,帮助读者建立起符合规范、可直接套用的测试计划框架。全包共1个文件,为127KB的PDF格式,体积轻巧,便于随项目文档一并归档、传阅与打印。目前已有200人学习下载。文档内容覆盖测试全生命周期:从引言中的目的、项目背景、名词定义与参考资料,到文档测试与系统测试的任务要求;从测试环境搭建(Windows XP、JDK6+Eclipse、QuickTest Professional、Quality Center)到测试组织分工、时间安排与流程规范;再延伸至进度跟踪、系统风险与优先级、问题严重度描述,以及与测试相关的任务划分。其中对文档完整性、一致性、易理解性与操作实例的检查维度,以及功能测试、界面测试、安装部署测试的流程与开始、完成标准均有较细展开,可作为编写《测试用例》《测试问题报告》的基础参考,适合需要补齐测试文档规范的中初级测试从业者收藏研读。
1. 软件产品测试计划书为什么必须先过 ISO9000 这套逻辑
审核老师翻到测试计划书那一页,问的往往不是"你测了多少轮",而是这份计划谁编的、谁批的、依据哪一版需求、改过之后旧版本去哪了。很多团队测试执行并不差,栽就栽在测试计划书只是一份躺在共享盘里的 Word:没有编号、没有版本、没有评审记录,在 ISO9000 质量管理体系认证里,这属于典型的成文信息失控。
ISO9000 认证真正盯的是"过程可以自证",而软件产品测试计划书恰好是设计开发验证环节最关键的证据载体。它把测试目标、范围、环境、准入准出准则、进度、风险、职责一次性写清楚,后面的用例、缺陷、测试报告都挂到它上面形成证据链。
这份通用测试计划书适合三类人:正在准备初次认证或年度监督审核的研发质量负责人,需要向客户交付受控文档的项目经理,以及被临时抓来写测试计划的测试工程师。难点从来不在"写出来",而在写完之后怎么保证它一直有效、一直是最新版本。
2. ISO9000 条款到测试计划书章节的映射与通用模板骨架
2.1 把成文信息、设计验证、放行三类条款翻译成文档要求
写测试计划书之前先做一件事:把标准里那几句抽象的话,翻译成审核现场能拿出来的东西。常见的做法是拿一张对照表,左边写条款关注点,右边写"我要在计划书的第几节提供什么"。审核员不会逐条念标准,他只会问:这个要求在你文档的哪里体现,证据是什么。
| 标准关注点 | 审核员实际要看的 | 测试计划书对应位置 | 客观证据 |
|---|---|---|---|
| 成文信息控制 | 唯一编号、版本、批准人、发放范围 | 封面、文档信息表 | 受控文件清单、发放回收记录 |
| 设计开发验证 | 验证活动有计划并按计划执行 | 测试策略、测试类型、进度 | 计划批准记录、执行记录 |
| 外部提供过程 | 第三方测试、商用工具合规 | 测试环境与工具、外包说明 | 供方评价记录、工具授权 |
| 生产和服务提供 | 未达准则不放行 | 准入准出准则、缺陷等级定义 | 测试报告、放行审批单 |
| 监视和测量资源 | 环境与工具受控、可追溯 | 环境配置表、工具版本 | 环境搭建与变更记录 |
| 不合格输出控制 | 缺陷闭环 | 缺陷管理流程与等级 | 缺陷台账、回归记录 |
| 改进 | 问题有纠正措施 | 风险与改进项 | 不符合项跟踪表 |
注意:条款编号以企业受控的标准文本和体系文件为准,不要拿网传的"iso9000最新版本发布时间"当依据,以受控清单里标了"现行有效"的那一版为准。
2.2 通用测试计划书的最小章节骨架与必填字段
通用模板的价值在于"换个项目也能用",所以骨架要稳定,变量要少而全。我一般把正文固定成 11 节:目的与范围、引用文件、术语与缩略语、测试对象与版本基线、测试策略与测试类型、测试环境与工具、准入准出准则、进度与资源、风险与应对、交付物与记录、职责与批准。前十节是内容,最后一节是授权。
比正文更重要的是封面和文档信息表的字段,这些字段决定了这份文档在体系里能不能被检索、被追溯、被作废。
| 字段 | 示例 | 是否必填 | 用途 |
|---|---|---|---|
| 文档编号 | QMS-TP-PAY-2024007 | 是 | 受控清单的唯一索引 |
| 版本号 | V1.2 | 是 | 修订追溯 |
| 文档状态 | 已批准 | 是 | 防止误用旧版 |
| 产品/项目名称 | 支付网关 V3 | 是 | 与项目计划对齐 |
| 需求基线 | SRS-PAY-V3.0 | 是 | 追溯链起点 |
| 测试环境 | SIT-01 | 是 | 结果可复现 |
| 准入准则 | 冒烟通过率 100% | 是 | 启动判据 |
| 准出准则 | P1/P2 清零 | 是 | 放行判据 |
| 编制/评审/批准 | 张三/评审组/李四 | 是 | 职责与授权 |
| 生效日期 | 2024-06-01 | 是 | 版本有效期 |
准入准出这两栏是最容易被写成废话的地方。"测试通过后进入下一阶段"这种句子在审核时等于没写。合格的写法是带数字的:冒烟用例通过率 100%、代码冻结标签 build-3.7.2、P1 与 P2 缺陷清零、P3 遗留不超过 5 个且有规避方案、性能指标 P95 响应时间不超过 800ms。
2.3 文档编号、版本号与受控状态的命名规则
编号规则要在体系文件里定死,不然三份文档三种写法,清单就对不上。常见结构是"体系前缀-文档类型-产品代号-年份序号-版本",例如 QMS-TP-PAY-2024007-V1.2。年份序号保证唯一,版本号分两级:大版本 V1.0、V2.0 用于基线变更,小版本 V1.1、V1.2 用于文字澄清和细节补充。
状态机只有四个值:草稿、评审中、已批准、已作废。这四个值直接决定文档能不能发出去,建议写进文档元数据里,用脚本卡住,而不是靠人记。
--- doc_no: QMS-TP-PAY-2024007 # 唯一编号,受控清单以此为主键 title: 支付网关 V3 软件产品测试计划书 version: V1.2 # V1.x 小改,V2.0 基线变更 status: 已批准 # 草稿 / 评审中 / 已批准 / 已作废 product: 支付网关 V3 srs_baseline: SRS-PAY-V3.0 # 需求基线,追溯链起点 author: 张三 reviewer: 测试评审组 approver: 李四 effect_date: 2024-06-01 supersedes: QMS-TP-PAY-2024007-V1.1 # 被本版替代的旧版本 ---这套元数据的顺序不要随便动,后面第 5 章的校验脚本会按 key 逐行匹配,顺序乱了脚本照样能跑,但人工 diff 会很难受。
2.4 需求基线与引用文件的一致性核对
最常见的不符合项不是测试计划写得不细,而是它引用的需求版本和系统里在跑的需求版本对不上。计划书里写 SRS-PAY-V2.3,配置管理库里最新基线已经是 V3.0,两份文件各说各话,审核时就是"文件与记录不一致"。
核对动作很简单但必须留痕:把计划书里的需求基线号,与配置管理库中该产品的最新基线号做一次比对,结果写进评审记录。如果确实基于旧基线,就在计划书里说明原因和影响范围,例如"本次仅回归 V2.3 遗留缺陷,不涉及 V3.0 新增模块"。
引用文件一节建议只列三类:上游输入(需求规格说明书、项目计划)、体系依据(质量手册、测试管理程序)、下游输出(测试用例集、测试报告模板)。列多了容易失效,列少了追溯链断裂,三类刚好够用。
3. 测试计划书参数化生成与受控 PDF 输出
3.1 Markdown 模板加变量表的最小可复现流程
通用模板最大的浪费是每次复制粘贴再手改,改漏一处就出现版本内不一致。我一般把正文写成 Markdown 模板,把可变部分抽成变量,用一段脚本渲染,输出 Markdown 再转 PDF。这样一份计划书的产出时间从两小时压到两分钟,而且不会漏字段。
# gen_test_plan.py # 渲染通用测试计划书模板,输出 Markdown,再交给 pandoc 转受控 PDF import datetime from pathlib import Path from string import Template # 模板中变量写成 $doc_no 形式,正文骨架固定不变 tpl = Path("templates/test_plan.md.tpl").read_text(encoding="utf-8") ctx = { "doc_no": "QMS-TP-PAY-2024007", # 唯一编号,与受控清单一致 "version": "V1.2", # 小改递增,基线变更升大版本 "status": "已批准", # 只有已批准才允许发布 "project": "支付网关 V3", "srs_baseline": "SRS-PAY-V3.0", # 需求基线,务必与配置库一致 "env": "SIT-01 / MySQL 8 / JDK 17", "entry": "冒烟用例通过率 100%,代码冻结标签 build-3.7.2", "exit": "P1、P2 缺陷清零,P3 遗留不超过 5 个且有规避方案", "author": "张三", "reviewer": "测试评审组", "approver": "李四", "effect_date": datetime.date.today().isoformat(), } # safe_substitute 遇到未定义变量不会抛异常,方便模板里保留待补占位 out = Template(tpl).safe_substitute(ctx) Path("out/test_plan.md").write_text(out, encoding="utf-8") print("生成完成:", ctx["doc_no"], ctx["version"])这段脚本里,doc_no、version、status三个参数决定文档在体系里的身份,不允许在模板正文里硬编码。entry和exit是字符串,但内容必须可量化,脚本不做语法校验,所以第 5 章的检查脚本里专门加了一条命中规则:这两个值里如果出现中文句号后的形容词堆砌而没有数字,人工评审时一律打回。effect_date用当天日期最省事,但正式发布时应改成批准日期。
3.2 必调参数:范围、环境、准入准出与缺陷等级
模板里的默认值不能直接上线,有几个参数必须每个项目重新定。
| 参数 | 默认值 | 调整依据 | 写错的后果 |
|---|---|---|---|
| 测试范围 | 全模块 | 本次变更影响分析 | 范围写大了做不完,写小了漏测 |
| 测试类型 | 功能+回归 | 需求中的非功能指标 | 性能安全无证据 |
| 环境配置 | 单机部署 | 与生产拓扑的差异度 | 缺陷在生产复现不了 |
| 准入准则 | 冒烟通过率 100% | 提测质量历史数据 | 带病提测,返工率高 |
| 准出准则 | P1/P2 清零 | 产品线风险容忍度 | 放行无判据,审核开不符合 |
| 缺陷等级 | P1~P4 | 与缺陷管理工具对齐 | 等级口径不一致,统计失真 |
缺陷等级的口径要和缺陷管理工具里的字段完全一致,否则测试计划里写 P1,工具里只有"严重/一般",统计报表对不上,审核时解释成本极高。范围那一条建议写"包含"和"不包含"两个清单,明确排除项比明确包含项更能体现变更影响分析做过。
3.3 转受控 PDF 的三条命令与页码字体设置
Markdown 定稿后要出受控 PDF,归档只放 PDF 只读版本,这是体系里最省事的做法:源文件留在受控库里可改,PDF 用于发放、评审和归档。三条常见路径按场景选。
# 方式一:pandoc + xelatex,中文字体必须显式指定,否则 PDF 里中文变方框 pandoc out/test_plan.md \ -o out/QMS-TP-PAY-2024007_V1.2.pdf \ --pdf-engine=xelatex \ -V CJKmainfont="Noto Sans CJK SC" \ -V geometry:margin=2.2cm \ -V fontsize=11pt \ --toc --toc-depth=3 \ --metadata title="支付网关 V3 软件产品测试计划书" # 方式二:已有 Word 模板、要保留页眉页脚和公司封面时走 LibreOffice 无头转换 soffice --headless --convert-to pdf --outdir out out/test_plan.docx # 方式三:正文由 web 页面渲染时,走无头浏览器的网页 pdf 打印链路 chrome --headless --disable-gpu --print-to-pdf=out/plan.pdf out/test_plan.htmlCJKmainfont是最容易踩的坑,字体名写错不报错,直接输出方框字。geometry:margin建议不小于 2cm,留出装订和签章位置。方式三生成的文件默认没有页码,需要在页脚模板里用pageNumber和totalPages补上,否则打印出来几十页无法引用"第几页第几节"。
3.4 修订后重新出受控版本:版本对照与作废处理
每次改版都要留一张版本对照表,写清改了哪一节、为什么改、影响了哪些下游文档。评审时只对差异部分评审,效率高很多;审核时这张表就是"变更受控"的直接证据。
| 版本 | 日期 | 变更章节 | 变更原因 | 影响的下游文档 |
|---|---|---|---|---|
| V1.0 | 2024-05-08 | 全文 | 首次发布 | 用例集 V1.0 |
| V1.1 | 2024-05-20 | 7.2 准出准则 | 评审意见,补充性能指标 | 测试报告模板 V1.1 |
| V1.2 | 2024-06-01 | 6.1 环境配置 | 环境扩容,节点数变更 | 环境搭建记录 |
旧版本不要删,标记为已作废后归档到独立目录,发放记录里注明回收情况。评审阶段如果需要批注,把 PDF 转 Word 交给评审人写批注,批注处理完只把最终 PDF 入受控库;不要用 pdf 编辑器直接在归档件上改字加签章,那样归档件的哈希就对不上了。
4. 测试过程留痕:追溯矩阵、评审签署与变更控制
4.1 需求-用例-缺陷追溯矩阵的 SQL 落地方案
测试计划书只写了"要测什么","测到了没有"要靠追溯矩阵回答。矩阵不需要专门的工具,三张表加两条 SQL 就能跑起来,数据源直接来自需求管理库和缺陷库。
-- 追溯矩阵三张基础表,字段名与既有工具保持一致,避免二次清洗 CREATE TABLE req ( req_id VARCHAR(32) PRIMARY KEY, -- 需求编号,与 SRS 完全一致 title VARCHAR(200) NOT NULL, baseline VARCHAR(32) NOT NULL, -- 需求基线版本 priority VARCHAR(4) NOT NULL -- P1~P4 ); CREATE TABLE testcase ( case_id VARCHAR(32) PRIMARY KEY, req_id VARCHAR(32) NOT NULL, -- 用例挂在需求上,一个需求可多条 plan_no VARCHAR(32) NOT NULL, -- 对应测试计划书编号 type VARCHAR(16), -- 功能/性能/兼容/安全 FOREIGN KEY (req_id) REFERENCES req(req_id) ); CREATE TABLE defect ( bug_id VARCHAR(32) PRIMARY KEY, case_id VARCHAR(32), -- 执行哪条用例发现的 severity VARCHAR(4) NOT NULL, -- P1~P4,口径与计划书一致 status VARCHAR(16) NOT NULL, -- 新建/修复中/已关闭/已拒绝 found_at DATE NOT NULL, FOREIGN KEY (case_id) REFERENCES testcase(case_id) );-- 准出前的风险清单:无用例覆盖的需求,或高等级缺陷未闭环的需求 SELECT r.req_id, r.title, r.priority, COUNT(DISTINCT c.case_id) AS case_cnt, SUM(CASE WHEN d.severity IN ('P1','P2') AND d.status <> '已关闭' THEN 1 ELSE 0 END) AS open_high_bug FROM req r LEFT JOIN testcase c ON c.req_id = r.req_id AND c.plan_no = 'QMS-TP-PAY-2024007' LEFT JOIN defect d ON d.case_id = c.case_id WHERE r.baseline = 'SRS-PAY-V3.0' GROUP BY r.req_id, r.title, r.priority HAVING COUNT(DISTINCT c.case_id) = 0 OR SUM(CASE WHEN d.severity IN ('P1','P2') AND d.status <> '已关闭' THEN 1 ELSE 0 END) > 0 ORDER BY r.priority;第二条语句的plan_no是关键过滤条件,它把矩阵锁定在这一版测试计划的范围内,避免历史用例把覆盖率刷虚。HAVING里两个条件用OR连接,输出的是"没覆盖"和"覆盖了但高等级缺陷没关"两类需求,正好就是准出评审要看的清单。如果这条查询在预期时间返不回结果,说明需求编号在需求库和用例库之间没有统一,先修数据再谈覆盖率。
4.2 评审记录与批准签署怎么写才算客观证据
评审记录常见的问题是只写"已评审,通过"。这种记录在审核现场几乎无效,因为它回答不了"谁评的、评了什么、提出什么、怎么处理"。一份能用的评审记录至少包含四块:评审对象与版本、参与人及角色、逐条意见与处理结论、结论与签署。
| 检查项 | 合格表现 | 典型缺陷 |
|---|---|---|
| 评审对象 | 明确到文档编号与版本 | 只写"测试计划" |
| 参与人 | 列出姓名、角色、所属部门 | 只写"测试组" |
| 意见闭环 | 每条意见有问题描述+处理结果 | 只写"已修改" |
| 结论 | 通过/有条件通过/不通过 | 无结论 |
| 签署 | 手签或电子签,带日期 | 打印体姓名无日期 |
有条件通过的场景要特别处理:把条件写进记录,并约定复评时间点,复评记录单独留档。电子签要能追溯到账号和时间戳,单纯的打印体姓名不具备签署效力。
4.3 变更控制:测试计划改版的触发条件与影响分析
计划书不是写完就冻结,改是正常的,不改反而不正常。关键是定义清楚什么情况下必须改版。触发条件我一般列四条:需求基线升级、测试范围增减、准出准则调整、测试环境发生拓扑级变化。前三条升大版本,第四条升小版本并同步更新环境搭建记录。
变更影响分析要回答三个问题:哪些章节要改、哪些下游文档要跟着改、已执行的用例和已发现的缺陷还算不算数。第三点最容易被忽略——准出准则收紧以后,之前按旧准则判定通过的那些模块是否需要补测,这个结论必须写进变更记录,否则就是"改了文档没改执行"。
4.4 准入准出判定与测试报告的衔接
测试报告是测试计划的执行结果,两份文档的章节顺序最好对齐,审核员顺着看下来不用来回翻。准入判定留准入检查表,准出判定留准出检查表,每一条准则后面写实测值,而不是打勾。
举个具体的:准出准则写"P1、P2 缺陷清零",准出检查表里就要写"截至 2024-06-10,P1 未关闭 0 个,P2 未关闭 0 个,P3 未关闭 4 个,均已登记规避方案"。带日期的快照值是关键,它把"当时的状态"固定下来,否则事后无法复现判定依据。
5. 内审外审前的自检:用脚本扫一遍测试计划书的符合性
审前一两天再靠人肉翻文档,基本必漏。把可判定的规则写成脚本,跑一遍就能把八成低级问题挡在会议室门外。
# 扫描受控测试计划书目录,检查元数据字段与状态合规性 for f in docs/test-plan/*.md; do echo "== $f" # 必填字段逐项检查,缺一个就打印出来 for key in doc_no version status srs_baseline entry exit approver effect_date supersedes; do grep -q "^${key}:" "$f" || echo " 缺失字段: $key" done # 草稿版不允许出现在受控发布目录,这是最常见的一类不符合 grep -q "^status: 草稿" "$f" && echo " 警告: 草稿版混入受控目录" # 准入准出准则必须含数字,纯形容词视为未量化 grep -E "^(entry|exit):" "$f" | grep -qv "[0-9]" && echo " 警告: 准入准出准则未量化" done # 归档 PDF 的可检索性检查,审核时要能全文搜索 for p in docs/test-plan/*.pdf; do n=$(pdftotext -layout "$p" - | tr -d '[:space:]' | wc -c) [ "$n" -lt 500 ] && echo " 警告: $p 文本层过薄,可能是纯图片扫描件" done脚本里supersedes字段容易被漏,它的作用是标出被本版替代的旧版本,缺了这个字段,受控清单里就会同时出现两个"有效版本"。第二条循环里的pdftotext检查很有用:有些团队扫描签章后回填 PDF,输出的是图片页,全文检索搜不到任何正文,审核时想快速定位"第 7.2 节准出准则"就得一页页翻,体验和效率都会受影响。
| 常见不符合项 | 触发原因 | 快速修法 |
|---|---|---|
| 版本与受控清单不一致 | 改版后未更新清单 | 以清单为准回填元数据 |
| 引用需求基线过期 | 需求升级未同步 | 更新 srs_baseline 并写变更记录 |
| 审批人无授权 | 代签、越权签 | 对照岗位授权表重签 |
| 准出准则不可测量 | 写成定性描述 | 改成带数值的判据 |
| 评审记录无闭环 | 只写"已修改" | 补意见条目与处理结果 |
| 归档件为扫描图片 | 签章后转图 | 保留文本层或补 OCR 文本 |
自检跑完还有一件事:把条件为"有条件通过"的历史评审记录捞出来,确认复评已经完成。这类记录在时间线上最容易被遗忘,而审核员恰恰喜欢沿着时间线追。把上面这段脚本挂到发布流水线的前置检查里,草稿版和未量化准则就再也进不了受控目录,剩下的时间可以留给真正需要人来判断的追溯逻辑。
本文还有配套的精品资源,点击获取