软件测试体系笔记:从模型到落地

软件测试体系笔记:从模型到落地

整理自关于测试模型与测试分层的讨论,面向切片打印软件(Qt桌面应用 + 齿科医疗场景)的实际工作。

主线:测试思想 → 测试理论 → 测试分层 → 互联网与医疗工业界对比 → 场景落地。


第一部分:测试思想(总纲)

1.1 总钥匙:失败成本决定流程严格程度(风险定价)

场景 出bug的后果 流程取向
互联网产品 回滚/热修复,损失是用户流失 快速迭代,把风险摊平在发布中
医疗/工业软件 物理伤害、批次报废,损失不可承受 前置严格,把风险拦在发布前

理解任何测试流程差异,先问一句:这个产品的失败成本有多高? 流程的严格程度本质上是对风险的定价方式。

1.2 质量成本曲线

质量总成本 = 一致性成本(预防 + 评价)+ 非一致性成本(内部失效 + 外部失效)。

  • 早期预防投入很便宜(评审、UT),后期修复成本急剧上升:需求阶段改错是1倍成本,发布后改错可达10~100倍。
  • 结论:质量是设计出来的、预防出来的,不是测出来的。测试只是质量活动的一环。
  • 但一致性成本并非越高越好,两者存在平衡点(最经济质量控制水平)。

1.3 测试的局限性(必须建立的认知)

  • 测试只能证明缺陷存在,不能证明缺陷不存在(Dijkstra)。全部用例通过 ≠ 无bug。
  • 穷举测试不可能:输入组合是天文数字,测试必然是抽样。
  • 因此测试设计的本质是风险驱动的抽样:把有限的测试资源投到风险最高的地方。
  • 缺陷聚集性(80-20现象):少数模块包含大多数缺陷。测试应聚焦修改频繁的、历史bug多的模块。
  • 杀虫剂悖论:同一套用例反复跑,最终不再能发现新缺陷------用例需要持续评审、更新、补充。

1.4 验证与确认(Verification & Validation)

  • 验证(Verification):把产品做对------软件是否逐层符合设计/需求规格,回答"做得对吗"。
  • 确认(Validation):做对的产品------产品在真实用户场景中是否满足需求,回答"做对了吗"。
  • 这两个概念是测试理论的地基,V模型的"V"即源于此。

1.5 需求---测试可追溯性

每条需求必须能双向对应到测试用例。受监管行业的硬性要求:

  • 国际:FDA(美国医疗器械)、ISO 13485(医疗器械质量体系)、IATF 16949 / ASPICE(汽车)
  • 国内:NMPA注册(医疗器械软件)、GMP体系
  • 写注册文档时,"需求→设计→测试用例"的追溯链就是审评材料的核心结构。

1.6 尽早测试原则

缺陷发现越晚,修复成本越高。因此:

  • 需求阶段就开始评审(静态测试),而不是等代码写完再测。
  • Shift-left(测试左移):测试人员尽早介入需求分析,测试设计前置。

第二部分:测试理论(模型的现状与全貌)

2.0 总体判断

经典模型不再是流程模板,而是思维框架合规语言 。越严肃的领域(医疗、工业软件)越离不开。它们的"形"过时了,"神"还在。

2.1 V模型------最有生命力

  • 核心不是那个V字图形,而是:① V&V的区分;② 需求---测试的追溯链。
  • 结构:左侧自顶向下(需求→概要设计→详细设计→编码),右侧自底向上(单元测试→集成测试→系统测试→验收测试),每级测试与设计阶段对应。
  • 现状:医疗器械、汽车、航空是硬性要求;现代实践没有推翻它,CI/CD流水线本质仍在跑V模型右边那列。

2.2 W模型------名字消亡,思想获胜

  • 想表达"测试活动贯穿整个开发周期,不只是编码后",开发一个V、测试一个V并行。
  • 该思想已被shift-left测试、持续测试、TDD完全吸收,但没人再画那个W。

