自考王立福软件第6章软件测试.docx
《自考王立福软件第6章软件测试.docx》由会员分享,可在线阅读,更多相关《自考王立福软件第6章软件测试.docx(30页珍藏版)》请在冰点文库上搜索。
![自考王立福软件第6章软件测试.docx](https://file1.bingdoc.com/fileroot1/2023-5/23/fb55286d-0094-480e-a72c-955245960f05/fb55286d-0094-480e-a72c-955245960f051.gif)
自考王立福软件第6章软件测试
第六章软件测试
错误是不可避免的,因此发现错误是保障软件过程质量和软件产品质量的基础。
软件评估可以为静态评估和动态评估。
评审、走查和形式化证明等是静态评估技术。
软件测试是一种常用的动态评估技术。
基于程序路径的“白盒”测试技术和基于规约的“黑盒”测试技术。
静态分析技术------程序的形式化证明。
软件产品是创造性劳动产生的一种逻辑产品。
6.1软件测试目标与软件测试过程模型
6.1.1软件测试目标
软件测试目的的认识:
软件测试可定义为:
按照特定规程发现软件错误的过程;IEEE的定义为:
“使用人工或自动手段,运行或测试某个系统的过程,其目的是检验它是否满足规定的需求,或清楚了解预期结果与实际结果之间的差异。
”
错误(Error):
是指“与所期望的设计之间的偏差,该偏差可能产生不期望的系统行为或失效”。
失效(Failure)是指:
“与所规约的系统执行之间的偏差”。
失效是系统故障和错误的后果。
故障(Fault)是指:
“导致错误或失效的不正常的条件”。
故障可以使偶然性的或者系统性的。
软件测试和调试的区别:
目的、技术、方法
1)测试从一个侧面证明程序员的“失败”。
调试是为了证明程序员的正确。
2)测试以已知条件开始,使用预先定义的程序且有预知的结果,不可预见的仅是程序是否通过测试。
调试一般是以不可知的内部条件开始,除统计性调试外,结果是不可预见的。
3)测试是有计划的,并要进行测试设计。
调试是不受时间约束的。
4)测试是一个发现错误、改正错误、重新测试的过程。
调试是一个推理过程。
5)测试的执行是有规程的。
调试的执行往往要求程序员进行必要推理。
6)测试经常是由独立测试组在不了解软件设计的条件下完成。
调试必须由了解详细设计的程序员完成。
7)大多数测试的执行和设计可以工具支持。
调试时,程序员能利用的工具主要是调试器。
6.1.2软件测试过程模型
NO
YES
环境模型是对程序运行环境的抽象。
建立测试环境模型的主要目的是,确定所发现的错误是否为环境造成的。
对象模型是从测试的角度对程序的抽象。
不同测试技术,对同一被测试对象可产生不同的对象模型。
或重于程序的控制结构,或重于处理流程,于是形成了所谓的“白盒”测试技术和“黑盒”测试技术。
错误模型是对程序中错误对象及其分类的抽象。
在建立了环境模型、被测对象模型以及错误模型的基础上,才能设计测试用例,执行测试,并进行测试结果的比较。
如果预期结果和实际结果不符,首先就要考虑是不是环境模型、被测试对象模型、错误模型以及测试执行中的问题。
当判断不是它们的问题时,才能认为被测对象中存在错误。
可见,在软件测试中:
1)环境模型、被测对象模型和错误模型在软件测试中扮演了一种很重要的角色;这些模型的质量,特别是程序模型的质量,对发现错误具有关键性作用。
2)软件测试的错误假定是,实际结果与期望结果不符,而后在此基础上可进一步分析是什么错误。
6.2软件测试技术
白盒测试技术,又称为结构测试技术,典型的是路径测试技术;
黑盒测试技术,又称为功能测试技术,包括事务处理流程技术、状态测试技术、定义域测试技术等。
白盒测试技术依据的是程序的逻辑结构,而黑盒测试技术依据的是软件行为的描述。
6.2.1路径测试技术
基本要点:
●采用控制流程图来表达被测程序模型,揭示程序中的控制结构。
●通过合理地选择一组穿过程序的路径,以达到某种测试度量。
1.
控制流程图
Cd
abfg
e
控制流程图是一种表示程序控制结构的图形化工具,其基本元素是过程块、节点、判定。
过程块:
是没有被判定和(或)被节点分开的一组程序语句。
基本属性是:
如果过程块中的某个语句被执行,那么快中的所有语句都被执行。
按照测试的观点,对于一个过程块,如果其操作细节不影响控制流,那么就可以把这些操作细节视为不重要的,如果其操作细节影响控制流,那么这一影响只能在其后的判定中表现出来。
可见,过程块是支持程序抽象的主要概念。
判定:
是一个程序点,此处控制流出现分叉。
按照测试的观点,判定和语言上的判定语句没有本质上的差异。
节点:
也是一个程序点,此处控制流进行结合。
链:
是过程块、判定、节点之间一种具有特定语句的关系,其中的语句是通过他们的执行而体现出来的
2.测试策略
为了回答什么是“完整的测试”,路径测试有着各种度量或称为测试策略。
a
bTc
dTe
(1)路径覆盖(PX):
执行所有可能穿过程序控制流程的路径。
该度量是最强的
测试用例
路径覆盖
【(2,0,4),(2,0,3)】
aàcàe
【(1,1,1),(1,1,1)】
aàbàd
【(2,1,1),(2,1,2)】
aàbàe
【(3,0,3),(3,0,1)】
aàcàd
路径覆盖测试用例
这里所说的测试用例是指为了发现程序中的故障而专门设计的一组数据或脚本。
(2)语句覆盖(P1):
至少执行程序中所有语句一次。
是一种最低的测试度量,因此发现程序错误的能力很弱。
测试用例
路径覆盖
【(2,0,4),(2,0,3)】
aàcàe
语句覆盖测试用例
(3)分支覆盖(P2):
至少将程序中的每一个分支执行一次。
分支覆盖是一种比语句覆盖稍强的覆盖。
测试用例
路径覆盖
【(2,0,4),(2,0,3)】
aàcàe
【(1,1,1),(1,1,1)】
aàbàd
或
测试用例
路径覆盖
【(2,1,1),(2,1,2)】
aàbàe
【(3,0,3),(3,0,1)】
aàcàd
分支覆盖测试用例
(4)条件覆盖与条件组合覆盖
条件覆盖:
是指每个判定中的所有可能的条件取值至少执行一次。
测试用例
通过路径
条件取值
覆盖分支
【(1,0,3),(1,0,4)】
L3
¬T1T2¬T3T4
b,e
【(2,1,1),(2,1,2)】
L3
T1¬T2T3¬T4
b,e
条件覆盖测试用例
条件组合覆盖是指设计足够的测试用例,使每个判定中的所有可能的条件取值组合至少执行一次。
条件组合覆盖还是一种比路径覆盖弱的测试覆盖。
1(A>1),(B=0),可标记为T1,T2.
②(A>1),(B≠0),可标记为T1,¬T2
3(A≤1),(B=0),可标记为¬T1,T2
4(A≤1),(B≠0),可标记为¬T1,¬T2
5(A=2),(X>1),可标记为T3,T4
6(A=2),(X≤1),可标记为T3,¬T4
7(A≠2),(X>1),可标记为¬T3,T4
⑧(A≠2),(X≤1),可标记为¬T3,¬T4
测试用例
覆盖条件
覆盖组合号
通过路径
【(2,0,4),(2,0,3)】
T1T2T3T4
1,⑤
L1
【(2,1,1),(2,1,2)】
T1¬T2T3¬T4
2,⑥
L3
【(1,0,3),(1,0,4)】
¬T1T2¬T3T4
3,⑦
L3
【(1,1,1),(1,1,1)】
¬T1¬T2¬T3¬T4
4,⑧
L2
条件组合覆盖测试用例
测试覆盖率:
是定量地描述了一个或一组测试的效率(或称测试完成程度)。
语句覆盖≦分支覆盖≦条件组合覆盖≦…路径覆盖
路径敏化:
对于路径判断表达式,如果能够找到一个有效的办法,使其路径是可达的、这一过程称为路径敏化。
3.路径选取与测试设计
路径选取的一般原则:
●选择最简单的、具有一定功能含义的入口/出口路径。
●在已选取的基础上,选取无循环的路径;选取短路径、简单路径。
●选取没有明显功能含义的路径,此时要研究这样的路径为什么存在,为什么没有通过功能上合理的路径得到覆盖。
abcde
开始
YESYES
Ihgf
YESYES
m
路径选取示例
选取路径:
abcde,abhkgde,abhlibcde,abcdfjgde,abcdfmibcde.
针对一个程序测试而言,实现什么测试覆盖,这是一个管理决策问题,其中涉及成本、进度和质量等因素。
循环结构中的路径选取:
(1)单循环
1)最小循环次数为0,最大次数为N,且无“跳跃”值。
-101N-1NN+1
单循环测试路径选取之一
2)非零最小循环次数,且无跳“跃值”。
X(典型值)
456878889
单循环测试路径选取之二
3)具有跳跃值的单循环。
3258
456X313233575859x878889
单循环测试路径选取之三
(2)嵌套循环
嵌套循环的路径选取的基本策略:
1)从最深层的循环开始,设定所有外层循环取它的最小值
2)测试最小值减1、最小值、最小值加1、典型值、最大值减1、最大值、最大值加1。
于此同时,测试“跳跃值”边界。
3)设定内循环在典型值处,按2)测试外层循环,直到覆盖所有循环。
(3)级联循环
级联循环路径选取原则:
●如果级联循环中每个循环的控制变量有关,则可视为嵌套循环。
●如果级联循环中每个循环的控制变量无关,则可视为单循环。
级联循环实例
NO
YES
路径测试技术与测试过程模型之间的关系
路径测试技术支持测试过程模型的中间部分。
●路径测试技术是一种简单、实用的单元测试技术,通过程序中的控制逻辑可以发现数据错误、基本计算错误等。
●路径测试技术是基于程序逻辑结构的,对错误的假定是软件通过了与设想不同的路径。
●在路径测试技术中,采用控制流程图作为模型表达式,支持创建被测程序的模型。
●基于路径的基本属性,路径测试技术给出了几种常见的测试路径覆盖,包括语句覆盖、分支覆盖、条件组合覆盖和路径覆盖等,这几种覆盖是一个偏序。
根据软件特定的需要,可以在条件组合覆盖和路径覆盖之间定义其他类型的覆盖。
●路径选取是测试用例设计的基础。
在实际软件测试工作中,好的用例设计是发现程序错误的关键。
(4)混杂循环
6.2.2基于事务流的测试技术
基于事务流的测试技术是一种功能测试技术,以下简称事务流测试技术。
定义域测试技术、等价类测试技术、因果图测试技术等通称为黑盒测试技术。
黑盒测试是只通过外部的输入和输出来发现软件中的错误,因此黑盒测试是一种基于软件规约的测试。
1.事务与事务流程图
事务流程图示例
一个事务是指从系统用户的角度出发所见到的一个工作单元,尤其“生”,尤其“亡”。
事务由一系列操作组成,可用一个事务流表达。
一个事务流是系统行为的一种表示方法,为功能测试建立了程序的动作模式。
在事务流测试技术中,是通过操作的一个序列即事务流来表达一个事务的。
因此,一个系统行为表现为多个事务流的执行,可抽象为一个事务流程图。
事务流中的某些操作可能有系统执行,某些操作可能有用户或系统之外的设备执行,他们共同协作,完成用户的一项工作。
一个事务流是系统行为的一种表达方法,为功能测试建立了程序的动作模型。
事务流程图和控制流程图
这类测试技术的基本步骤可概括为:
1)定义有用的图形模式
2)设计并执行必要的测试用例
3)覆盖该图形所表达的行为
事务流程图是一种数据流程图。
差异:
●基本模型元素所表达的的语义不同
●一个事务不等同于路径测试中的一条路径,可能在中间某处就完成了某一用户工作,终结了一个事务
●事务流程图中的分支和节点可能是一个复杂的过程。
1事务分支
路径1
路径2
2事务并生
父事务
父事务
子事务
3事务分裂
子事务
父事务
子事务
4事务汇集
路径1
后继事务
路径2
5事务吸收
A
A
B
6事务结合
父事务1
子事务
父事务2
事务流程图具有很差的结构原因:
①它是一种处理流程,其中可能包含人工的判断和处理。
②某些部分可能与软件开发人员不能控制的行为有关。
③性能的增加,可使事务数目和单个处理流程具有相当的复杂性。
④事务流程表达的系统模型更接近现实,如中断,多任务、同步、并行处理等,所有这一切已不再适合结构化概念。
2.事务流测试技术的应用
采用事务流测试技术进行软件测试的步骤:
第一步:
获得事务流程图
第二步:
浏览、复审
第三步:
用例设计
第四步:
测试执行
事务流测试技术的要点:
●与路径测试技术一样,支持测试过程模型的中间部分。
●事务流测试技术是将路径路径测试技术用于功能测试的产物,是一种实用的功能测试技术,通过事务的操作逻辑发现软件中的逻辑错误、数据错误、计算错误等。
该技术可用于开发组的有效性测试中,也可用于客户的验收测试中。
●事务流测试技术是基于软件规约的,对错误的假定是软件通过了与预想不同的事务路径。
●在事务流测试技术中,采用事务流程图作为模型表达式,支持创建被测软件的模型。
●基于事务的基本属性,事务流测试技术最大的问题和最大的代价是获得事务流程图以及用例设计。
事务分类和选取是测试用例设计的基础。
在实际软件测试工作中,好的用例设计是发现软件错误的关键。
●一般地,事务处理流程测试要求达到基本事务的覆盖;但是,大多数错误将在奇异的、不受注意的或非法的操作流中发现;更为重要的是,在事务处理流程测试中,如果设计测试用例时能与设计者讨论,将可以发现比运行测试更多的错误。
6.2.3其他功能测试技术简述
黑盒测试对软件功能规约或用户手册中所列的功能以及与功能相关的性能进行测试,包括对正常和异常的输入(或操作)、出错处理、边界情况和极端情况等进行测试。
1.等价类划分
2.边界值分析
3.因果图
6.3软件测试步骤
6.3.1单元测试
单元测试关注每个独立的模块。
单元测试以详细设计文档为指导,测试模块内的重要控制路径。
单元测试往往采用白盒测试技术。
单元测试期间,通常考虑模块的以下4个特征:
以及与这4个特征相关的边界条件。
1)模块接口
2)局部数据结构
3)重要的执行路径
4)错误的执行路径
第一:
首先测试穿过模块接口的数据流
其实:
进行数据结构测试
第三:
还要进行执行路径的选择测试
第四:
边界测试
驱动模块和承接模块作为单元测试的测试设备,需要花费一定的开销进行编制。
6.3.2集成测试
集成测试关注模块的组装
集成测试是软件组装的一个系统化技术,其目标是发现与接口有关的错误,将经过单元测试的模块构成一个满足设计要求的软件结构。
自顶向下的集成测试
模块组2模块组3
模块组1
自底向上的集成测试
6.3.3有效性测试
有效性测试关注检查是否符合用户所见的文档,包括软件需求规格说明书、软件设计规格说明书、用户手册。
系统测试关注检验系统中所有元素(包括硬件、信息等)之间的协作是否合适,整个系统的性能、功能是否达到。
有效性测试的目标是发现软件实现的功能与需求规格说明书不一致的错误。
因此,有效性测试通常采用黑盒测试技术。
配置复审:
已组合软件
要求
有效的软件
用户文件
用户文件发布的软件
设计文件有效的配置
代码列表
测试文件
6.4
本章小结
测试、分析、确认和验证之间的关系
+=
支持
动态分析:
是指执行程序的分析,测试为动态分析提供必要的信息。
6.5习题
1.基本概念
(1)软件测试:
有规程的发现错误的过程。
错误:
与所期望的设计之间的偏差,该偏差可能产生不期望的系统行为或失效
失效:
在所规约的系统执行之间的偏差,失效是系统故障或错误的后果
故障:
导致错误或失效的不正常条件.故障可以是偶然性的或是系统性的
(2)测试用例
是指为了发现程序中的故障而专门设计的一组数据或脚本。
(3)测试覆盖率
是定量地描述了一个或一组测试的效率(或称测试完成程度)。
2.简答题
(1)软件测试过程模型,并分析这一模型在软件测试技术研究以及实践中的作用
NO
YES
在建立了环境模型、被测对象模型以及错误模型的基础上,才能设计测试用例,执行测试,并进行测试结果的比较。
如果预期结果和实际结果不符,首先就要考虑是不是环境模型、被测试对象模型、错误模型以及测试执行中的问题。
当判断不是它们的问题时,才能认为被测对象中存在错误。
可见,在软件测试中:
软件测试是一个有程序的过程,包括测试设计、测试执行、以及测试结果比较等
1)环境模型、被测对象模型和错误模型在软件测试中扮演了一种很重要的角色;这些模型的质量,特别是程序模型的质量,对发现错误具有关键性作用。
2)软件测试的错误假定是,实际结果与期望结果不符,而后在此基础上可进一步分析是什么错误。
(2)软件测试与调试之间的区别
软件测试和调试的区别:
目的、技术、方法
1)测试从一个侧面证明程序员的“失败”。
调试是为了证明程序员的正确。
2)测试以已知条件开始,使用预先定义的程序且有预知的结果,不可预见的仅是程序是否通过测试。
调试一般是以不可知的内部条件开始,除统计性调试外,结果是不可预见的。
3)测试是有计划的,并要进行测试设计。
调试是不受时间约束的。
4)测试是一个发现错误、改正错误、重新测试的过程。
调试是一个推理过程。
5)测试的执行是有规程的。
调试的执行往往要求程序员进行必要推理。
6)测试经常是由独立测试组在不了解软件设计的条件下完成。
调试必须由了解详细设计的程序员完成。
7)大多数测试的执行和设计可以工具支持。
调试时,程序员能利用的工具主要是调试器。
(3)程序流程图的作用以及构成:
着重于过程属性描述
作用:
构成:
(4)简述语句覆盖、分支覆盖、条件组合覆盖、路径覆盖的含义及他们之间的关系
语句覆盖:
至少执行程序中所有语句一次。
分支覆盖:
至少将程序中的每一个分支执行一次。
条件组合覆盖:
使每个判定中的所有可能的条件取值组合至少执行一次。
路径覆盖:
执行所有可能穿过程序控制流的路径。
关系:
语句覆盖≦分支覆盖≦条件组合覆盖≦…路径覆盖
(5)简述单元测试、集成测试、有效性测试的含义及它们之间的区别
单元测试:
单元测试主要检验软件设计的最小单元---模块。
该测试以详细设计文档为指导,测试模块内的重要控制路径。
一般来说,单元测试往往采用白盒测试技术。
集成测试:
集成测试是软件组装的一个系统化技术,其目标是发现与接口有关的错误,将经过单元测试的模块构成一个满足设计要求的软件结构。
有效性测试:
有效性测试的目标是发现软件实现的功能与需求规格说明书不一致的错误,因此,有效性测试通常采用黑盒测试技术。
区别:
单元测试集中于单个模块的功能和结构验证;集成测试集中于模块组合的功能和软件结构验证;有效性测试验证软件需求的可追溯性;系统测试验证将软件融于更大系统中时整个系统的有效性。
(6)简述路径测试技术、事务流测试技术的主要依据
路径测试技术依据的是程序的逻辑结构
事务流测试技术依据的是软件行为的描述
(7)针对程序流程图中出现的各种循环,如何选取测试路径
(1)单循环
选取:
循环控制变量为-1、0、1、典型重复次数、N-1、N、N+1的路径
选取:
循环控制变量次数为“最小重复次数减1”、“最小重复次数”、“最小重复次数加1”、“典型重复次数”、“最大重复次数减1”、“最大重复次数”、“最大重复次数加1”
选取:
除把每一个“跳跃”边界按“最小循环次数”和“最大循环次数”处理外,其他规则同前两种单循环的路径选取一样。
(2)嵌套循环
从最深层的循环开始,设定所有外层循环取它的最小值
测试最小值减1、最小值、最小值加1、典型值、最大值减1、最大值、最大值加1。
与此同时,测试“跳跃值”边界。
(3)级联循环
如果级联循环中每一个循环的控制变量有关,则可视为嵌套循环。
如果级联循环中每个循环的控制变量无关,则可视为单循环。
(8)简述程序流程图与事务流程图之间的主要却别,并分析出现这些区别的原因。
差异:
●基本模型元素所表达的的语义不同
●一个事务不等同于路径测试中的一条路径,可能在中间某处就完成了某一用户工作,终结了一个事务
●事务流程图中的分支和节点可能是一个复杂的过程。
2事务分支
路径1
路径2
7事务并生
父事务
父事务
子事务
8事务分裂
子事务
父事务
子事务
9事务汇集
路径1
后继事务
路径2
10事务吸收
A
A
B
11事务结合
父事务1
子事务
父事务2
3.简述白盒测试技术的要点,并举例说明
白盒测试技术依据程序的逻辑结构,以控制流程图作为被测对象的建模工具,其中涉及过程块、分支、节点、链以及路径,并针对测试x,给出了4种覆盖策略:
语句覆盖、条件组合覆盖、路径覆盖,他们之间具有偏序关系,并且可根据项目需求给出其他覆盖策略
由于路径测试技术依据的是程序的逻辑结构,因此该技术的基本要点是:
采用控制流程图来表达被测程序模型,揭示程序中的控制结构。
通过合理地选择一组穿过程序的路径,以达到某种测试度量。
举例:
4.简述事务流测试技术的要点,并举例说明
事务流测试技术是一种功能测试技术,目前提出了很多功能测试技术,如定义域测试技术、等价类测试技术以及基于因果图的测试技术等,统称为黑盒测试技术。
黑盒测试将被测软件看成黑盒子,只通过外部的输入和输出来发现软件中的错误,因此黑盒测试是一种基于测试规约的测试。
●与路径测试技术一样,支持测试过程模型的中间部分。
●事务流测试技术是将路径路径测试技术用于功能测试的产物,是一种实用的功能测试技术,通过事务的操作逻辑发现软件中的逻辑错误、数据错误、计算错误等。
该技术可用于开发组的有效性测试中,也可用于客户的验收测试中。
●事务流测试技术是基于软件规约的,对错误的假定是软件通过了与预想不同的事务路径。
●在事务流测试技术中,采用事务流程图作为模型表达式,支持创建被测软件的模型。
●基于事务的基本属性,事务流测试技术最大的问题和最大的代价是获得事务流程图以及用例设计。
事务分类和选取是测试用例设计的基础。
在实际软件测试工作中,好的用例设计是发现软件错误的关键。
●一般地,事务处理流程测试要求达到基本事务的覆盖;但是,大多数错误将在奇异的、不受注意的或非法的操作流中发现;更为重要的是,在事务处理流程测试中,如果设计测试用例时能与设计者讨论,将可以发现比运行测试更多的错误。
举例:
5.根据图6-24所示的程序流程图,设计最少的测试用例实现分支覆盖(注:
在设计测试用例时,其中的循环结构可以看做一个过程块)
开始
a
FbTc
de
f
g
jk
h
结束
i
T
F
lm
结束
某程序流程图
路径:
L1(aàcàeàfàg-àhàiàl)
L2(aàbàdàfàg-àhàiàl)
L3(aàcàeàkàiàl)
L4(aàbàdàkài-àl)
L5(aàcàeàfàg-àhàj)
L6(aàbàdàfàg-àhàj)
L7(aàcàeàfàg-àhàiàm)
L8(aàbàdàfàg-àhàiàm)
L9(aàcàeàkàiàm)
L10(aàbàdàkài-àm)
分支覆盖