前置知识: 软件工程与测试

测试概念与原则

6 min入门

软件测试基础:测试定义、目的、原则、V模型与测试生命周期详解。

1. 测试基础概念

1.1 什么是软件测试

软件测试是通过手动或自动化手段来运行或检验软件系统的过程,目的是发现缺陷、验证功能、评估质量。

1.2 测试目的

目的描述
发现缺陷找出软件中的错误
验证功能确认软件满足需求
评估质量度量软件质量水平
提供信心为发布提供质量保证
预防缺陷通过早期测试预防问题

1.3 测试与调试

对比项测试调试
目的找缺陷修缺陷
执行者测试人员/开发人员开发人员
方式系统化探索式
可预见性可计划不可预见

1.4 静态测试与动态测试

按「要不要真的运行程序」划分两大类。静态测试不运行代码:评审需求与 设计文档、代码审查(code review)、静态分析工具(ESLint、SonarQube 的 静态规则)都属于这一类——它们在代码「跑起来之前」就能发现缺陷,而大量 研究一致表明缺陷越早发现修复成本越低。动态测试则要真正执行程序: 单元测试、集成测试、性能测试都在其列。

维度静态测试动态测试
是否运行不运行必须运行
对象文档、代码本身运行中的系统
代表手段评审、代码审查、lint单元/集成/系统/E2E
发现的缺陷规范、逻辑、可维护性问题行为、接口、性能问题

一个常见的误解是把「测试」等同于「写用例跑程序」。工程实践中评审与静态 分析发现的缺陷数量往往不低于动态测试,且修复成本低得多——这正是「测试 左移」(见「安全与移动测试」)的理论基础。

1.5 验证与确认(V&V)

这对术语回答的是两个不同的问题:

  • 验证(Verification):我们是否正确地构建了产品——产出是否符合 规格说明?( Did we build the product right?)
  • 确认(Validation):我们是否构建了正确的产品——产出是否满足 用户真实需要?(Did we build the right product?)

类比:验证像「按图纸验收房子」(墙的位置和图纸一致吗),确认像「住户 验收房子」(住起来真的舒服吗)。图纸本身错了,验证全通过的房子依然 不是用户想要的——对应测试七原则中的「无错误谬误」:没有发现缺陷不 等于系统满足需求。测试金字塔的各层主要承担验证职责,而验收测试 (UAT)、探索性测试是确认的主战场。

2. 测试七原则

原则1:测试显示缺陷的存在

测试只能证明缺陷存在,不能证明缺陷不存在。

原则2:穷尽测试不可能

无法测试所有输入组合,需要基于风险选择测试范围。

原则3:尽早测试

越早发现缺陷,修复成本越低。

需求阶段发现 → 修复成本 1x
设计阶段发现 → 修复成本 5x
编码阶段发现 → 修复成本 10x
测试阶段发现 → 修复成本 20x
生产阶段发现 → 修复成本 100x

原则4:缺陷集群性

少数模块通常包含大部分缺陷(帕累托法则:80% 的缺陷集中在 20% 的模块中)。

原则5:杀虫剂悖论

反复使用相同的测试用例将无法发现新缺陷,需要不断更新和补充测试。

原则6:测试依赖于上下文

不同类型的应用需要不同的测试方法。

原则7:无错误谬误

没有发现缺陷不等于软件可用,还需要验证是否满足用户需求。

3. 测试模型

3.1 V 模型

flowchart LR
    A[需求分析] <--> B[验收测试]
    C[系统设计] <--> D[系统测试]
    E[详细设计] <--> F[集成测试]
    G[编码] <--> H[单元测试]
    A --> C --> E --> G
    B --> D --> F --> H

3.2 W 模型

V 模型的改进,强调测试与开发并行:

需求分析 → 需求评审
    ↓           ↓
系统设计 → 系统测试设计
    ↓           ↓
详细设计 → 集成测试设计
    ↓           ↓
  编码   → 单元测试设计

3.3 敏捷测试

特点描述
持续测试每个迭代都测试
全团队参与开发和测试协作
自动化优先快速反馈
探索性测试补充自动化不足

4. 测试生命周期

4.1 基本过程

1. 测试计划 → 确定范围、策略、资源
2. 测试分析 → 分析需求、识别测试条件
3. 测试设计 → 设计测试用例
4. 测试实现 → 编写脚本、准备数据
5. 测试执行 → 运行测试、记录结果
6. 测试评估 → 评估出口准则
7. 测试报告 → 生成测试报告
8. 测试收尾 → 归档、经验总结

4.2 测试出口准则

准则描述
覆盖率代码/需求覆盖率达到目标
缺陷率未修复缺陷低于阈值
通过率测试通过率达到目标
风险剩余风险可接受

5. 缺陷管理

5.1 缺陷生命周期

新建 → 已确认 → 已分配 → 修复中 → 已修复 → 已验证 → 已关闭
                    ↓                    ↓
               已拒绝              重新打开

5.2 缺陷属性

属性描述
严重程度致命/严重/一般/轻微
优先级紧急/高/中/低
状态新建/已确认/已修复/已关闭
环境操作系统/浏览器/版本

5.3 严重程度 vs 优先级

严重程度回答「这个缺陷有多坏」,优先级回答「要多快修」——两者通常正相关 但不等同:启动页的错别字严重程度轻微,却可能因影响第一印象被排成高优 先级;一个极深角落的崩溃严重程度高,却可能因触发条件苛刻而低优先级。 定级时先客观评严重程度,再结合业务影响排优先级。

严重程度优先级示例
致命紧急系统崩溃、数据丢失
严重高核心功能不可用
一般中非核心功能异常
轻微低UI 文案错误

小结

  • 初学者要点:测试的目的是发现缺陷、验证需求、评估质量——「没找到缺陷」 不等于「软件没问题」(无错误谬误);七原则里最常用的是「穷尽测试不可 能」与「缺陷集群性」,它们直接决定精力往哪投;缺陷的严重程度与修复 优先级是两个维度,不要混用。
  • 进阶注意:V 模型回答「每个开发阶段对应哪层测试」,W 模型进一步强调 「测试与开发并行、测试对象不只是代码」(需求评审也是测试);生命周期 中分析、设计发生在执行之前,出口准则(覆盖率、通过率、剩余风险)应 写进测试计划而不是测试结束时临时解释;测试与调试的分工是「测试证明 缺陷存在,调试定位缺陷原因」。