第7章01 软件测试概述

3.1 本章定位

本章建立软件测试的总体框架:测试是什么、测试过程有哪些阶段、测试有哪些分类、测试为什么需要多种策略,以及软件测试的三大核心问题。后续黑盒、白盒、回归、性能测试都是本章框架下的具体方法。

3.2 核心概念

软件测试定义

广义上,软件测试是一种软件正确性、完整性、安全性和质量的检查过程。

​ 课件指出业界有静态测试和动态测试的说法,但动态测试才是真正意义上的软件测试。

狭义上,软件测试是为了发现错误或缺陷而执行某个程序或软件系统的过程。

重要判断:

  • 测试的目的:==证明程序有错==,而不是证明程序无错误。
  • 测试没有发现错误,不能说明程序中一定没有错误。

测试用例

客观题重点。

执行软件测试首先必须有测试用例,然后根据测试用例运行程序,以发现程序或软件可能存在的潜在错误。

测试用例是对一项特定软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。简单理解:

$$ 测试用例 = 测试输入 + 测试预言 $$

课件表述中,测试用例包括一组测试输入、执行条件以及预期结果。

3.3 软件测试过程 STLC

软件测试过程又称软件测试生命周期(Software Test Life Cycle, STLC),从测试项目计划建立到所有测试结束,一般包括七个阶段。

阶段主要内容
测试需求分析理解用户功能和使用方式,确定测试要点和测试方案
测试计划制定明确测试目标、范围、测试项、策略/手段、工具、资源、交付物
测试设计设计测试用例、测试脚本和测试覆盖准则
测试开发开发脚本、准备数据、搭建环境等
测试执行执行脚本,记录日志和 Bug 统计
测试结果分析与评估分析覆盖、缺陷、停止标准和测试充分性
测试报告生成生成测试报告,作为生命周期之间承上启下的交付件

软件测试过程(STLC)

测试阶段核心目标与主要任务具体包含内容 / 关键点
测试需求分析明确测试要点:弄清楚用户需求及系统运行方式,为后续设计提供基础。针对原始需求列表中的每个需求点,提取我们需要测试的测试要点,并分析对应的测试方案或方法。
测试计划制定统筹全局规划:明确测试方向、资源分配与预期交付物。需要明确7个核心要素:测试目标、测试范围、测试项(如安全测试、性能测试等)、测试策略/手段、需要的辅助工具、测试资源(软硬件及人员)、交付/产出物件(如测试计划、日志、缺陷报告等)。
测试设计确定测试方法:将计划转化为可执行的具体用例和标准。1. 设计测试用例:基于白盒(覆盖准则)或黑盒(等价类、边界值等)方法设计。 2. 设计测试脚本:编写或录制用于自动化工具执行的指令。 3. 测试覆盖准则设计:明确选用何种覆盖准则(语句/控制流/分支等)。
测试开发搭建测试基础:进行实际环境与代码级别的准备工作。建立测试环境、录制或编写测试脚本、开发测试驱动程序 (drivers) 和桩模块 (stubs)、建立外部测试数据集。
测试执行运行并记录:实际运行测试并记录结果。执行测试脚本,记录测试执行的具体情况,包括记录日常日志以及详细的 Bug 统计情况。
测试结果分析 与评估分析与对比:对比期望结果,评估代码和用例的覆盖程度。1. 分析测试用例的覆盖情况(如代码覆盖率)。 2. 分析发现缺陷的情况(缺陷类型、严重性分布、趋势与状态等)。 3. 评估是否达到测试停止或成功标准(充分性评估)。
测试报告生成总结与交付:对测试全过程进行承上启下的迭代总结。生成典型测试报告,包含:概述、测试时间与环境、测试过程、功能实现清单、缺陷统计、测试统计情况、测试总结以及测试风险分析。

3.4 软件测试分类

按实施主体分类

第二次小测已考。

软件测试根据由谁来测试分成

类型说明
开发者测试开发者在软件开发过程中进行,包含单元测试、集成测试、系统测试、确认测试、回归测试等
用户测试通常发生在验收测试阶段,在实际或模拟使用环境下完成
第三方测试由独立第三方机构进行,增强客观性

按内部结构可见程度分类

类型依据关注点适用
黑盒测试需求规格说明输入与输出、功能行为功能测试、系统测试、验收测试等
白盒测试源代码结构和逻辑语句、分支、条件、路径、数据流单元测试、集成测试等
灰盒测试部分内部结构信息接口、模块边界、数据库写入等集成测试、接口测试

