第0章 软件质量保障概述
0.1 本章定位
本章是全课程的概念基础,说明为什么要做软件质量保障、软件质量如何评估、缺陷为什么是质量问题的核心,以及软件全方位缺陷检测有哪些主流方法。后续软件度量、软件测试、回归测试、性能测试都属于质量保障方法体系中的具体技术。
0.2 核心概念
软件
- 软件是按照特定顺序组织的计算机指令和数据的集合。
- 简化表达:软件 = 程序 + 数据 + 文档。
- 软件三种类型:编程语言,基础软件(开发或运维软件),应用软件(特定领域软件)
- 核心关注点:产品能力,产品质量,开发和运维成本,开发效率
软件质量
软件质量是软件与明确地定义的需求和隐含定义的需求相一致的程度。
软件质量保障
软件质量保障包含管理和技术两个方面,也包含先验方法和后验方法。
- 管理:ISO、CMMI、4P Model 等。
- 技术:分析、测试、监控、模拟等。
软件质量模型
质量模型包括 McCall、Boehm、FURPS/FURPS+、Dromey、ISO/IEC 9126、ISO/IEC 25010 等。
ISO/IEC 25010 八个主要特性:功能性、可靠性、易用性、可维护性、性能效率、安全性、可移植性、兼容性。
软件全生命周期质量保障
软件全生命周期质量保障包含两种类型
- 单生命周期软件质量保障;
- 多生命周期软件质量保障。
全生命周期软件质量如何保证?
通常情况下,软件质量包含:内部质量和外部质量两种
- 内部质量:工作产品的质量;
- 外部质量:最终软件产品的质量。
软件缺陷
软件缺陷常被称为 Bug。是计算机软件或程序中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷。
缺陷的存在会导致软件产品在某种程度上不能满足用户的需要。
课件引用 IEEE729-1983 的思想:从产品内部看,缺陷是软件产品开发或维护过程中存在的错误、毛病等各种问题;从产品外部看,缺陷表现为系统不能满足用户需要的某种失效。
重要判断:
- 软件缺陷是导致软件质量差的重要原因。
- 软件缺陷不可避免。
- 缺陷越早发现,修复代价越小;越晚发现,修复代价越大。
软件缺陷的表现形式
- 错误:错误的算法、错误的模型、错误的代码、错误的公式、错误的单位等;
- 复杂度高:难以理解、不易修改、不易维护;
- Bad Smell:不良设计或不良代码味道;
- 代码冗余:多余代码、重复代码;
- 不可行路径:程序中永远不会被执行的路径;
- 其他相关概念:Defect、Bug、Flaw、Error、Fault、Technical Debt、Weakness、Vulnerability 等。
软件缺陷的分布位置
软件缺陷不只存在于源代码中,也可能存在于软件生命周期的各种工作产品中:
必会判断:
- 软件缺陷只存在于源代码中:错。
- 测试计划、测试用例、测试脚本中也可能存在缺陷:对。
0.3 软件全方位缺陷检测主流方法
软件全方位缺陷检测的总体理解
软件全方位缺陷检测不是只检查源代码,也不是只做测试,而是围绕软件生命周期中的不同阶段、不同对象,使用多种技术手段发现软件中可能存在的缺陷。
检测对象包括:需求文档;设计文档;模型;数据;算法;源代码;测试文档;运行中的软件系统。
从质量角度看,软件缺陷检测既可以关注内部质量,也可以关注外部质量。
软件缺陷检测方法可以从多个角度理解:
软件缺陷检测的 9 种主流方法
软件缺陷检测 9 种主流方法:评审、分析、度量、验证、仿真、测试、监测、基于知识、智能化方法。
0.3.1 评审方法
基本概念
软件评审是一种系统化的质量保障活动,通过团队协作对软件相关文档、设计、代码或流程进行检查,目的是尽早发现缺陷、优化实现方案,并确保交付成果符合需求和质量标准
它是软件工程中预防缺陷扩散和降低开发风险的核心实践
软件评审的核心目标
- 发现缺陷:在需求、设计、代码等阶段暴露错误,避免后期修复的高成本。
- 验证一致性:确保技术方案与需求对齐,避免偏离目标。
- 知识共享:促进团队成员对系统设计的共同理解。
- 合规性检查:符合行业标准(如安全、性能规范)和团队开发规范。
评审对象可以包括:需求文档;设计文档;源代码;测试计划;测试用例;测试脚本;维护文档。
评审可以发现的问题包括:描述不规范;内容不完整;前后不一致;信息冗余;设计不合理;代码不符合规范。
典型评审方法
典型的软件评审方法包括:技术评审、管理评审、同行评审、走查、结构化走查、审查、代码审查、代码审计、代码阅读。
易考判断
- 软件评审可以用于尽早发现需求、设计、代码中的缺陷。对。
- 软件评审只适用于源代码。错。
- 软件运行阶段,技术评审是最好的缺陷检测方法之一。错。
- 软件评审的核心目标之一是确保技术方案与需求对齐,避免偏离目标。对。
0.3.2 分析方法
基本概念
分析方法主要面向代码或程序结构,通过分析程序的控制结构、数据依赖、路径信息、修改影响等内容发现缺陷。
课件中提到的分析方法包括:控制流分析;数据流分析;代码坏味道检测;修改影响分析;路径剖析;程序切片等。
程序分析的核心目标
- 发现缺陷:识别潜在的逻辑错误、内存泄漏、安全漏洞等。
- 优化性能:分析代码执行效率,定位瓶颈(如冗余计算、低效算法)。
- 验证正确性:确保程序行为符合预期(如并发程序的线程安全性)。
- 辅助重构:分析代码依赖关系,支持模块化或架构调整。
- 安全审计:检测恶意代码或合规性问题(如未加密的敏感数据传输)
按分析时机:静态分析,动态分析
按分析深度:语法分析,语义分析,控制流分析,数据流分析
控制流分析与数据流分析
在程序分析中,控制流分析和数据流分析是两种最根本的程序分析技术,它们是其他程序分析技术的前提和基础。
易考判断:数据流分析的一项核心任务是追踪变量值的传播。
静态分析与动态分析
静态分析主要利用程序的结构等静态信息进行分析;动态分析需要利用程序运行过程的信息进行分析。
程序切片
程序切片是一种程序分析技术,可以根据某个变量或语句,提取与其相关的程序片段。
用途:辅助软件错误定位;辅助程序理解;辅助维护和调试;辅助回归测试。
程序切片是一种程序分析技术,可以辅助软件错误定位任务。
路径剖析
路径剖析用于收集程序执行过程中的路径信息。
与程序追踪相比:路径剖析主要关注执行路径;程序追踪通常记录更详细的执行信息;路径剖析缺少对数据流信息的记录;路径剖析开销相对较低。
路径剖析是收集程序执行信息的重要手段;与程序追踪相比,其缺少对数据流信息的记录,但是耗费低廉。
修改影响分析
修改影响分析用于分析软件修改后可能影响到的其他部分。
适用场景:软件维护;缺陷修复;版本迭代;回归测试范围选择。
0.3.3 度量方法
基本概念
软件度量是对软件项目、软件开发过程、软件产品进行数据定义、数据收集和数据分析的持续性量化过程。
其目的是理解、预测、评估、控制和改善软件开发过程及产品
软件度量的对象
软件产品度量
软件产品度量一般包括两类:
- 软件产品结构度量;
- 软件产品质量度量。
软件产品结构度量主要包括:扇入度和扇出度度量、耦合度度量、内聚度度量、复杂度度量。
度量方法的作用
度量方法不是直接运行软件找错误,而是通过指标反映潜在质量问题。
- 模块复杂度过高,可能更容易出错;
- 模块耦合度过高,可能更难维护;
- 内聚度过低,可能说明模块职责不清;
- 扇入扇出异常,可能说明结构设计存在问题。
0.3.4 验证方法
基本概念
验证方法主要通过数学、模型和逻辑推理等方式,检查系统是否满足某些性质。
课件中强调的形式化验证,是验证方法中的典型代表。
什么是形式化验证?
形式化验证是一种使用数学工具分析设计可能行为空间的方法。它不是只计算某个具体输入下的结果,而是通过数学建模和严格推理,来验证设计的正确性,确保设计在所有可能的输入下都能满足预期的功能和性质
形式化验证的优势
形式化验证的局限性
形式化验证并不是没有局限性,不能解决所有系统验证问题。
三种典型形式化验证方法
形式化验证三种主要技术方法:等效性检查、定理证明、模型检验。
0.3.5 仿真方法
基本概念
仿真方法是通过建立模型,模拟真实环境中的软件或系统运行过程,从而发现设计缺陷、性能缺陷或潜在问题。
课件中对仿真方法的核心概括:仿真方法可以通过仿真找出系统设计的性能缺陷。
仿真方法适合用于:复杂系统;嵌入式系统;分布式系统;高环境依赖系统;难以直接在真实环境中测试的系统。
仿真可以发现:性能缺陷;稳定性问题;可靠性问题;兼容性问题;架构设计问题;资源瓶颈问题。
按照被仿真系统的状态变化特征,仿真可分为连续系统仿真、离散系统仿真、混合系统仿真。
0.3.6 测试方法
基本概念
软件测试是一种用于评估软件产品质量的活动过程,旨在通过执行软件的各个功能、检查程序的行为等操作,发现软件中的缺陷(bugs)、错误(errors)或者不符合需求规格说明书的地方。其目的是确保软件产品能够满足用户需求、具有较高的质量和可靠性
软件测试的意义
软件测试是软件质量保证的重要前提,也是软件缺陷发现的主要手段之一。
测试目标:是尽早发现并修复软件中的错误和缺陷,确保软件的功能和性能与需求说明相符合。软件测试贯穿整个软件开发生命周期,通过验证和确认活动过程,确保软件的质量
目标 :以最少的时间和人力,尽可能多地发现程序中的错误和缺陷,并证明软件的功能和性能与需求说明相符合。
软件测试的基本原则
- 尽早测试,问题发现越早,修复代价越小;
- 测试应追溯到用户需求;从小规模测试逐步转向大规模测试;对每个测试结果进行全面检查;
软件测试的三个核心问题
软件测试的三个核心问题是:测试用例生成、测试预言、测试充分性。
测试方法与其他方法的区别
0.3.7 监测方法 / 运行监控
基本概念
软件运行监控是指在软件或系统运行时,实时或近实时地收集、分析和报告其运行状态、性能指标、行为特征、安全状况的过程。
主要目的:确保软件稳定运行;及时发现异常或潜在问题;提高系统可靠性;改善用户体验。
运行监控的作用
- 性能监测:监控运行速度、响应时间等指标;
- 可用性监测:检测服务是否可用,及时处理服务中断;
- 错误检测与处理:发现并处理错误和异常,防止系统崩溃或数据丢失;
- 安全监控:发现潜在安全威胁,保护系统免受攻击。
运行监控的实现方法
Runtime Monitoring 典型技术
- Instrument;
- Tracing Program Execution;
- Aspect Programming;
- Logging;
- Observer 模式。
运行监控主要关注:运行状态、性能指标、行为特征、安全状况。
0.3.8 基于知识方法
基本概念
基于知识方法是利用领域知识检查设计、代码或模型中存在的缺陷。
基于知识图谱的缺陷检测
核心思想:利用知识图谱描述领域知识及关系;获得领域知识图谱;构建领域对象知识图谱,例如程序知识图谱;检测其中关系是否一致、实体是否一致;如果存在不一致,则可能存在缺陷。
三元组
知识图谱通常可以表示为三元组:实体、关系、实体。
如果领域知识图谱和领域对象知识图谱中的实体、关系、三元组之间存在不一致,就可能说明存在设计或代码缺陷。
基于知识图谱的缺陷检测方法主要包含两个关键步骤:知识图谱构建和补全、基于模式匹配的缺陷检测。
0.3.9 智能化方法
智能化软件缺陷检测是指利用人工智能技术自动识别、定位和预测软件系统中的缺陷、错误或漏洞的过程。
机器学习模型可以用于:测试用例自动生成;测试用例选择;测试用例优先排序;测试脚本自动生成;缺陷预测。
智能化缺陷预测内容
智能化方法可以预测软件缺陷的多个方面:
缺陷预测可以包括:缺陷数量、出错倾向性、缺陷密度、缺陷严重性、缺陷分布情况。
评价智能化方法是否有效,可以从以下几个角度看:
智能化方法不只是“用 AI 找 bug”,还可以用于测试用例生成、测试脚本生成、缺陷预测和缺陷定位。
0.4 软件缺陷预测
软件缺陷预测是一种通过分析软件代码、开发过程数据或历史信息,提前识别软件中可能存在的缺陷(Bug)或高风险模块的技术。
其核心目标是帮助开发团队优化测试资源分配、提高软件质量,并降低修复成本
缺陷检测和缺陷预测不是同一个概念。
缺陷预测对象
可以预测的对象包括:模块级、代码变更级、版本级。
常见预测类型包括:版本内缺陷预测;跨版本缺陷预测;跨项目缺陷预测;跨组织 / 企业缺陷预测;跨领域 / 行业缺陷预测;跨国家 / 地区缺陷预测。
缺陷预测典型应用
缺陷预测技术的典型应用包括:出错倾向性预测、缺陷分布预测、缺陷数量预测、缺陷类型预测、缺陷严重性预测等。
0.5 本章小测关联与复习总结
0.5.1 小测已考知识点
0.6 本章易混淆点
0.7 本章必背填空
- 软件 = 程序 + 数据 + 文档。
- 软件质量是软件与明确地定义的需求和隐含定义的需求相一致的程度。
- 软件质量保障 = 管理 + 技术。
- 软件全生命周期质量保障包括单生命周期软件质量保障和多生命周期软件质量保障。
- 全生命周期质量保障有两类方式:先验方法和后验方法。
- 早期质量保障重要,因为软件缺陷越早发现,修复代价越小。
- 软件缺陷常被称为 Bug。
- 软件缺陷检测 9 种主流方法包括:评审、分析、度量、验证、仿真、测试、监测、基于知识、智能化方法。
- 程序分析中两种最根本的技术是:控制流分析、数据流分析。
- 程序分析按是否运行程序可分为:静态分析、动态分析、混合分析。
- 程序分析按分析深度可分为:语法分析、语义分析、控制流分析、数据流分析。
- 软件度量是对软件项目、软件开发过程、软件产品进行数据定义、数据收集和数据分析的持续性量化过程。
- 形式化验证三种主要技术方法是:等效性检查、定理证明、模型检验。
- 按照被仿真系统的状态变化特征,仿真可分为:连续系统仿真、离散系统仿真、混合系统仿真。
- 软件测试的三个核心问题是:测试用例生成、测试预言、测试充分性。
- 软件运行监控主要关注:运行状态、性能指标、行为特征、安全状况。
- 基于知识图谱的缺陷检测方法主要包括两个关键步骤:知识图谱构建和补全、基于模式匹配的缺陷检测。
- 智能化软件缺陷检测是指利用人工智能技术自动识别、定位和预测软件系统中的缺陷、错误或漏洞的过程。
- 缺陷预测对象包括:模块级、代码变更级、版本级。
- 缺陷预测类型包括:版本内、跨版本、跨项目、跨组织 / 企业、跨领域 / 行业、跨国家 / 地区预测。
- 缺陷预测应用包括:缺陷数量、出错倾向性、缺陷密度、缺陷严重性、缺陷分布情况。
0.8 本章必会判断
-
软件不仅包括程序,还包括数据和文档。
对。 -
软件质量保障只靠测试即可完成。
错。测试只是质量保障的一种技术。 -
软件缺陷只存在于源代码中。
错。需求文档、设计文档、模型、数据、测试文档、维护文档中也可能存在缺陷。 -
软件缺陷越早发现,修复代价越小。
对。 -
软件缺陷越晚发现,修复代价越小。
错。越晚发现,修复代价通常越大。 -
静态分析不运行程序。
对。 -
动态分析需要使用程序运行过程中的信息。
对。 -
动态分析只覆盖实际执行过的代码路径。
对。 -
控制流分析和数据流分析是程序分析的基础。
对。 -
数据流分析可以追踪变量值传播。
对。 -
程序切片可以辅助错误定位。
对。 -
路径剖析比程序追踪记录的数据流信息更完整。
错。路径剖析缺少对数据流信息的记录,但开销较低。 -
形式化验证没有局限性,可以解决所有系统验证问题。
错。形式化验证可能存在计算复杂度高、状态爆炸等问题。 -
仿真方法可以用于发现系统设计中的性能缺陷。
对。 -
运行监控只关注系统是否启动,不关注性能和安全。
错。运行监控还关注性能指标、行为特征和安全状况。 -
基于知识图谱的方法可以通过检查实体、关系、三元组是否一致来发现缺陷。
对。 -
智能化方法可以用于测试用例生成、测试脚本生成、缺陷定位和缺陷预测。
对。 -
缺陷检测和缺陷预测是同一个概念。
错。缺陷检测关注发现已有缺陷,缺陷预测关注预测哪里更可能存在缺陷。 -
测试计划、测试用例、测试脚本中也可能有缺陷。
对。 -
软件测试的核心问题包括测试用例生成、测试预言和测试充分性。
对。
0.9 本章必会选择分类
0.10 本章复习检查题
填空题
- 软件质量是软件与________的需求和________的需求相一致的程度。
- 软件全生命周期质量保障包含________和________两种类型。
- 程序分析中两种最根本的技术是________和________。
- 软件缺陷检测 9 种主流方法包括评审、分析、度量、验证、仿真、测试、________、和。
- 形式化验证三种主要技术方法是________、和。
- 按照被仿真系统的状态变化特征,仿真可分为________、和。
- 软件运行监控主要关注________、________、和。
- 基于知识图谱的缺陷检测方法主要包括________和________两个关键步骤。
- 智能化软件缺陷检测是指利用人工智能技术自动识别、定位和预测软件系统中的________、或。
- 软件测试的三个核心问题是________、和。
选择题
-
下列哪项属于静态分析?
A. 程序追踪
B. 数据流分析
C. 压力测试
D. Alpha 测试 -
下列哪项最符合“缺陷预测”?
A. 直接定位已有代码错误
B. 预测哪些模块未来可能发生问题
C. 执行测试用例
D. 生成测试报告 -
下列哪项不是形式化验证的典型方法?
A. 等效性检查
B. 定理证明
C. 模型检验
D. 日志分析 -
下列哪项属于运行监控关注内容?
A. 运行状态
B. 性能指标
C. 行为特征
D. 以上都是 -
基于知识图谱的缺陷检测主要依赖什么?
A. 随机测试
B. 实体、关系、三元组及其一致性
C. 用户界面颜色
D. 压力测试结果
判断题
- 软件缺陷越晚发现,修复代价越小。
- 软件测试是软件质量保障中的唯一技术。
- 路径剖析与程序追踪相比缺少数据流信息,但开销更低。
- 软件缺陷只存在于源代码中。
- 形式化验证可以解决所有验证问题,没有局限性。
- 运行监控只关注系统是否可启动。
- 智能化方法可以用于测试用例生成和缺陷预测。
- 缺陷检测和缺陷预测是同一概念。
参考答案
填空题:
- 明确定义;隐含定义。
- 单生命周期软件质量保障;多生命周期软件质量保障。
- 控制流分析;数据流分析。
- 监测;基于知识;智能化方法。
- 等效性检查;定理证明;模型检验。
- 连续系统仿真;离散系统仿真;混合系统仿真。
- 运行状态;性能指标;行为特征;安全状况。
- 知识图谱构建和补全;基于模式匹配的缺陷检测。
- 缺陷;错误;漏洞。
- 测试用例生成;测试预言;测试充分性。
选择题:
- B。
- B。
- D。
- D。
- B。
判断题:
- 错。
- 错。
- 对。
- 错。
- 错。
- 错。
- 对。
- 错。
0.11 本章复习小结
第0章可以概括成一句话:
软件质量保障不是只做测试,而是围绕软件全生命周期,结合管理和技术,通过评审、分析、度量、验证、仿真、测试、监控、基于知识方法和智能化方法,对文档、模型、数据、代码、算法等对象进行全方位缺陷检测与预测。