2.3 H模型与X模型(了解即可)

  • H模型:把测试独立出来,达到某个测试就绪点就执行,强调测试的独立性和迭代性;不像V/W那样绑定开发阶段。
  • X模型:试图融合V和H,提出"探索性测试"和"不基于设计的测试",实际应用很少。
  • 意义:说明行业早就认识到"测试活动不应被开发流程形状绑架",为敏捷时代的独立测试流水线做了理论铺垫。

2.4 瀑布模型------作为流程死了,作为纪律还活着

  • 作为开发流程:对迭代快的产品软件已过时(需求锁定数月再交付是自杀式做法)。
  • 作为纪律:文档先行、阶段评审、变更控制,在安全关键和合规场景仍然必要。
  • 现实:大量团队是"伪敏捷"------名义敏捷,关键环节(需求基线、发布评审、合规文档)仍是瀑布式闸门管理。

2.5 增量与迭代模型(瀑布到敏捷的中间态)

  • 增量:把产品切成若干可交付的增量块,一块一块开发交付(如先骨架后血肉)。
  • 迭代:反复打磨同一块,版本逐步逼近目标(如原型法)。
  • 现代敏捷本质是"增量 + 迭代"的组合。

2.6 敏捷宣言与测试的变迁

敏捷宣言四条价值观:个体与互动高于流程与工具;工作的软件高于详尽的文档;客户合作高于合同谈判;响应变化高于遵循计划。

对测试的影响:

  • 测试不再是独立阶段,而是贯穿每个迭代的持续活动。
  • 文档精简但合规场景不能省(监管框架下的敏捷:文档该写还写,只是更精简、随迭代滚动更新)。
  • 测试自动化成为前提:迭代速度快,手工回归跟不上,倒逼自动化。

2.7 ISTQB测试过程(通用测试流程)

  1. 测试计划:确定范围、策略、资源、进度、出口准则
  2. 测试分析与设计:分析测试依据,设计用例
  3. 测试实施:准备环境、数据、脚本
  4. 测试执行:跑用例、记录结果、提缺陷
  5. 出口准则评估:对照准则决定能否结束
  6. 测试总结:报告、经验教训

敏捷环境下这个流程压缩到一个迭代内完成,但环节一个不少。

2.8 测试成熟度:TMMi(了解)

测试过程成熟度五级(类比CMMI):初始级 → 已管理 → 已定义 → 已度量 → 优化级。用于评估组织测试能力,大型企业过体系认证时会接触。


第三部分:测试分层

3.0 两个维度看测试

测试可以按"层级 "分(单元→集成→系统→验收),也可以按"类型"分(功能/性能/安全/可靠性...)。层级回答"测多大范围",类型回答"测什么方面"。实际用例都是两维的交点,比如"系统级的性能测试"。

3.1 IPD七层(华为研发体系叫法,国内大型软硬件企业常见)

开发主导的四层(UT / IT / ST / BBIT):

层级 全称 测什么 测试对象(依据) 责任人
UT Unit Test 单元测试 单个函数/类是否符合详细设计 LLD详细设计 开发
IT Integration Test 集成测试(单元间) 函数/类之间的接口配合 单元间接口设计 开发
ST(MST) (Module) System Test 模块系统测试 单个模块作为整体是否符合模块需求 模块SRS 开发
BBIT Building Block Interface Test 模块间接口测试 已验证模块逐层向上集成为可运行系统 系统设计分解结构 开发/测试
  • 关键区别:UT测"每个零件是否牢固",IT测"零件之间的接口",MST后"模块牢固可用",BBIT后"模块拼起来能跑"。
  • 注意:BBIT ≠ 联调。联调通常涉及软硬件或不同产品间的配合;BBIT是严格按系统设计分解做逐层集成。
  • 指标:覆盖率、千行代码缺陷率(kloc)等经验要求。

测试工程师主导的三层(SDV / SIT / SVT):