注意:灰盒测试结合内部结构信息和外部行为,但不能简单认为“灰盒测试 = 白盒测试 + 黑盒测试”。

3.5 常见测试类型

课件按照需求类型引出多种测试:

  • 功能性需求:结构测试、功能测试、安全性测试、容错测试等;
  • 质量需求:性能测试、压力测试、兼容性测试、可维护性测试等;
  • 其他需求:标准符合度测试、GUI 测试、字体大小和颜色测试等。

常见的软件测试类型汇总

测试大类细分类型 / 常见方法测试目的与核心概念关键特点与评估指标
结构测试 (白盒测试)控制流测试通过执行程序来检查程序逻辑结构(如语句、判定、条件、路径)。常见准则包括语句覆盖、判定覆盖、条件组合覆盖、路径覆盖等 。
数据流测试面向数据的测试,主要搜索变量的定义与使用位置并检查状态变化 。核心是分析变量的“定义-使用路径”(如 du-PATH, dc-PATH)及覆盖度 。
功能测试 (黑盒测试)功能分解法、等价类划分法、因果图判定表法、边界值分析法基于需求规格说明书,不关注内部结构,重点检测程序是否满足特定的功能性需求 。贯穿软件生命周期各阶段 ;边界值法常用来补充等价划分法 。
性能测试通过自动化工具模拟多种正常、峰值及异常负载条件进行测试 。确保系统在高并发、高吞吐等严苛场景下能稳定且正常地运行 。重点关注:TPS(每秒事务数)、QPS(每秒查询数)、响应时间(RT)、并发用户数、资源利用率等 。
安全性测试渗透测试、模糊测试、漏洞扫描、安全扫描、风险评估等专门寻找可能被外界恶意利用的软件脆弱性(包含设计漏洞与代码漏洞)。渗透测试依赖人员经验且覆盖率有限;模糊测试则介于纯手工与全自动化之间 。
可靠性测试故障注入法、异常值输入法、压力测试法、稳定性测试法等评估软件在“规定的条件”和“规定的时间区间”内完成规定功能的能力 。强调按照实际使用的“概率分布”随机选择测试输入,对测试环境的覆盖要求非常高 。
兼容性测试测试软硬件之间、操作系统、跨软件及浏览器的兼容性检查软件与硬件、软件与软件之间能否正常进行交互、协同工作 。包含向前/向后兼容、不同版本兼容、标准规范兼容以及数据共享兼容四种典型情况 。
健壮性测试 (容错测试)针对错误数据、异常情况、非法操作处理等场景的测试检测软件在面临随机非法输入和刻意制造的异常条件下,能否保持正常工作状态 。考察重点分为三个维度:成熟性(避免异常)、容错性(承受异常)和易恢复性(异常后恢复)。
可用性测试实验室实验、现场观察、问卷表调查、启发式评估针对 GUI 系统的评估,度量用户在与系统交互时的实际体验质量 。核心评估标准:易学性、使用效率、可记忆性、错误频率及严重程度、主观满意度 。

3.6 软件测试有效策略

课件强调单一测试技术难以满足所有测试需求,应组合使用:

  • 静态测试与动态测试结合;
  • 黑盒测试与白盒测试结合;
  • 内部测试与外部测试结合;
  • 整体测试与局部测试结合等。

黑盒与白盒结合的理由:

  • 白盒测试检查内部结构,可针对代码逻辑;
  • 黑盒测试观察外部行为,可发现需求实现问题;
  • 二者结合可以更全面发现缺陷。

软件测试有效策略汇总

