暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【软件评测师】考点16——白盒测试

昊洋与你一起成长 2021-08-09
2338

白盒测试是软件评测师上午场和下午场考试中每年必考的知识点,白盒测试又称结构测试,通过对程序内部结构的分析、检测来寻找问题。白盒测试可以把程序看成装在一个透明的白盒子里,也就是清楚了解程序结构和处理过程,检查是否所有的结构及路径都是正确的,检查软件内部动作是否按照设计说明的规定正常进行。下面就白盒测试中的静态测试、动态测试和白盒测试策略等知识点进行总结学习。


白盒测试方法很多,总体上被划分为以下两种方式:

(1)静态测试:主要有代码检查法、静态结构分析法和代码质量度量法等;

(2)动态测试:主要有功能确认与接口测试、逻辑覆盖分析法、基本路径测试法、性能分析与内存分析等。


一、静态测试

(1)代码检查法:包括桌面检查、代码审查和走查等,主要检查代码和设计的一致性,代码对标准的遵循、可读性,代码逻辑表达的正确性,代码结构的合理性等方面;发现违背程序编写标准的问题,程序中不安全、不明确和模糊的部分,找出程序中不可移植部分、违背程序编程风格的问题;包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构检查等内容。

优势:在实际使用中,代码检查比动态测试更有效率,能快速找到缺陷,发现30%-70%的逻辑设计和编码缺陷;代码检查看到的是问题的本身,而非征兆。

不足:代码检查非常耗时间,而且代码检查需要知识和经验的积累。

准备工作:代码检查在编译和动态测试之前进行,在检查前,应准备好需求描述文档、程序设计文档、程序的源代码清单、代码编码标准和代码缺陷检查表等。


(2)静态结构分析法:以图形的方式表现程序的内部结构,例如函数调用关系图和模块控制流图等。这些图表可以清晰地标识整个软件系统的组成结构,使其更便于他人阅读和理解,然后可以通过分析这些图表,来检查软件有没有存在缺陷与错误。


(3)代码质量度量法:ISO/IEC 9126国际标准所定义的软件质量包括六个方面:功能性、可靠性、易用性、效率、可维护性和可移植性。软件的质量是软件属性的各种标准度量的组合,以ISO/IEC 9126质量模型作为基础,我们可以构造质量度量模型,用于评估软件的每个方面。


二、动态测试

动态测试通常在静态测试之后进行,要根据程序的控制结构设计测试用例。功能确认与接口测试包括各个单元功能的正确执行和单元间的接口,而在考试中出现最多的就是逻辑覆盖分析法和基本路径测试法,下面我们分别讲解一下。


(1)逻辑覆盖分析法:设计出足够的测试用例来完成对被测试程序进行全方位的执行覆盖。主要包括逻辑覆盖法和路径覆盖法两种方法。

1)逻辑覆盖法:用测试用例数据来运行被测程序,以考察对程序逻辑的覆盖程度,主要是针对程序中的由于判定条件所产生的逻辑分支结构进行测试。典型的逻辑覆盖度量标准有6种,按照从低到高的排序依次为(其中判定覆盖和条件覆盖顺序不分先后):语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、修正的判定/条件覆盖(MCDC覆盖)和条件组合覆盖。


语句覆盖:这是最弱的逻辑覆盖标准,指通过选择足够的测试用例,使得运行测试用例的时候,被测程序每个语句至少被执行一次。


②判定覆盖:设计足够的测试用例,使得程序中的每个判定至少都获得一次 “真值”或“假值",或者说使得程序中的每一个取“真"分支和取“假”分支至少经历一次,因此判定覆盖又称为分支覆盖。除了双值的判定语句外,还有多值判定语句,如case语句,因此判定覆盖更一般的含义是:使得每一-个判定获得每一种可能的结果至少一次。判定覆盖是比语句覆盖稍强的覆盖标准。


③条件覆盖:对于每个判定中所包含的若干个条件,应设计足够多的测试用例,使得判定中每个条件都至少取得一次“真值”和“假值”的机会,判定中的每个条件的所有可能结果至少出现一次。


④判定/条件覆盖:指通过设计足够多的测试用例,使得运行判定中的每个条件的所有可能的结果至少运行一次,并且每个判定本身的所有可能结果也至少出现一次。也就是说:既满足判定覆盖,又满足条件覆盖。


⑤修正的判定/条件覆盖:修正条件判定覆盖方法要求在一个程序中每一种输入输出至少得出现一次,在程序中的每一个条件必须产生所有可能的输出结果至少一次,并且每一个判定中的每一个条件必须能够独立影响一个判定的输出,即在其他条件不变的前提下仅改变这个条件的值,而使判定结果改变。


⑥条件组合覆盖:通过设计足够多的测试用例,使得每个判定中条件结果的所有可能的组合至少出现一次。假设有n个条件,那么最终得出的用例数是2^n个用例。注意:条件组合覆盖对每个判定分别考虑它们的条件组合,不是对整个程序中的所有条件的组合。满足条件组合覆盖,一定满足判定/条件覆盖。


2)路径覆盖法:从由于各种逻辑判定条件所形成的复杂的程序执行逻辑这个角度入手,进行覆盖的一种方法,与逻辑覆盖有一定的联系,站在整个程序的角度,覆盖率比上面提到的6种覆盖率更强。条件组合覆盖不能保证程序中所有可能的路径都被覆盖了,而路径覆盖是指设计足够多的测试用例,使得程序中每条可能执行到的路径都至少经过一次,如果路径中有环路,则每条环路至少经过一次。注意:路径覆盖考虑了程序中各种判定结果的所有可能组合,但是没有考虑判定中条件结果的组合,所以不能替代条件覆盖和条件组合覆盖。