层级 全称 范围/方法 测试对象(依据)
SDV System Design Verification 系统设计验证 子系统/模块级,偏灰盒(关注内部实现);除功能性能外含EMC、热测试、环境可靠性 设计需求(DR)
SIT System Integration Test 系统集成测试 整机/完整产品级,纯黑盒(不关心内部实现);比SDV增加可用性、可维护性、包装测试 整机设计需求
SVT System Verification Test 系统验证测试 小批量试制阶段的验收测试;验证产品包需求(OR);关注质量一致性,通常从试制生产线随机抽检 产品包需求(OR)

七层背后的三个核心逻辑:

  1. 架构分解的镜像:系统按"系统→子系统→模块→单元"自顶向下设计,测试自底向上逐层验证;每层测试对象就是上一层设计的输出物,需求与测试天然形成追溯链。
  2. 每层两件事:除SVT外,每层既测"本层每个构件"(n个构件测n次),又测"构件之间的接口"(n个UT对应1个IT,n个MST对应1个BBIT,以此类推)。
  3. 质量闸门:SDV/SIT/SVT对应IPD技术评审点(TR4A/TR5等),每级通过才能进入下一阶段------本质是把V模型的"阶段出口准则"工程化了。

3.2 互联网测试分层(测试金字塔)

IPD七层 互联网对应物
UT 单元测试(开发写,CI强制,覆盖率卡点)
IT / BBIT 服务间契约测试 / 接口自动化(Mock + 契约测试如Pact)
ST / SDV 端到端自动化(Selenium/Playwright、接口E2E)
SIT 预发环境全链路联调 + 回归测试集
SVT 没有直接对应------被"灰度发布 + 线上监控"取代
  • 投入比例:大量单元测试、适量接口测试、少量UI自动化(塔尖)。
  • 常见反模式------冰淇淋筒:UI自动化臃肿、单元测试稀薄。
  • SVT被"生产环境验证"吞掉:先放1%流量(灰度),看错误率和业务指标,再全量。消费级产品最高效;医疗软件绝不可行(不能"灰度给1%的病人用")。

3.3 测试类型(按测试目的分)

类型 关注点 典型工具/方法 层级
功能测试 功能是否符合需求 用例设计方法(见3.5) 各层
性能测试 响应时间、吞吐、资源占用 负载/压力/稳定性测试(LoadRunner、JMeter) ST/SIT
安全测试 漏洞、注入、越权 渗透测试、静态扫描(SonarQube、Fortify) 各层
兼容性测试 不同OS/硬件/版本 兼容性矩阵 SIT
可靠性测试 长时间运行稳定性 老化测试、异常注入 SDV/SIT
易用性测试 用户体验 用户调研、可用性走查 SIT
回归测试 变更后存量功能完好 自动化回归集(见4.3) 各层
冒烟测试 主干流程通不通,决定要不要深测 核心用例子集 各层
探索性测试 边测边设计,发现脚本漏掉的缺陷 手工经验驱动 ST

3.4 白盒 / 黑盒 / 灰盒

  • 白盒:看得见内部代码结构。依据:详细设计。方法:语句覆盖、判定覆盖、条件覆盖、路径覆盖(覆盖强度递增)。主要用于UT。
  • 黑盒:只关心输入输出。依据:需求规格。方法:等价类、边界值等(见3.5)。主要用于ST/SIT/SVT。
  • 灰盒:部分了解内部结构,介于两者之间(如SDV)。

3.5 黑盒测试用例设计方法(面试与实用并重)

  1. 等价类划分:把输入域划分为若干等价类,每类取一个代表值。有效等价类 + 无效等价类都要覆盖。
  2. 边界值分析:缺陷高发于边界。原则:取刚好等于、刚好大于、刚好小于边界的值。与等价类配合使用。
  3. 判定表(决策表):多条件组合时,列出条件组合与动作的对应关系,避免遗漏。
  4. 因果图:条件之间有约束关系(与/或/非、互斥)时,先画因果图再转判定表。
  5. 场景法:基于业务流程画基本流和备选流(如导入模型→切片→导出,中途取消/文件损坏等)。
  6. 错误推测法:凭经验猜测易错点(空输入、超长输入、并发、时序、编码问题、文件损坏)。
  7. 正交试验:参数组合爆炸时,用正交表抽样减少用例数。