结合策略测试类型原理优点缺点
静态与动态 测试结合静态测试检查所有可能的输入,分析所有可能的模拟执行情况 。检查范围广,无需执行被测程序,适合于软件开发早期阶段的制品(如文档、模型等) 。检测效率低(多数是人工方法)、检测精度不高,自动化程度低 。
动态测试检查特定输入,考察程序的实际执行 。效率高、自动化程度高 。需要执行被测程序,不太适合早期阶段制品的缺陷检测;同时面临测试用例生成与选择、测试预言以及测试充分性等三大难题 。
白盒与黑盒 测试结合白盒测试检查代码内部结构,确保每段代码(包括每条语句、每个判定分支、每个条件等)都被执行 。基于程序结构的测试,可发现结构或逻辑缺陷;能做到细粒度深度代码检查,更好地保障代码安全性与可信性 。代码量很大时无法穷举遍历所有可能性;测试用例生成难度大,无法保障 100% 测试覆盖;效率往往不高,自动化难度大 。
黑盒测试通过测试来检测每个功能是否都能正常使用;着眼于程序外部结构,完全不考虑内部逻辑结构 。基于需求规约的测试,可发现行为功能方面的缺陷;无需了解程序的内部结构,节省程序理解时间;适用于各阶段的测试需求 。如果外部特性设计或需求规格说明书本身有缺陷,通常无法发现;即使反复测试,也不能保障该功能在任何时候都是绝对正确的 。
内部与外部 测试结合内部测试由软件开发部门自我组织,在部门内部进行的软件测试 。从开发者角度进行的测试,涵盖所有类型;测试范围广、类型丰富、测试充分、专业性强、可信性高 。对用户是黑盒的,用户无法得知测试的所有真实数据及核心技术;一些潜在问题(如技术债)一般不会对外公开 。
外部测试以用户体验为主体的测试方法 。从用户角度进行的测试,以用户体验为主;能客观、具体地反映软件的实际使用效果 。测试充分性难以保障 。
局部与整体 测试结合局部测试针对软件局部进行的测试,保障组成软件系统的每个部分没有结构、功能方面的问题 。保障组成软件系统的每个部分得到充分测试;作为细粒度测试,能发现隐含的局部缺陷 。不能发现整个软件系统集成之后才暴露的缺陷 。
整体测试针对软件整体进行的测试,保障软件没有功能性、非功能性方面的问题 。保障各软件之间、软硬件之间的交互与集成得到充分测试;能有效发现集成过程中的交互缺陷、兼容性缺陷等 。很难发现组成软件系统局部所隐藏的深层缺陷 。

补充提示: 课件中还特别提到了一种结合了白盒与黑盒优点的 灰盒测试 (Grey-box test) 。它不仅关注输入输出的正确性,也关注程序内部的逻辑覆盖,在集成测试阶段非常适用,但不能简单地将其理解为“灰盒 = 白盒 + 黑盒” 。

软件测试典型方法汇总

测试方法核心原理与概念主要特点与测试目的关键执行要素
组合测试 (Combinatorial Test)测试软件在多参数、多功能组合环境下的运行情况 。 ==功能性测试方法==旨在避免暴力穷举,从庞大的参数组合空间中选取尽量少的测试用例,实现科学高效的覆盖 。核心在于如何设计约束、选择最优组合算法,以最低的成本覆盖各种参数组合带来的影响 。
随机测试 (Random Test)一种不要求书面用例、脚本或指令的==黑盒测试==,测试人员通过随机输入查看结果 。作为基于计划测试的补充,重点对缺陷密集区、特殊场景、并发情况及低重现率缺陷进行==复测== 。极度依赖测试人员的产品熟悉度、测试经验以及对过往缺陷分布的掌握 。
蜕变测试 (Metamorphic Test)依据领域知识建立程序的“蜕变关系(MR)”,利用初始用例衍生出新的测试用例 。==特殊的黑盒测试==通过验证多次执行目标程序时,输入与输出之间是否保持期望的蜕变关系来判断测试是否通过 。关键在于定义准确的蜕变关系(例如 $e^x * e^{-x} = 1$),它是解决“测试预言(Test Oracle)”难题的有效方法 。
演化测试 (Evolutionary Test)利用遗传算法,在待测软件的输入空间进行启发式搜索 。将测试用例的生成任务转化为优化问题,具有高效性和高度自动化水平,能显著降低成本 。需要合理设置适应值函数(fitness function),通过选择、杂交、变异等种群繁衍过程不断迭代出高质量用例 。
变异测试 (Mutation Test)通过故意在代码中植入错误(生成变异体),来评估现有测试用例能否发现它们 。专门用于评估和检验软件测试(尤其是测试用例集)的质量 。利用变异算子生成变异体,识别并排除等价变异体后,观察测试用例能否“杀死”非等价变异体,未杀死的需补充新用例 。

3.7 软件测试三个核心问题

第二次小测已考。

核心问题含义关键词
测试用例生成如何构造有效测试输入和测试条件==黑盒、白盒==、组合、随机等
测试预言如何知道实际输出是否正确预期结果、现有系统、用户手册、专家知识、标准规范
测试充分性测试是否足够覆盖率、需求覆盖、代码覆盖

测试预言

测试预言是测试的预期结果,是与实际结果进行比较的依据。测试预言的来源可以是现有系统、用户手册、专家知识、标准规范等,但不能是被测系统自身。

测试充分性

