前 言
本书导读
本书是一本关于软件测试的教材,旨在为读者提供软件测试的理论与方法。本书从
测试的可判定性问题出发,结合概率统计和图论基础建立软件测试理论。从软件测
试多样性原则和故障假设原理出发,重新审视开发者测试、功能测试、性能测试和
安全测试等各类方法。本书穿插简要讲解部分智能化软件测试和智能软件系统测试
的最新研究成果。全书共8 章,以软件测试理论为主线,讲解常用软件测试方法背
后的内在联系和主要区别,以启发读者思考。软件测试工具、测试案例和实践内容
请参阅线上资源。
第1 章是软件测试快速入门,通过一个简单的三角形程序Triangle,快速介绍软件测试
的基本内容。1.1 节介绍多样性测试原则,包括随机测试、等价类测试和组合测试。1.2 节
介绍故障假设测试原理,包括常见的软件故障类型、边界故障假设和变异故障假设。1.3 节
介绍图分析测试方法,包括图生成方法、图结构测试和图元素测试。通过学习本章,读者
可以对软件测试常用方法有一个初步的了解。
第2 章是软件测试基础。2.1 节简要介绍软件测试的基础概念,包括测试用例和测试报
告等基本术语,同时对常用待测软件类型进行分析,为后续章节的测试方法讨论提供基础。
2.2 节介绍软件测试教材中常用的3 个待测程序,这3 个程序贯穿全书,但后续章节也会引
入更加复杂的待测软件作为示例。2.3 节重新审视软件测试的理论问题,包括测试终止、测
试预言和测试生成问题,这三大问题贯穿全书,成为软件测试理论与方法的核心所在。第
2 章为后续章节的深入学习奠定基础。
第3 章是Bug 理论基础,介绍Bug 的概念、Bug 的分类、Bug 的生命周期等。3.1 节首
先简要介绍软件Bug 的历史,从自然界的Bug 到计算机的Bug。名词概念的借鉴和延伸是
工程技术领域的常用手段。3.2 节首先介绍PIE 模型,建立执行—感染—传播的基本分析框
架,为Bug 的准确定义和统一概念提供基础,并将PIE 模型结合概率计算完成执行概率、感
染概率、传播概率的定量计算,但它常常受到各种前提条件的限制。在PIE 模型基础上,结
合简单统计公式实现故障定位的预测,从而衔接测试与调试。3.3 节介绍Bug 的反向定义,
即通过执行测试的动态分析和故障修复来定义Bug。这样的反向定义势必带来Bug 的不确
定性。对于任意程序和失效测试,存在不同的修复方法,使得测试通过,从而可以派生不
同的Bug 定义,并介绍Bug 非单调性定义,以及它给测试和修复带来的障碍。借鉴物理波
的相长干涉和相消干涉概念,定义Bug 间的干涉,并分析干涉给测试和调试带来的诸多挑
软件测试基础
战。第3 章可以帮助读者更好地理解软件测试中Bug 的本质和处理方法。
第4 章是多样性测试,介绍软件测试中的多样性测试策略。4.1 节介绍均匀随机测试、非
均匀随机测试、反馈引导距离极大化的自适应随机测试以及路径遍历引导性随机测试。4.2
节介绍等价类假设策略及其常用方案,包括等价类划分策略、等价类划分和随机测试相结
合的理论与方法,以及用F-度量、P-度量和E-度量对不同测试方法进行缺陷检测能力度
量。4.3 节介绍组合测试的基本思路,以及经典的t 强度-组合测试准则、约束组合测试准则
和可变强度组合测试准则,采用基于随机贪心的经典组合测试策略AETG 等方法来完成测
试生成优化。第4 章为读者提供基础且丰富的测试方法选择。
第5 章是故障假设测试,介绍如何基于故障假设进行测试,以及故障假设测试的方法
和技巧。5.1 节介绍最常用的边界故障假设,包括输入边界、中间边界和输出边界。中间边
界又分为静态的代码边界和动态的计算边界。5.2 节介绍变异故障假设,包括变异分析的基
本概念、变异算子选择方法及其相关理论性质以及变异分析理论框架。5.3 节介绍变异分析
在逻辑控制密集型的安全攸关软件中的应用,包括将程序逻辑抽象成布尔范式,从而进行
故障建模以及对逻辑可满足性及其传统逻辑可满足性问题进行扩展求解的能力方法SMT。
第5 章可以帮助读者掌握另外一种简单有效的软件测试策略。
第6 章是图分析测试,介绍图分析测试的基本概念、图分析测试的方法和技术。图被广
泛应用于软件测试覆盖准则的定义和分析中。6.1 节介绍图测试理论方法和传统教科书中
的结构化测试方法。图测试要求测试人员覆盖图的结构或元素,通过遍历图的特定部分完
成测试目标。图测试理论方法可以面向任何软件抽象图,而不仅仅是控制流图、数据流图
和事件流图。6.2 节将传统的结构化测试方法分为三大类:L-路径测试、主路径测试和基本
路径测试。其中,L-路径测试是根据图中路径的长度进行简单延伸的策略;主路径测试主要
针对循环所导致的L-路径测试的无限问题;基本路径测试则是通过引入独立路径概念,覆
盖最大独立路径集合,表征了线性空间的基覆盖。6.3 节的数据流测试关注变量的定义和使
用的元素测试形式,逻辑覆盖准则则以CC、DC、CDC、MCDC 为代表,通过示例说明各
个准则之间的强弱蕴涵关系,强调MCDC 在工业应用中的价值。第6 章为读者提供一种基
于图论的软件测试方法。
第7 章是开发者测试,探讨开发者如何在开发过程中进行自我测试,以及如何与测试团
队协作。7.1 节介绍代码多样性测试策略,要求程序在测试运行时实现对其程序结构的覆盖
遍历;组合多样性测试策略通过分支组合覆盖测试,实现分支条件的组合枚举和测试生成;
行为多样性测试策略通过路径行为特征提取和聚类抽样相结合,满足不同规模的开发者测
试要求。7.2 节介绍边界故障假设,关注静态的代码边界分析;变异故障假设利用变异体来
模拟代码缺陷;逻辑故障假设集中考虑逻辑相关的故障假设。7.3 节介绍测试对象Mock 技
术,并从单元到集成技术过渡,进而讨论单元测试合并产生集成测试的挑战和初步解决方
案,以慕测平台为例介绍开发者测试的多维评估技术META,为开发者改进测试提供反馈
信息。第7 章旨在提高开发者的测试意识和能力。
第8 章是专项测试,介绍针对特定领域或问题的测试方法和技术,重点关注软件质量
属性的3 个重要方面,即功能、性能、安全,从系统级的软件测试视角展开讨论。8.1 节介
绍功能测试,在保证系统级软件质量的过程中,功能测试是最基本的环节。通过功能测试
IV
前 言
可以检测软件的功能是否正常,以及是否符合用户的需求和期望。如果软件的功能测试不
充分或者测试不到位,可能会导致软件出现各种问题,从而影响用户的使用体验。8.2 节的
性能测试检测软件在高负载情况下的响应时间、吞吐量、并发数等关键性能指标;介绍性
能测试的基本内容并采用JMeter 以实现自动化性能测试;阐述性能测试的多样性策略应
用,以及面向性能的系统级的软件变异算子,并结合实际性能缺陷示例进行故障假设说
明。8.3 节介绍安全测试的基本内容以及常用测试方法,重点介绍以模糊策略为代表的安全
测试多样性方法——从简单随机测试到先进的模糊测试,以及模糊测试通用算法和常用工
具AFL。8.3 节介绍常用安全漏洞库,基于漏洞库实现故障假设安全测试,并以Web 安全
漏洞为代表进行详细阐述。
本书适合作为软件工程、计算机科学与技术、信息安全等专业的教材,也可供从事软
件测试工作的工程师、研究人员参考。通过学习本书,读者可以掌握软件测试的基础知识
和实践技能,并且深入思考软件测试的理论和方法。希望本书能够成为广大读者的良师益
友,帮助读者在软件测试领域取得更好的成果。
教学建议
本书主要面向高年级本科生,需要具有一定的编程、软件工程、离散数学和概率统
计基础。本书的第13 章是并行章节,是软件测试的基础内容。教师可以根据自己
的习惯编排次序教学。第46 章也是并行章节,是本书的核心内容,在教学中应该
重点讲解。第7、8 章也是并行章节,是本书的重点实践内容,在课堂教学和课后实
践中都应该反复呼应和复习第16 章。在使用本书时,读者可以根据自己的需求和
兴趣选择关注相应的章节。其中2.1.3 节、2.3 节、3.2.2 节、4.2.4 节、5.2.3 节、5.3.2
节、7.1.3 节包含较多理论内容。对实践内容更感兴趣的读者可以先忽略上述理论章
节。当然,对于那些希望全面了解软件测试的读者,建议阅读全书所有章节。对于
那些对理论内容感兴趣或者从事软件测试行业多年的工程师,相信本书中的软件测
试理论能够对他们有所启发。
陈振宇
2025 年3 月