实用建议:等价类+边界值覆盖80%日常用例设计;流程类用场景法;刁钻场景靠错误推测。


第四部分:互联网 vs 医疗工业界:流程对比

4.1 总对比表

维度 IPD / 医疗工业界 互联网公司
流程骨架 阶段制 + TR评审闸门 敏捷sprint + 持续交付流水线
质量出口 阶段评审通过才走下一步 流水线绿灯(CI门禁)才能合入
发布频率 数月一个版本 每天多次
测试责任人 分层专职测试团队 开发为主 + SDET建设测试基础设施(测试开发比约1:5~1:10)
需求形态 需求规格基线锁定 用户故事进backlog,持续流动
最后一层验证 SVT小批量验收测试 灰度发布 + 可观测性 + A/B实验
文档 完整、受控、可审计 精简、代码即文档、Wiki滚动更新
缺陷态度 零容忍倾向,闸门拦截 快速修复,允许带小bug上线(有容错回滚兜底)

4.2 互联网侧关键实践

  • CI/CD流水线:合码 → 自动构建 → 静态检查(lint/sonar)→ 单元测试 → 打包部署测试环境 → 接口/E2E测试 → 预发 → 灰度 → 全量 → 监控。任何一环红灯即阻断。
  • DevOps:开发与运维一体化,用基础设施即代码(IaC)保证环境一致性,"你构建的,你运行"(You build it, you run it)。
  • 可观测性三支柱:日志(Logging)、指标(Metrics)、链路追踪(Tracing),承担了一部分"线上验证"职责。
  • A/B实验:小流量对比验证产品决策,本质是"用真实用户做确认测试"。
  • 混沌工程:主动注入故障(杀实例、断网络)验证系统韧性,对应可靠性验证。
  • 契约测试:微服务间以契约为准,各自独立演进,取代重量级联调。

4.3 概念辨析(易混三兄弟)

  • 回归测试 = 一种目的:代码变更后重跑已有用例,确认存量功能没坏(修复bug、加新功能最容易弄挂旧逻辑)。
  • CI(持续集成) = 一种机制:代码合入主干即自动触发"编译→测试→报告"。
  • 质量门禁 = CI的用法:回归用例全绿才允许合入。
  • 关系:CI是流水线,回归测试集是流水线上跑的内容,门禁是阻断策略。前提:能进CI的必须是自动化用例。

4.4 医疗工业界侧关键实践

  • 医疗器械软件生命周期标准 IEC 62304(国内对应 YY/T 0664):软件安全性分级(A/B/C级),C级(可能直接或间接导致死亡/严重伤害,如种植导板设计软件)要求最完整的文档、验证、追溯体系。
  • 风险管理 ISO 14971(国内 YY/T 0316):风险分析→评价→控制→ residual risk 接受,测试用例与风险控制措施对应。
  • 配置管理:软件版本、开发工具链、依赖全部受控,保证"可重现的构建"。
  • 变更控制:任何变更走变更流程,评估影响范围,回归测试范围基于影响分析确定。
  • 确认/再确认:软件重大更新可能触发医疗器械再注册或变更注册;实物打印的"过程确认"需重跑。

4.5 一句话总结

IPD是"把每个阶段验证透了再走下一步";互联网是"让流水线自动把关、让线上数据说话"。两者是同一套测试思想在不同失败成本下的不同展开。


第五部分:场景落地:切片打印软件怎么测

5.1 测试活动分层映射表

