收藏 分享(赏)

ch4白盒测试技术.ppt

上传人:sjmd695 文档编号:9583757 上传时间:2019-08-16 格式:PPT 页数:70 大小:243KB
下载 相关 举报
ch4白盒测试技术.ppt_第1页
第1页 / 共70页
ch4白盒测试技术.ppt_第2页
第2页 / 共70页
ch4白盒测试技术.ppt_第3页
第3页 / 共70页
ch4白盒测试技术.ppt_第4页
第4页 / 共70页
ch4白盒测试技术.ppt_第5页
第5页 / 共70页
点击查看更多>>
资源描述

1、2019/8/16,1,Part,Chapter4 白盒测试技术,2019/8/16,2,4.1白盒测试概述,2019/8/16,3,白盒测试定义,软件的白盒测试是对软件的过程性细节做细致的检查。这一方法是把测试对象看作一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。 因此,白盒测试又也称为结构测试或逻辑驱动测试。,2019/8/16,4,白盒测试内容,白盒测试方法,主要对程序模块进行如下的检查: 对程序模块的所有独立的执行路径至少测试一次; 对所有的逻辑判定,取“真

2、”与取“假”的两种情况都能至少测试一次; 在循环的边界和允许界限内执行循环体; 测试内部数据结构的有效性,等待。,2019/8/16,5,白盒测试特征,已知产品内部工作过程,通过测试来检测产品内部动作是否按照编码规格说明书的规定正常进行,而不管它的功能。 白盒法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据 。,2019/8/16,6,白盒测试特征,白盒法是穷举路径测试。贯穿程序的独立路径数可能是天文数字。因此穷举测试是不可行的。 即使是每条路径都测试了,程序中仍然可能有错误。 原因如下。,2019/8/16,7,白盒测试也是

3、不完善的,原因: 第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序。 第二,穷举路径测试不可能查出程序中因遗漏路径而出错。 第三,穷举路径测试可能发现不了一些与数据相关的错误。,2019/8/16,8,4.2白盒测试基于控制流的方法,逻辑覆盖 基本路径覆盖 循环覆盖,2019/8/16,9,4.2.1基于控制流的方法逻辑覆盖,逻辑覆盖: 语句覆盖 分支覆盖 条件覆盖 条件组合覆盖 全路径覆盖,2019/8/16,10,逻辑覆盖以图1所示程序段为例,2019/8/16,11,逻辑覆盖举例,图1所示程序段有4条不同路径。 L1(ace): (A=2) (B=0)或 (A1)

4、 (B=0) (X/A1) L2(abd): (A 1) (X1)或 (B 0) (A 2) (X1) L3(abe):(A 1) (X1)或 (B 0) (A=2)或(B 0) (X1) L4(acd):(A1) (B=0) (A 2) (X/A1),2019/8/16,12,语句覆盖,语句覆盖就是设计若干个测试用例,运行被测程序,使得每一可执行语句至少执行一次。 又称为C0覆盖。根据粒度不同,也有叫行覆盖、段覆盖、基本块覆盖(basic block coverage)的。,2019/8/16,13,测试用例举例语句覆盖,我们统一测试用例的格式为: 输入(A,B,X),输出(A,B,X)或

5、输入(A,B,X) 如上例,设计满足语句覆盖的测试用例是: (2,0,4),(2,0,3),2019/8/16,14,语句覆盖的盲点,对一些控制结构反映迟钝(发现不了其中的某些错误); 可能发现不了判断中的逻辑运算中出现的错误。 如:第一个判断中的逻辑运算符and错写为or,利用上面的测试用例,依然可达到语句覆盖。,2019/8/16,15,语句覆盖,语句覆盖是最弱的逻辑覆盖准则。在很多公司是最起码的测试要求 。,2019/8/16,16,判定覆盖,判定覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少执行一次。 又称为分支覆盖,C1覆盖,决策覆盖, All-