(2)基本路径测试法:在程序控制流图的基础上,通过分析控制结构的环路复杂度,导出基本可执行路径集合,从而设计测试用例的方法。


1)设计出的测试用例要保证在测试中程序的每个可执行语句至少执行一次,基本路径测试法包括以下5个方面:

程序的控制流图:描述程序控制流的一种图示方法;

②程序环路复杂度:MaCabe复杂性度量,从程序的环路复杂度可导出程序基本路径集合中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界,也就是应该设计的测试用例的数目;

确定线性无关路径的基本集;

④准备测试用例,确保基本路径集中每一条路径的执行;

⑤图形矩阵:在基本路径测试中起到辅助作用的软件工具,利用它可以自动地确定一个基本路径集。


2)控制流图:是描述程序控制流的一种图示方式,在控制流图中,节点是程序中代码的最小单元,用圆圈表示,边代表节点间的程序流,用带箭头的实线表示。


3)环路复杂度:即McCabe复杂性度量,在进行程序的基本路径测试时,从程序的环路复杂性可导出程序基本路径集合中的独立路径条数,这是确保程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。一个有E条边和N个节点的流程图G ,可以用下述3种方法中的任何一种来计算环路复杂度:

①控制流图中的区域数等于环路复杂度。

②控制流图G的环路复杂度V(G)=E-N+2,其中,E是流图中边的条数,N是结点数。

③控制流图G的环路复杂度V(G)=P+1,其中,P是流图中判定结点的数目。



4)线性无关路径:又叫做基本路径集或者独立路径,指包含一组以前没有处理的语句或条件的路径。从控制流图上来看,一条线性无关路径是至少包含一条在其他线性无关路径中从未有过的边的路径。一个控制流图的一组基本路径集在数目上和环路复杂度是保持一致的,但是基本路径集不是唯一的,对于给定的控制流图,可以得到不同的基本路径集。



三、白盒测试策略

(1)在测试中,应尽量先用工具进行静态结构分析。

(2)测试中可采取先静态后动态的组合方式:先进行静态结构分析、代码检查和静态质量度量,再进行覆盖率测试。

(3)利用静态分析的结果作为引导,通过代码检查和动态测试的方式对静态分析结果进行进一步的确认,使测试工作更为有效。

(4)覆盖率测试是白盒测试的重点,一般可使用基本路径测试法达到语句覆盖标准;对于软件的重点模块,应使用多种覆盖率标准衡量代码的覆盖率。

(5)在不同的测试阶段,测试的侧重点不同:在单元测试阶段,以代码检查、逻辑覆盖为主;在集成测试阶段,需要增加静态结构分析、静态质量度量;在系统测试阶段,应根据黑盒测试的结果,采取相应的白盒测试。



下面是近几年上午场对白盒测试考察过的真题,近几年基本上都是在上午题的第61和62两个小题出现,并且每次考试基本上都是上午场2道题目,下午场一道大题。以后仍是考试出题的重点,大家要重视起来。

【2017年61题】一个程序的控制流图中有 5个节点、9条边,在测试用例数最少的情况下,确保程序中每个可执行语句至少执行一次所需测试用例数的上限是(  )。

A、2    

B、4       

C、6    

D、8

解析:本题考查程序的控制流图的基础知识。

这里涉及到一个公式,要确保程序中每个可执行语句至少执行一次所需测试用例数的上限公式是:边数-结点数+2;套用到本题中就是9-5+2=6。

故正确答案为:C



【2017年62题】对于逻辑表达式(((a>0) && (b>0)) || c<5),需要(  )个测试用例才能完成条件组合覆盖。

A、2    

B、4       

C、8    

D、16

解析:本题考查条件组合覆盖的基础知识。

本题目中有三个条件:a>0、b>0和c<5,所以需要2^3=8个测试用例。

故正确答案为:C



【2018年61题】一个程序的控制流图中有8个节点、12条边,在测试用例数最少的情况下,确保程序中每个可执行语句至少执行一次所需测试用例数的上限是(  )

A

B

C

D8

解析:本题考查程序的控制流图的基础知识。

控制流程图的环路复杂性 V(G)等于:边数-结点数+2=12-8+2=6。

故正确答案为:C


【2018年62题】对于逻辑表达式(((a|b) ‖ (c>2)) && d<0),需要(  )个测试用例才能完成条件组合覆盖。


A

B

C

D16

解析:本题考查条件组合覆盖法的基础知识。

条件覆盖的测试用例数为:2^n,本题条件为(a|b)、c>2、d<0三个条件。本题需要注意的是只有&&连接才是条件,而&|只是简单的按位操作,不是逻辑运算符,所以a|b只能算是一个条件。如果是ab就要算是a和b两个条件了。

故正确答案为:C



【2019年61题】一个程序的控制流图中有5个结点,8条边,在测试用例数最少的情况,确保程序中毎个可执行语句至少执行一次所需要的测试用例数的上限是(  )


A4              

B5                   

C6                

D7

解析:本题考查软件测试的基础知识。

控制流程图的环路复杂性 V(G)等于:边数-结点数+2=8-5+2=5。       

故正确答案为:B



【2019年62题】对于逻辑表达式(buf_c[i] > 223 && buf_c[i] < 240 && i+2 < total_bytes),需要(  )个测试用例才能完成条件组合覆盖。

A2       

B4       

C8      

D16

解析:本题考查软件测试的基础知识。

条件组合覆盖的测试用例数为:2^n,本题条件为(buf_c[i]>223、buf_c[i]<240、i+2<total_bytes)三个条件。

故正确答案为:C


作者唯一官方个人微信公众号(昊洋与你一起成长):HYJY20180101

写于2021年8月9日

作者:昊洋讲师

版权所有,侵权必究



文章转载自昊洋与你一起成长,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论