软件测试技术
一、引论
-
为什么要进行软件测试
软件测试:产品质量的保证、控制成本的关键、软件可靠性确认、让企业具备国际竞争的实力
软件总存在缺陷,且缺陷带来的损失是巨大的。只有通过测试,才能发现软件缺陷,将软件缺陷从系统中清理出去。缺陷发现越早,软件就越容易更正,产品也越稳定。
-
软件测试的4种导向(时间顺序)
-
Bill Hetzel博士(功能验证导向,正向思维的代表):
软件测试就是为程序能够按预期设想那样运行而建立足够的信心。
软件测试是一系列活动以评价一个程序或系统的特性或能力并确定是否达到预期的结果
-
Glenford J. Myers(破坏性检测导向反向思维的代表):
测试是为了证明程序有错,而不是证明程序无错误
一个好的测试用例是在于它能发现至今未发现的错误
一个成功的测试是发现了至今未发现的错误的测试
-
以质量评估为导向,测试是提供产品的评估和质量度量。
-
以缺陷预防为导向,测试是为了展示软件符合设计要求,发现缺陷、预防缺陷。
-
-
软件测试的5大学派
- 分析学派(Analytic School):认为软件是逻辑性的,将测试看做计算机科学和数学的一部分,结构化测试、代码覆盖率就是其中一些典型的例子。他们认为测试工作是技术性很强的工作,侧重使用类似UML工具进行分析和建模。
- 标准学派(standard school):从分析学派分离出来并得到IEEE的支持,把测试看做侧重劣质成本控制并具有可重复标准的、旨在衡量项目进度的一项工作,测试是对产品需求的确认,每个需求都要得到验证。
- 质量学派(Quality School):软件质量需要规范,测试就是过程的质量控制、揭示项目质量风险的活动,确定开发人员是否遵守规范,测试人员扮演产品质量的守门员角色。
- 上下文驱动学派(Context-Drive School):认为软件是人创造的,测试所发现的每一个缺陷都和利益者密切相关,认为测试是一种有技巧的心理活动;强调人的能动性和启发式测试思维,探索性测试就是典型的代表。
- 敏捷学派(Agile School):认为软件就是持续不断的对话,而测试就是验证开发工作是否完成,强调自动化测试,TDD是典型代表。
-
什么是软件测试
软件测试是”验证(Verification)“和”有效性确认(Validation)“活动构成的整体。
- 验证:检验软件是否已经正确地实现了产品规格书定义的系统功能和特性
- 有效性确认:确认所开发的软件是否满足用户真正需求
-
软件测试和软件质量保证SQA的关系
软件质量保证(Software Quality Assurance,SQA)活动是通过对软件产品有计划地进行评审和审计来验证软件是否合乎标准的系统工程,通过协调、审查和跟踪以获取有用信息,形成分析结果以指导软件过程。
- SQA是一项管理工作,侧重于对流程的评审和监控
- 测试是一项技术性的工作,侧重对产品进行评估和验证
- 软件测试是SQA重要手段之一,为SQA提供所需的数据,作为质量评价的客观依据。
二、软件测试基本概念
-
软件缺陷
- 从产品内部看,软件缺陷是软件产品开发或维护过程中所存在的错误、毛病等各种问题
- 从外部看,软件缺陷是系统所需要实现的某种功能的失效或违背
-
修复软件缺陷的代价
以需求分析阶段为标准,设计阶段是3~6倍,编程阶段是10倍,内部测试阶段是20~40倍,发布后是40~1000倍,修正错误的代价几乎呈指数增长。
-
软件测试结束的标准
用例全部测试;覆盖率达到标准;缺陷率达到标准;其他指标达到标准。
-
软件测试的分类
广义测试将需求和设计的评审也纳入测试的范畴。
- 按测试的对象或范围分类:单元测试、集成测试、文档测试、系统测试等
- 按测试目的分类:功能测试、回归测试、性能测试、压力测试、安全测试、兼容性测试等
- 按被测软件是否被执行:静态测试、动态测试
- 按是否针对系统的内部具体实现来完成测试:白盒测试、黑盒测试
静态测试
对软件产品的需求和设计规格说明书的评审、对程序代码的复审等,不需要对代码进行编译或运行。静态分析的查错和分析功能是其他方法所不能替代的。可以采用人工检测、计算机辅助、自动化分析。
动态测试
通过真正运行程序发现错误。观察代码运行过程,从而对系统行为进行验证。
或者通过有效的测试用例和对应的输入输出来分析程序运行的情况,发现缺陷。
回归测试
为保证软件中新的变化(新增代码、修改代码等)不会对原有功能的正常使用产生影响而进行的测试。
压力测试
也称负载测试,用来检查系统在不同负载(如数据量、连接数、并发用户等)条件下的系统运行情况,特别是高负载、极限负载下的系统运行情况,以发现系统不稳定、性能瓶颈、内存泄漏、CPU使用率过高等问题。
-
软件测试的工作范畴
- 测试的组织与管理:制定测试策略、测试计划;确认所采用的的测试方法与规范;控制测试进度;管理测试资源
- 测试的实施:编制符合标准的测试文档;搭建测试环境;开发测试脚本;与开发组织协作实现各阶段的测试活动
三、软件测试方法
-
白盒测试和黑盒测试
-
白盒测试(结构测试/逻辑驱动测试)
按照程序内部的结构来测试程序,检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。
-
黑盒测试(功能测试/数据驱动测试)
在完全不考虑程序内部结构和特性的情况下,在程序接口进行测试,检查程序是否能按照需求规格说明书的规定接收输入数据、产生正确的输出信息。
白盒测试 黑盒测试 静态测试 静态-白盒测试
对源程序代码的语法检查、扫描、评审等静态-黑盒测试
对需求文档、需求规格说明书等非技术性文档的审查和测试动态测试 动态-白盒测试
在单元测试中,一边运行代码,一边对结果进行检查、验证、调试等动态-黑盒测试
运行程序时,通过数据驱动软件进行功能测试,从用户角度验证软件功能 -
-
测试用例
测试用例是为某个特殊目标编制的一组测试输入、执行条件及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。内容包括包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,并形成文档。
测试用例构成了设计和制定测试过程的基础,是软件测试的核心。
随着测试用例数量的增加,对产品质量和测试流程也就越有信心;随着测试内容细化,也可以更准确地估计测试周期各连续阶段的时间安排。判断测试是否完全的一个主要评测方法是基于需求的覆盖,而这又是以测试用例的数量为依据的。
测试设计和开发的类型以及所需的资源主要都受控于测试用例。
最佳方案是为每个测试需求至少编制两个测试用例:一个测试用例用于证明该需求已经满足(正面测试用例);另一个测试用例反映某个无法接受、反常或意外的条件或数据,用于论证只有在所需条件下才能够满足该需求(负面测试用例) -
白盒测试
-
语句覆盖:每个语句至少执行一次
-
判定覆盖:每个if语句的真分支和假分支至少执行一次
-
条件覆盖:每个if语句中的每个条件的可能取值至少满足一次
-
路径覆盖:覆盖所有可能的路径(组合,出现循环时将难以执行)
-
判定-条件覆盖:判定覆盖+条件覆盖
-
条件组合覆盖:与判定-条件覆盖类似,但不是简单地要求每个条件都出现“真”与“假”两种结果,而是要求让这些结果的所有可能组合都至少出现一次
-
修正条件/判定覆盖:由于判定-条件覆盖太弱,条件组合覆盖的冗余又太多,从而产生了修正条件/判定覆盖,在判定-条件覆盖的基础上,要求一个判定中的每个条件都曾独立地影响过这个判定的结果。
-
程序流程图和控制流图
-
基本路径测试法
覆盖程序流程图中的每一条线段(不要求组合),构造基本路径集合,对每条路径进行测试。
-
环路复杂度(圈复杂度、McCabe复杂度)
代码逻辑复杂度的度量,提供了被测代码的路径数量。复杂度越高,出错的概率越大。
环路复杂度通过控制流图计算,有以下三种计算方法:
\(V(G) = 区域数量(节点+连线保卫的区域,包括外部区域)\)
\(V(G) = 连线数量 - 节点数量 + 2\)
\(V(G)=判定节点数量(if分支语句)+1\)
-
-
静态黑盒测试
-
等价类划分法
等价类是某个输入域的子集,该子集中每个输入数据的作用是等效的。
分为有效等价类(合法)和无效等价类(不合法)。
-
边界值分析法
很多错误发生在输入或输出范围的边界上,因此针对各种边界情况设置测试用例,可以更有效地发现缺陷。确定边界后,选取正好等于、刚刚大于或小于边界值作为测试数据。
-
判定表法
等价类划分法、边界值分析法更适用于单一因素输入,因果图、判定表更适合多因素。
判定表由条件和活动组成,列出了一个测试活动执行所需的条件组合。
步骤:列出条件桩→列出动作桩→填表形成初始判定表→简化、合并相同动作
-
因果图法
用图解的方法表示输入的各种组合关系,写出判定表,从而设计相应的测试用例。
-
-
有限状态机(以堆栈为例)
有限状态机是一种动态黑盒测试方法。由状态、事件、动作组成。可以用以下三种方式表示:
-
状态图
-
状态表
状态\输入 init push pop top delete initial empty empty filled ERROR ERROR deleted filled filled(size<max-1)
or fullfilled(size>1)
or emptyfilled ERROR full ERROR filled full ERROR deleted -
状态转化树
-
四、测试流程
-
测试过程改进
-
TMM(软件测试能力成熟度模型)
描述了遵循一个软件测试过程可能达到的预期结果的范围。TMM的建立得益于以下三点:
充分吸收CMM(软件能力成熟度模型)的精华;基于历史演化的测试过程;业界的最佳实践
-
TPI(基于连续性表示法的测试过程改进的参考模型)
20个关键域;TPI成熟度矩阵
-
CTP(关键测试过程评估模型)
是内容参考模型、上下文相关的方法,通过对现有测试过程的评估识别过程的强弱,提供改进意见。有12个关键过程。
-
STEP(系统化测试和评估过程)
是一个内容参考模型,认定测试是一个生命周期活动,基于需求执行测试,测试驱动开发。STEP强调度量,如测试状态、缺陷趋势、缺陷密度、测试成本等等
-
五、单元测试
-
什么是单元测试
- 定义:对软件基本组成单元(如函数、类的方法等)进行的测试。
- 测试人员:单元测试和编码同步由程序人员和开发人员完成,QA提供辅助。
- 相关概念:模块、组件、单元
- 方法:测试每一条独立路径,保证每条语句至少执行一次;检查局部数据结构完整性;检查模块接口是否正确;检查临界数据处理的正确性;预见、预设的各种出错处理是否正确有效
- 依据:详细设计说明书、概要设计说明书
单元测试不仅测试代码,还有:接口测试、局部数据结构测试、独立路径测试、独立路径测试、边界条件测试、错误处理测试、功能测试、性能测试、内存使用测试等。
-
单元测试的目标
测试单元模块是否被正确编码。具体包括:
- 信息能否正确地流入和流出单元
- 在单元工作过程中,其内部数据能否保持完整性,包括内部数据的形式、内容和相互关系,也包括全局变量在单元中的处理和影响
- 在为限制数据加工而设置的边界处,能否正常工作
- 单元的运行能否满足特定的逻辑覆盖
- 如果发生了错误,其中的错误处理是否有效
六、集成测试和系统测试
-
什么是集成测试
- 定义:在单元测试的基础上,将模块按照设计要求集成起来,对模块之间的接口进行测试
- 测试人员:有经验的测试人员和开发人员共同进行
- 依据:概要设计说明书(主要)、详细设计说明书
- 集成测试分类
- 模块内的集成,主要测试模块中各个接口间的交互集成关系
- 子系统内的集成,测试子系统内各个模块间的交互关系
- 系统内的集成,测试系统内各个子系统和模块间的集成关系
-
集成测试的目的
一些模块虽然能单独工作,但并不能保证连接起来也正常工作。集成测试的目标在于检验与软件设计相关的程序结构问题,如数据穿过接口时丢失、子功能组合起来无法产生预期的主功能等。
-
集成测试的模式
-
非渐增式测试模式
先分别测试每个模块,再把所有模块结合成所要的程序。如大棒集成方法(A B C D E→整体)。
-
渐增式测试模式
对于每一个要测试的模块,将其同已经测试好的其他模块结合起来进行测试。
-
自顶向下:需要对未经集成测试的模块开发桩模块。
-
自底向上:需要对未经集成测试的模块开发驱动模块。
-
混合策略:A→B C D→ABCD→E F G→ABCDEFG
-
三明治集成:E F G→BEF DG→C→ABCDEFG
-
改善的三明治集成:E F G→B D→BEF DG→A C→ABCDEFG
-
-
驱动程序和桩程序
单独测试某一模块,或其他模块尚未通过测试时,需要基于被测单元的接口,开发相应的驱动模块和桩模块。
-
驱动模块
对底层或子层模块进行测试所编写的调用这些模块的程序
-
桩模块
对顶层或上层模块进行测试时锁编写的替代下层模块的程序。
-
-
什么是系统测试
- 定义:系统测试又叫特征测试,检验系统所有元素之间的协作是否合适,整个系统的性能和功能是否达到要求。
- 人员:软件测试工程师
- 测试内容
- 功能测试
- 非功能测试:性能测试、压力测试、容量测试、安全性测试、可靠性测试、容错性测试
- 回归测试
- 依据:需求说明书、概要设计说明书、详细设计说明书,最重要的是需求说明书。
-
确认测试
确认测试又称有效性测试,是在模拟的环境下运用黑盒测试的方法,验证被测软件是否满足需求规格说明书中列出的需求,即软件的功能、性能等特性是否与用户的要求一致。
七、验收测试
-
什么是验收测试
- 定义:检查软件是否符合合同要求,包括需求规格说明、设计规格说明、用户手册等。
- 人员:用户和测试部门共同完成
- 测试内容
- 易用性测试(用户界面)
- 兼容性测试(软件兼容性测试、数据共享兼容性测试、硬件兼容性测试)
- 安装测试、可恢复性测试、文档测试等
- 依据:国家规范、行业标准、合同条款、用户确认的需求规格说明书
-
α、β测试
(可以认为α是内测,β是公测)
-
α测试
软件开发公司组织内部人员,在开发环境下模拟用户行为对即将面市的软件(称为α版本)进行测试,试图发现错误并修正。
-
β测试
经过α测试调整的软件称为β版本。β测试是组织部分典型用户实际使用β版本,并报告异常情况、反馈使用意见,然后软件开发公司再对β版本进行纠错和完善。
-
八、国际化和本地化
-
概念
-
I18N:Internationalization,国际化
使软件系统有能力处理多种语言和不同文化,从而在创建不同语言版本时不需要重新编写代码。
-
L10N:Localization,本地化
将一个软件按特定国家/地区或语言市场的需要进行加工,使之满足对语言和文化的特殊要求。
-
G11N:Globalization,全球化,I18N+L10N
-
九、测试自动化
- 什么是自动化测试
- 定义:自动化测试是相对手工测试的概念,由手工逐个运行测试用例的操作过程被测试工具自动执行的过程所代替。
- 特征:测试工具的使用
- 自动化测试和测试自动化
- 自动化测试:关注测试执行活动,即由测试工具自动完成测试
- 测试自动化:是一种理念,“一切可以由计算机系统自动完成的测试任务都由计算机系统或软件工具、程序来承担并自动执行”
ST和ET各自的优缺点是什么?
ST:Scripted Testing,基于脚本的测试,先测试后执行,通过测试验证思路,有明显的阶段性,易于管理,是传统测试方法。
ET:Exploratory Testing,探索式测试,设计和思考并行,节奏快、效率高,不断向系统提问、不断学习,是现代测试方法。
往年题里有这道题,没细看,上考场一看卷子当场破防。
同学们务必对照ppt看看这题,不要把ST和ET当做静态测试和动态测试(我真想不到脚本和探索这俩词,寄