测试活动 层级 说明 能否进CI
切片算法、网格修复等函数 UT GTest / Qt Test,开发自写
引擎与UI层的数据接口 BBIT级 模块间接口验证
输入模型→切片→比对G-code/层片 ST级 + golden-master 见5.2
界面核心流程点击(导入→切片→导出) E2E / 系统测试 黑盒,塔尖少而精
切片速度、内存占用(大模型) ST级 性能测试 计时、profiling
畸形文件鲁棒性(空/损坏/超大STL) ST级 健壮性 错误推测法设计
实际打印出件并测量 SVT / 系统验证 涉及硬件、材料、环境,超软件边界 ❌ 周期性执行
证明既定参数下持续达标 过程确认 注册体系活动,软件版本是关键变量

5.2 核心实践:Golden-Master回归集

切片引擎非常适合做基准数据测试(golden-master):

  1. 挑20~50个代表性模型:含破面、薄壁、悬垂、多孔结构、文字雕刻面等刁钻情况;
  2. 保存各模型的期望切片输出(G-code / 层片数据);
  3. 接入CI,每次提交自动切片 + 自动比对。

原理:切片结果是确定性的、可自动比对的。这比手工抽查高效得多,且桌面软件团队普及率低,容易做出亮点。

注意:golden-master的期望输出本身要经人工评审确认(否则错误被固化)。算法有合理变更时,基准需人工评估后再更新。

5.3 实物侧验证的工程化

实物打印进不了CI,但可周期化、标准化:

  • 固定标准模型 + 固定打印机 + 固定材料 + 固定参数;
  • 打印后测量关键尺寸(尺寸精度、翘曲、孔径、支撑接触面质量);
  • 形成测试报告存档;换软件版本时重跑一遍(影响工艺确认的变更需评估再确认范围)。

5.4 可测试性驱动重构

  • 原则:难以测试的代码,往往就是设计有问题的代码。
  • 症状:一个函数长到要按"子功能"分别测试------说明它违背了单一职责原则,是几个功能挤在一个函数体里。
  • 做法 :不是研究怎么测,而是先拆后测。例:slice()拆出validateMesh()generatePaths()optimizePaths(),每个小函数是清晰单元,各配UT;原函数变为组合调用,配少量集成测试即可。
  • 切片管线天然是多阶段(读取→修复网格→分层→生成路径→优化),尽早按阶段拆开,是golden-master方案能落地的前提。
  • 依赖注入、接口抽象是C++提升可测试性的常用手段(将文件IO、设备访问抽象成接口,测试时用Mock替代)。

5.5 Qt/C++ 测试工具链速查

用途 工具
Qt单元测试 Qt Test模块(QTestLib,支持GUI事件模拟)
C++单元测试 Google Test(最主流)、Catch2
代码覆盖率 gcov + lcov(Linux)、OpenCPPCoverage(Windows)、BullseyeCoverage
UI自动化 Qt自带QTest + 基于accessible接口,或截图比对(像素级回归)
Python侧(如有脚本) pytest-qt
静态检查 Clang-Tidy、Cppcheck、SonarQube
Mock框架 Google Mock、Trompeloeil
CI工具 Jenkins、GitLab CI、GitHub Actions
内存/并发错误 Valgrind、AddressSanitizer、ThreadSanitizer

5.6 3D打印软件特有验证点清单

  • 切片几何正确性:层片轮廓与模型截面一致,无破面漏切
  • 切片完整性:层数正确,层高均匀,无丢层重复层
  • 路径正确性:无碰撞、无空走刀异常、填充率符合设置
  • 支撑有效性:悬垂角度识别正确,支撑可去除
  • 尺寸精度链:STL单位/缩放、补偿参数(收缩、xy补偿)正确传递
  • 大模型性能:千万级面片不崩溃,内存可控
  • 文件兼容性:STL(ASCII/二进制)、OBJ、3MF(含颜色/多材料信息)
  • G-code方言:不同打印机指令集(Marlin/Klipper等)正确输出

5.7 判断口诀(速用)

  1. 层级判断:结果只在软件内部比较 → 系统测试;物理打印出来才算数 → 系统验证;要证明"持续达标"以满足监管 → 过程确认。
  2. UT判断:直接调代码、无外部依赖 → UT;从用户界面操作黑盒 → 系统/E2E测试;调独立UI组件类的接口 → 仍是UT(区别于点界面)。
  3. 流程判断:失败成本高 → 前置严格(文档+评审);失败成本低 → 快速迭代+快速回滚。