6、edges coverage,decision-decision-path(DDP)testing。,2019/8/16,17,判定覆盖特征,程序中的每一个分支至少通过一次 。 判定覆盖可扩充到多出口判断(CASE语句)的情形。 整个BOOL型的表达式被认为是取值一个TRUE和一个FALSE,不考虑其内部是否包含了逻辑AND或OR。,2019/8/16,18,判定覆盖的测试用例,上例中,如果选择路径L1和L2,就可得到满足判断覆盖要求的测试用例:L1:(2,0,4),(2,0,3)L2:(1,1,1),(1,1,1) 如果选择路径L3和L4,还可得到另一组满足判定覆盖条件的测试用例:L3:(2

7、,1,1),(2,1,2)L4: (3,0,3),(3,1,1) 可见,测试用例的取法不唯一。,2019/8/16,19,判定覆盖的盲点,忽略了BOOL型表达式内部的BOOL取值。 例中,如果第二个判定中的条件X1错写成X1,那么利用上面两组测试用例,仍能得到同样的结果。 这表明,判定覆盖还不能保证一定能查出在判断条件中存在的错误。,2019/8/16,20,条件覆盖,条件覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的每个条件的可能取值至少执行一次。 条件覆盖的判断条件中的逻辑AND和OR独立起来,独立地度量每一个子表达式,因此对控制流更为敏感。,2019/8/16,21,条件

8、覆盖,上例中,对所有条件的取值加以标记如下: 对第一个判断:条件A1,取真为T1,取假为T1条件B=0,取真为T2,取假为T2 对第二个判断:条件A=2,取真为T3,取假为T3条件X1,取真为T4,取假为T4,2019/8/16,22,满足条件覆盖的测试用例,可选取的测试用例如下:,2019/8/16,23,满足条件覆盖的测试用例,以下测试用例也可。,2019/8/16,24,条件覆盖的弱点,完全的条件覆盖并不能保证完全的分支覆盖。,2019/8/16,25,两组测试用例分析,第一组测试用例满足条件覆盖,同时也满足分支覆盖。 第二组测试用例满足条件覆盖,但不满足分支覆盖。 可见,满足了条件覆盖

9、的测试用例并不一定能测试所有可能的分支。(条件覆盖的盲点),2019/8/16,26,判定条件覆盖,判定条件覆盖就是设计足够的测试用例,运行被测程序,使得程序中每个判断的每个条件的所有可能取值至少执行一次,同时每个判断的所有可能判断结果(分支)至少执行一次。 也叫分支条件组合覆盖。,2019/8/16,27,判定条件覆盖,判定条件覆盖是分支覆盖和条件覆盖的一个混血。 它有两者的简单性。 但却没有两者的缺点。,2019/8/16,28,判定条件覆盖的测试用例,上例中,只需设计以下两个测试用例,便可覆盖图中的8个条件取值以及4个判断分支。,2019/8/16,29,判定条件覆盖的盲点,从表面上看,

10、它测试了所有条件的取值。但事实并非如此,因为往往某些条件会掩盖另一些条件。 例如,对于条件表达式 (A1)and(B=0),若(A1)为真,则还要测试(B=0),才能决定表达式的值;若(A1)为假,可以立刻决定表达式的值为假,这时,程序往往就不再测试(B=0)的取值了;这样,条件(B=0)就没有检查。 因此,采用判断条件覆盖,逻辑表达式中的错误不一定能够查得出来。,2019/8/16,30,修正条件/判定覆盖,Modified Condition/Decision Coverage,也称MC/DC。每一个条件对于判定的结果值是独立的,即单条件的变化将导致判决的变化。,2019/8/16,31,

11、多重条件判定分解,为了彻底检查所有条件的取值,可以将图1给出的多重条件判定分解,形成图2所示的由多个基本判断组成的流程图。这样就可以有效地检查所有的条件是否正确了。,2019/8/16,32,图2 图1的多重条件判断分解分解为多个基本判断,2019/8/16,33,条件组合覆盖,条件组合覆盖就是设计足够的测试用例,运行被测程序,使得程序中每个判断的所有可能的条件取值组合至少执行一次。 也叫多(重)条件覆盖。,2019/8/16,34,条件组合覆盖,每个判定中条件的各种组合至少出现一次。 多条件覆盖需要的测试用例是用一个条件的逻辑操作符的真值表来确定的。,2019/8/16,35,条件组合覆盖优

12、缺点,优点: 达到了条件组合覆盖,所有的语句、分支和条件都将覆盖,因此测试比较彻底。但不保证全部路径的覆盖。 在实际测试中,达到所有条件组合常常是不可能。 缺点: 测试用例比较冗长复杂。 测试用例对于相似的复杂性的条件可能有非常大的变化。,2019/8/16,36,条件组合覆盖的测试用例,对于第一个判断,有2个条件,4个取值组合。 T1 T2 T1 F2 F1 T2 F1 F2 对于第二个判断,也有2个条件,4个取值组合。 T3 T4 T3 F4 F3 T4 F3 F4,2019/8/16,37,条件组合覆盖的测试用例,如果考虑第一个判断的4个组合与第二个判断的4个组合再进行组合,就需要42=