测试充分性即测试覆盖率问题。测试覆盖率是测试可信性的重要指标,但并不是覆盖率越高一定越好:过高覆盖率也可能来自复杂或冗余用例。

3.8 易混淆点

概念错误理解正确理解
测试目的证明程序无错测试是为了发现错误或缺陷
测试预言测试输入预期结果或判定输出正确性的依据
测试充分性只看路径数量可以从需求、代码、功能等角度看覆盖
白盒测试可以保证发现所有逻辑错误即使 100% 覆盖也不能保证发现所有错误

3.9 小测关联

第二次小测已考:

  • 软件测试按实施者分为开发者测试、用户测试、第三方测试;
  • 软件测试三大核心问题:测试用例生成、测试预言、测试充分性;
  • 系统测试核心目的包括验证系统完整性、评估非功能性指标。

3.10 本章复习检查题

填空题

  1. 软件测试过程一般包括测试需求分析、测试计划制定、测试设计、测试开发、测试执行、________和________七个阶段。
  2. 软件测试的三个核心问题是________、
  3. 测试预言是测试的________。

选择题

  1. 黑盒测试主要基于:A. 代码结构 B. 需求规格 C. 机器码 D. 调试日志
  2. 下列关于测试的说法正确的是:A. 测试没有发现错误说明程序无错 B. 测试的目的之一是发现错误 C. 测试预言来自被测系统自身 D. 灰盒测试等于白盒加黑盒

判断题

  1. 测试覆盖率低不一定意味着测试充分性一定不可接受。
  2. 黑盒测试可以发现需求文档不完整导致的功能缺失问题。
  3. 测试预言可以直接使用被测系统自身作为唯一依据。

参考答案

  1. 填空:测试结果分析与评估、测试报告生成;测试用例生成、测试预言、测试充分性;预期结果。
  2. 选择:B;B。
  3. 判断:对;对;错。

第7章01 总复习框架

这一章可以概括为一句话:

软件测试是以测试用例为核心,通过静态/动态、黑盒/白盒、内部/外部、局部/整体等多种策略和方法,对软件全生命周期中的功能、性能、安全、可靠性、兼容性、健壮性、可用性等方面进行缺陷发现和质量评估的活动,其核心问题是测试用例生成、测试预言和测试充分性。


第7章01 客观题必背清单

A. 填空题重点

  1. 狭义软件测试是为了发现错误或缺陷而执行某个程序或软件系统的过程。
  2. 动态测试才是真正意义上的软件测试。
  3. 软件测试的目的是证明程序有错,而不是证明程序无错误。
  4. 软件测试生命周期 STLC 包括:测试需求分析、测试计划制定、测试设计、测试开发、测试执行、测试结果分析与评估、测试报告生成。
  5. 开发者测试包括:单元测试、集成测试、系统测试、确认测试、回归测试。
  6. 单元测试五方面:模块接口测试、局部数据结构测试、路径测试、错误处理测试、边界测试。
  7. 集成测试又叫组装测试或联合测试。
  8. 集成测试方法包括一次性组装方式和渐增式测试。
  9. 渐增式测试典型方式包括自顶向下和自底向上。
  10. 用户测试一般发生在验收测试阶段,有时称 Beta 测试。
  11. 第三方测试的目的是保证测试工作的客观性。
  12. 结构测试又称白盒测试。
  13. 功能测试又称黑盒测试。
  14. 白盒测试包括控制流测试和数据流测试。
  15. 黑盒测试代表方法包括功能分解法、等价类划分法、因果图判定表法、边界值分析法。
  16. 性能测试指标包括 TPS、QPS、RT、ART、并发用户数、资源利用率。
  17. 安全测试关注漏洞或脆弱性。
  18. 可靠性是在规定条件和规定时间区间完成规定功能的能力。
  19. 兼容性测试是非功能性测试。
  20. 健壮性测试有时等同容错测试。
  21. 可用性标准包括容易学习、使用效率、可记忆性、错误频率和严重程度、主观满意度。
  22. 软件测试三个核心问题:测试用例生成、测试预言、测试充分性。
  23. 1 个测试用例 = 1 个测试输入 + 1 个测试预言。

B. 选择题重点