附录A:术语速查表

缩写 全称 一句话解释
UT Unit Test 测单个函数/类是否符合详细设计
IT Integration Test 测单元/构件之间的接口配合
ST / MST (Module) System Test 测单个模块整体是否符合模块需求
BBIT Building Block Interface Test 已验证模块逐层集成为可运行系统(≠联调)
SDV System Design Verification 子系统级设计验证,灰盒,含可靠性测试
SIT System Integration Test 整机级集成测试,纯黑盒
SVT System Verification Test 小批量试制验收,验证产品包需求(OR)
UAT User Acceptance Test 用户验收测试(验收测试的一种)
DR Design Requirement 设计需求
OR Offering Requirement 产品包需求
SRS Software Requirement Specification 软件需求规格
TR Technical Review IPD技术评审点
kloc 千行代码 缺陷率统计单位
CI Continuous Integration 持续集成,合码即自动构建+测试
CD Continuous Delivery/Deployment 持续交付/部署
E2E End-to-End 端到端测试,黑盒全流程
Golden-Master 基准数据测试 比对已知正确输出
Shift-left 测试左移 测试活动前置到开发早期
SDET Software Development Engineer in Test 测试开发工程师
TDD Test-Driven Development 测试驱动开发(红-绿-重构)
BDD Behavior-Driven Development 行为驱动开发(Given-When-Then)
V&V Verification & Validation 验证与确认
回归测试 Regression Testing 变更后重跑已有用例确认存量功能没坏
冒烟测试 Smoke Test 主干流程通了才值得深测
质量门禁 Quality Gate 用例全绿才允许合入/流转
冰淇淋筒 Ice Cream Cone UI自动化臃肿、单测稀薄的反模式
杀虫剂悖论 Pesticide Paradox 同一套用例反复跑不再发现新缺陷
IEC 62304 / YY/T 0664 医疗器械软件生命周期 软件安全性分级(A/B/C级)要求
ISO 14971 / YY/T 0316 医疗器械风险管理 风险分析-评价-控制全流程
ASPICE Automotive SPICE 汽车行业软件过程能力标准
TMMi Test Maturity Model integration 测试过程成熟度模型
IaC Infrastructure as Code 基础设施即代码
Mock 模拟对象 替代真实依赖的可控测试替身

附录B:推荐阅读与考证路径

  • 入门体系:ISTQB Foundation(国际软件测试认证,国内软考"软件评测师")
  • 经典书目:《软件测试》(Ron Patton)、《Google软件测试之道》(How Google Tests Software)
  • 进阶:TMMi模型、探索性测试(《探索式软件测试》James Whittaker)
  • 工程实践:《持续交付》(Jez Humble)、《单元测试的艺术》
  • UT-IT-ST-BBIT-SDV-SIT-SVT

笔记完。建议后续增补:CI流水线配置实例、各层测试用例模板、测试报告模板。

相关推荐
一孤程1 天前
游戏测试专题第七篇:游戏自动化测试实战
游戏·测试
2302_805771071 天前
Day13Jmeter数据驱动
功能测试·单元测试·测试用例·需求分析·测试
ClouGence1 天前
Chrome Recorder 能用于长期回归测试吗?
前端·chrome·测试
一孤程1 天前
游戏测试专题第八篇:游戏安全测试与反外挂
游戏·测试
ClouGence1 天前
开发提效:CueCast MCP 构建自动化测试 Agent 工作流
agent·测试·mcp
2302_805771072 天前
Day18在接口自动化测试中引入pytest用例管理框架
功能测试·单元测试·测试用例·需求分析·测试
一孤程2 天前
游戏测试专题第五篇:游戏兼容性测试与多端适配
游戏·测试
数据工匠老o3 天前
sysbench/TPC-C/自定义脚本:数据库压测工具对比与实战流程
数据库·测试