13、16个测试用例了。 如果不考虑第一个判断的4个组合与第二个判断的4个组合再进行组合,则取4个测试用例就能覆盖上面8种条件取值的组合。(下页),2019/8/16,38,条件组合覆盖的盲点,表中的这组测试用例覆盖了所有条件的可能取值的组合,覆盖了所有判断的可取分支。但路径漏掉了L4,故达到条件组合覆盖的测试用例仍是不完全的。,2019/8/16,39,全路径覆盖,全路径覆盖就是设计足够多的测试用例,覆盖程序中所有可能的路径。 一个路径就是一个从函数的入口到函数的出口的唯一的系列分支。 优点:这种方法最严密,可以进行彻底的测试。但所花费的时间和成本也最高,通常实用性不大。,2019/8/16,40

14、,全路径覆盖的测试用例,仍以图1为例,可以选择如下的一组测试用例(可有多组)来覆盖该程序段的全部路径。,2019/8/16,41,全路径覆盖缺点,缺点: 路径是以分支的指数级别增加的。例如:一个函数包含10个if语句,就有1024需要个路径测试,如果再加入一个if语句,就有2048个路径要测试。 许多路径不可能和执行的数据无关。例如:路径覆盖认为下列语句包含四条路径。,2019/8/16,42,全路径覆盖缺点,if(success)statement1;statement2;if(success)statement3; 但实际上可行的路径只有两条。,2019/8/16,43,部分逻辑覆盖的理解

15、要领,分支覆盖是以判断的整个布尔表达式为主; 条件覆盖是以判断的布尔表达式中的某项条件为主; 由于分支覆盖和条件覆盖不是包含的关系,因此教严密的方法是结合这两种方法在一起,即判定条件覆盖。 条件组合覆盖是从判定条件覆盖延伸过来的。,2019/8/16,44,各种逻辑覆盖的关系,从语句覆盖,到全路径覆盖,越来越严格。,2019/8/16,45,4.2.2基于控制流的方法基本路径测试,上面的例子是个非常简单的程序段,只有4条路径。 在实际问题中,一个不太复杂的程序(特别是程序中有循环体时) ,其路径都是一个庞大的数字。 要在测试中覆盖这么多的路径是不现实的。为解决这一问题,只得把覆盖的路径数压缩到

16、一定限度内(例如,程序的循环体只执行一次。),基本路径覆盖就是这样的一种测试方法。,2019/8/16,46,基本路径测试,基本路径是Tom McCabe首先提出的一种白盒测试技术。,2019/8/16,47,基本路径测试,基本路径覆盖是在程序控制图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而来设计测试用例。从该基本集导出的测试用例能保证程序中的每一个可执行语句至少执行一次。 基本路径集不是唯一的。,2019/8/16,48,基本路径测试的主要步骤,以详细设计或源代码作为基础,导出程序的控制流图。 计算得到的控制流图G的环路复杂性V(G)。 确定线性无关的路径的基本集。

17、 生成测试用例,确保基本路径集中每条路径的执行。,2019/8/16,49,控制流图的图形符号,符号o 称为控制流图的一个结点,它表示一个或多个无分支的程序语句。 程序结构表示:顺序结构、选择结构、多分支选择结构、循环结构。 如果选择结构的判断中的条件表达式是复合条件时,需要改复合条件的判断为一系列只有单个条件的嵌套的判断。,2019/8/16,50,程序环路复杂性,从程序的环路复杂性可导出程序基本路径集合中的独立路径条数,这是确保程序中每个可执行语句至少执行一次所必需的测试用例数目的上界。 一条“独立路径”是指至少包含有一条在其它独立路径中从未有过的边的路径。,2019/8/16,51,计算

18、控制流图的环路复杂性,V(G)控制流图的区域数量。注:控制流图中,边和结点圈定的封闭范围叫区域。 图形外不封闭的区域也应记为一个区域。 V(G)P+1 P为流图中判定结点数量。 V(G)E-V+2 E为流图中边的数量,N为流图中节点数量。(edge, node),2019/8/16,52,4.2.3基于控制流的方法循环测试,循环是大多数软件实现算法的重要部分。 循环测试报告你是否执行了每个循环零次,只有一次,还是多次。 循环测试注重于循环构造的有效性。 有四种循环: 简单循环、串接循环、嵌套循环、不规则循环。(如图所示),2019/8/16,53,四种循环测试,2019/8/16,54,简单循