问法答案方向
哪些属于静态测试?技术评审、代码审计、静态分析、软件度量、形式化验证
哪些属于开发者测试?单元、集成、系统、确认、回归测试
哪些属于白盒测试?控制流测试、数据流测试、语句覆盖、路径覆盖
哪些属于黑盒测试?等价类划分、边界值分析、因果图判定表、功能分解
哪些属于性能指标?TPS、QPS、RT、ART、并发用户数、资源利用率
哪些属于安全测试方法?渗透测试、模糊测试、漏洞扫描、安全审计、风险评估
哪些属于可靠性测试方法?故障注入、异常值输入、压力测试、稳定性测试
哪些属于可用性测试方法?实验室实验、现场观察、问卷表、启发式评估
哪些属于测试有效策略?静态+动态、黑盒+白盒、内部+外部、局部+整体
哪些方法可用于测试预言问题?蜕变测试、变异测试

C. 判断题易错点

说法正误原因
测试的目的是证明程序无错误测试目的是发现错误
测试没有发现错误说明程序一定无错未发现不等于不存在
静态测试不需要执行程序静态测试基于制品分析
动态测试不需要测试用例动态测试首先必须有测试用例
黑盒测试不关注程序内部结构基于规约和外部行为
白盒测试基于源代码内部结构关注控制流、数据流等
100%覆盖率一定说明测试充分高覆盖率可能伴随冗余或忽视需求
低覆盖率一定不可接受特殊场景下选择性测试也可能满足需求
用户测试通常在实际或模拟使用环境下进行与开发环境测试不同
第三方测试强调客观性独立于开发者和用户
兼容性测试前应先确保功能正常功能正常是兼容性测试前提
健壮性测试关注异常输入和非法操作检查容错和恢复能力

第7章01 主观题可能考法

虽然这章是概述,但也可能出情景型主观题。

情景1:给一个软件项目,让你设计测试过程

答题模板:

  1. 进行测试需求分析,明确需求点和测试要点;
  2. 制定测试计划,明确目标、范围、测试项、策略、工具、资源和交付物;
  3. 进行测试设计,设计测试用例、测试脚本和覆盖准则;
  4. 进行测试开发,搭建环境、编写脚本、准备驱动/桩和测试数据;
  5. 执行测试,记录日志和缺陷;
  6. 分析评估结果,包括覆盖率、缺陷分布、停止/成功标准;
  7. 生成测试报告,总结风险和遗留问题。

情景2:给一个系统需求,让你选择测试类型

答题模板:

  1. 功能是否正确:功能测试 / 黑盒测试;
  2. 内部逻辑是否覆盖:结构测试 / 白盒测试;
  3. 高并发响应是否正常:性能测试;
  4. 是否存在漏洞:安全性测试;
  5. 是否能长期稳定运行:可靠性测试;
  6. 是否适配不同平台:兼容性测试;
  7. 是否能处理非法输入和异常:健壮性测试;
  8. 用户是否容易使用:可用性测试。

情景3:给一个测试资源有限的项目,让你制定测试策略

答题模板:

  1. 静态测试与动态测试结合:早期用评审/静态分析,后期运行测试;
  2. 黑盒测试与白盒测试结合:既看需求功能,也看代码结构;
  3. 内部测试与外部测试结合:先内测保障充分性,再外测获得真实用户反馈;
  4. 局部测试与整体测试结合:先测模块、接口,再测集成系统;
  5. 根据风险优先级选择重点测试项,例如安全、性能、核心业务路径。

情景4:给一个测试用例设计问题,让你分析三大核心难点

答题模板:

  1. 测试用例生成:如何选择合适输入、路径、条件或需求覆盖;
  2. 测试预言:如何确定预期输出,是否能获得可靠 oracle;
  3. 测试充分性:如何评估覆盖程度,如需求覆盖率、代码覆盖率。

第7章01 最终记忆主线

你可以用下面这条线记住本章:

软件测试首先要明确定义和目的,然后按照 STLC 七阶段执行;测试贯穿全生命周期,由开发者、用户和第三方共同参与;测试类型包括结构、功能、性能、安全、可靠性、兼容性、健壮性和可用性;有效测试需要组合静态/动态、白盒/黑盒、内部/外部、局部/整体策略;典型方法包括组合、随机、蜕变、演化和变异测试;最终围绕测试用例生成、测试预言和测试充分性三个核心问题展开。

第7章01最需要优先背的是:

  1. 软件测试目的:证明程序有错,而不是证明无错
  2. STLC 七阶段
  3. 开发者测试、用户测试、第三方测试
  4. 单元、集成、系统、确认、回归测试的区别
  5. 白盒测试 = 结构测试,黑盒测试 = 功能测试
  6. 常见测试类型及适用场景
  7. 四种有效测试策略组合
  8. 组合测试、随机测试、蜕变测试、演化测试、变异测试的基本思想
  9. 测试用例生成、测试预言、测试充分性三个核心问题