19、环的测试集,整个跳过循环。 只有一次通过循环。 两次通过循环。 m次通过循环,其中mn。 n1,n,n1次通过循环。n是允许通过循环的最大次数。,2019/8/16,55,嵌套循环的测试集,如果将简单循环的测试方法用于嵌套循环,测试数就会随着嵌套层数成几何级增加,导致不实际的测试数目。 Beizer提出了一种减少测试数的方法: 从内层循环开始,将其他循环设置为最小值。,2019/8/16,56,嵌套循环的测试集,对最内层循环使用简单循环测试,而使外层循环的循环计数最小,并为范围外或排除的值增加其他测试。 由内向外构造下一个循环的测试,但其他的外层循环为最小值,并使其他的嵌套循环为典型值。 继续

20、直到测试完所有的循环。,2019/8/16,57,串接循环测试和不规则循环,可以使用嵌套循环的策略测试串接循环。 对于不规则循环,应尽可能地将这类循环重新设计为结构化的程序结构。,2019/8/16,58,循环测试循环控制值集,2019/8/16,59,4.3白盒测试基于数据流的方法,通过一定的覆盖准则检查程序中每个数据对象的每次定义、使用和消除。 数据流模型(DUK) 数据流覆盖策略,2019/8/16,60,4.4 白盒测试代码覆盖率分析,2019/8/16,61,代码覆盖率分析的过程,找出程序经过一系列测试而没有执行到的部分代码。 创建一个附加的测试用例来增加覆盖率。 决定代码覆盖的定量

21、度量。达到则停止,否则继续执行步骤一、二。,2019/8/16,62,代码覆盖率分析,覆盖率分析有一定的好处和弱点。 好处:能够识别出没有增加覆盖率的无效的测试用例。 但,覆盖率分析只是许多种测试技术中的一种,你不能只是依靠它。 你应该选择一个度量方法,建立一个覆盖率要达到的最小百分比,来决定何时可以停止覆盖率分析了。,2019/8/16,63,代码覆盖率分析的基础假设,和控制流相关的缺陷,都可以通过变更控制流的方法来发现。 寻找和控制流相关的缺陷,不需要知道缺陷引起的后果和缺陷发生的可能性。 程序中没有不可达到的代码且完成了需求定义的功能。,2019/8/16,64,覆盖率分析基本的度量,基

22、于代码的控制流的逻辑,逻辑覆盖: 语句覆盖(Statement Coverage) 判定覆盖( Decision Coverage) 条件覆盖( Condition Coverage) 判定条件覆盖(Decision/Condition Coverage) 条件组合覆盖( Multiple-Condition Coverage) 全路径覆盖(All-Path Coverage),2019/8/16,65,覆盖率分析其它的度量,函数覆盖:报告是否每个函数都执行了。 函数出入口覆盖:报告对函数的入口、出口和终止指令的覆盖情况。 调用覆盖:报告是否每个函数调用都执行了。 线性代码顺序及跳转覆盖 目标

23、代码分支覆盖 循环覆盖,2019/8/16,66,覆盖率分析其它的度量,竞争覆盖:报告是否多个线程在同一时间执行了同一代码。帮助检测资源的同步失败问题。 比较操作符覆盖:报告对于比较操作符是否发生了边界条件。 弱变化覆盖 表覆盖,2019/8/16,67,白盒测试覆盖分析器,覆盖分析器是分析测试覆盖率的工具; 通过对源代码的词法分析,插入可跟踪代码,再编译连接; 当装配过可跟踪代码的软件执行时,就会产生一个跟踪文件; 测试完成后,利用跟踪文件生成覆盖报告。,2019/8/16,68,覆盖率目标,每个项目都应该选择一个最低的覆盖率目标;对于安全标准要求严格的软件应该制定一个高的目标。 常用的覆盖率度量是语句覆盖、分支覆盖、判定/条件覆盖,其覆盖率目标值一般不低于80%;但一般也不会定为100%。,2019/8/16,69,欢迎提问和讨论,2019/8/16,70,谢 谢 !,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报