『软件测试4』耗子尾汁!2021年了,你还不知道这4种白盒测试方法吗?原创手记

白盒测试又称为结构测试或逻辑驱动测试,它是把测试对象看成一个透明的盒子,它允许测试人员利用程序内部的逻辑结构设计测试用例,对程序所有逻辑路径进行测试。

白盒测试的测试对象是基于被测试程序的源代码,而不是软件的需求规格说明书。

采用白盒测试方法必须遵循以下原则:

白盒测试方法有两大类:静态测试方法和动态测试方法。

静态测试:不要求在计算机上实际执行所测试的程序,主要以一些人工的模拟技术对软件进行分析和测试,如代码检查法、静态结构分析法等;

动态测试:是通过输入一组预先按照一定的测试准则构造实际数据来动态运行程序,达到发现程序错误的过程。白盒测试中的动态分析技术主要有逻辑覆盖法和基本路径测试法。(★★★)

下面将对两种白盒测试方法进行讲解。

代码审查(CodeReview)是指对计算机源代码进行系统地审查,找出并修正在软件开发初期未发现的错误,提升软件质量及开发者的技术。

代码审查的目的是为了产生合格的代码,检查源程序编码是否符合详细设计的编码规定,确保编码与设计的一致性和可追踪性。

代码审查包括桌面检查、代码审查和走查。

1)桌面检查(程序员自己检查)

2)代码审查(审查小组通过读程序和对照错误检查表进行检查)

代码审查是由若干程序员和测试员组成一个审查小组,通过阅读、讨论和争议,对程序进行静态分析的过程。具体过程如下:

第一步,小组负责人提前把设计规格说明书、控制流程图、程序文本及有关要求、规范等分发给小组成员,作为审查的依据。小组成员在充分阅读这些材料后,进入审查的下一步。

第二步,召开程序审查会。每个成员将所发材料作为审查依据,但是由程序员讲解程序的结构、逻辑和源程序。在此过程中,小组成员可以提出自己的疑问;程序员在讲解自己的程序时,也能发现自己原来没有注意到的问题。

注意:在进行代码检查前应准备好需求文档、程序设计文档、程序的源代码清单、代码编码标准、代码缺陷检查表和流程图等。

3)走查(审查小组需要准备有代表性的测试用例沿程序逻辑运行)

走查与代码审查基本相同,其过程分为两步:

第一步:把材料先发给走查小组每个成员,让他们认真研究程序。

第二步:开会。

与代码审查不同的是,让审查小组成员“充当”计算机,即首先由测试组成员为所测程序准备一批有代表性的测试用例,提交给走查小组。走查小组开会,集体扮演计算机角色,让测试用例沿着程序的逻辑运行一遍,随时记录程序的踪迹,提供给最后阶段的分析和讨论使用。

在代码检查中,需要依据被测试软件的特点,选用适当的标准与规则规范。

在静态结构分析法中,测试人员通常通过使用测试工具分析程序源代码的系统结构、数据结构、数据接口、内部控制逻辑等内部结构,生成函数调用关系图、模块控制流图、内部文件调用关系图等各种图形、图表,清晰地标识整个软件的组成结构。

通过分析这些图表,包括控制流分析、数据流分析、接口分析、表达式分析等,使其便于阅读与理解,然后可以通过分析这些图表,检查软件有没有存在缺陷或错误。

1)通过生成各种图表,来帮助对源程序的静态分析

常用的各种引用表主要有:①标号交叉引用表;②变量交叉引用表;③子程序(宏、函数)引用表;④等价表;⑤常数表。

常用的各种关系图、控制流图主要有:

①函数调用关系图:列出所有函数,用连线表示调用关系,通过应用程序各函数之间的调用关系展示了系统的结构。

②模块控制流图:由许多结点和连接结点的边组成的图形,其中每个结点代表一条或多条语句,边表示节点间的控制流向,用于显示函数的内部逻辑结构。(★★★)

2)错误静态分析

静态错误分析主要用于确定在源程序中是否有某类错误或“危险”结构。

①类型和单位分析:数据类型的错误和单位上的不一致。

②引用分析:引用异常,变量赋值先引用,或赋值未引用。

③表达式分析:表达式错误,不正确使用括号,数组下标越界等。

④接口分析:模块的接口,参数的一致性。

逻辑覆盖是以程序内部的逻辑结构为基础来设计测试用例的测试技术,通过对程序内部的逻辑结构的遍历来实现程序的覆盖。它属于白盒测试中动态测试技术之一。

从覆盖源程序语句的详尽程度分析,逻辑覆盖包括以下6种覆盖标准:

接下来将对这6种逻辑覆盖方法进行一一讲解。

①定义:语句覆盖(StatementCoverage)的含义就是设计足够的测试用例,使得被测程序中每条语句至少执行一次。又称行覆盖、段覆盖、基本块覆盖,它是最常见的覆盖方式。

②例子展示:chestnut:

Question:

如下C语言程序语句和对应的程序流程图:

intfunction(intx,inty,intz)

{

if(y>1&&z==0)

x=(int)(x/y)

}

if(y==2||x>1)

x=x+1

returnx;

请使用语句覆盖来为该程序设计测试用例。

Answer:

为了使每条语句都能够至少执行一次,我们可以构造以下测试用例:

输入:x=4,y=2,z=0

执行路径为:sacbed

语句覆盖虽然可以测试执行语句是否被执行到,但却无法测试程序中存在的逻辑错误。因此,语句覆盖是一种弱覆盖。

例如,如果上述程序中的第一个逻辑判断符号“&&”误写了“||”,使用测试用例同样可以覆盖sacbed路径上的全部执行语句,但却无法发现错误。同样,如果第二个逻辑判断符号“||”误写了“&&”,使用同样的测试用例也可以执行sacbed路径上的全部执行语句,但却无法发现上述逻辑错误。

③语句覆盖的目的:

语句覆盖的目的是测试程序中的代码是否被执行,它只测试代码中的执行语句,这里的执行语句不包括头文件、注释、空行等。

语句覆盖在多分支的程序中,只能覆盖某一条路径,使得该路径中的每一个语句至少被执行一次,但不会考虑各种分支组合情况。

①定义:

请使用判定覆盖来为该程序设计测试用例。

以上述代码为例,构造以下测试用例即可实现判定覆盖标准:

输入:①x=1,y=3,z=0,执行路径为sacbd

(判断的结果分别为T,F)

输入:②x=3,y=1,z=1,执行路径为sabed

(判断的结果分别为F,T)

上述两组测试用例不仅满足了判定覆盖,而且满足了语句覆盖,从这一点可以看出判定覆盖比语句覆盖更强一些。所以只要满足了判定覆盖就一定满足语句覆盖,反之则不然。

判定覆盖仍然具有和语句覆盖一样无法发现逻辑判断符号“&&”误写了“||”的逻辑错误。

判定覆盖仅仅判断判定语句执行的最终结果而忽略每个条件的取值,所以也属于弱覆盖。

条件覆盖(ConditionCoverage)指的是设计足够的测试用例,使判定语句中的每个逻辑条件取真值与取假值至少出现一次。

例如,对于判定语句if(a>1ORc<0)中存在a>1、c<0两个逻辑条件,设计条件覆盖测试用例时,要保证a>1、c<0的“真”、“假”值至少出现一次。

请使用条件覆盖来为该程序设计测试用例。

要使程序中每个判断的每个条件都至少取真值、假值一次,我们可以构造以下测试用例:

输入:①x=1,y=2,z=0,执行路径为sacbed

(条件的结果分别为TTTF)

输入:②x=2,y=1,z=1,执行路径为sabed

(条件的结果分别为FFFT)

从条件覆盖的测试用例可知,使用2个测试用例就达到了使每个逻辑条件取真值与取假值都至少出现了一次,但从测试用例的执行路径来看,条件分支覆盖的状态下仍旧不能满足判定覆盖,即没有覆盖bd这条路径。相比于语句覆盖与判定覆盖,条件覆盖达到了逻辑条件的最大覆盖率,但却不能保证判定覆盖。

请使用判定条件覆盖来为该程序设计测试用例。

为满足判定-条件覆盖原则,我们可以构造以下测试用例:

输入:①x=4,y=2,z=0,覆盖路径:sacbed

(判断的结果分别为TT,条件的结果分别为:TTTT)

输入:②x=1,y=1,z=1,覆盖路径:sabd

(判断的结果分别为FF,条件的结果分别为:FFFF)

判定-条件覆盖满足了判定覆盖准则和条件覆盖准则,弥补了二者的不足。但是判定-条件覆盖不一定比条件覆盖的逻辑更强。

③判定-条件覆盖的缺点:没有考虑条件的组合情况。

条件组合(MultipleConditionCoverage)指的是设计足够的测试用例,使得每个判定中条件的各种可能组合都至少执行一次。满足了判定覆盖、条件覆盖、判定-条件覆盖准则。

请使用条件组合覆盖来为该程序设计测试用例。

为满足条件组合覆盖原则,我们可以构造以下测试用例:

输入:①x=4,y=2,z=0,覆盖路径:sacbed(条件的结果分别为:TTTT)

输入:②x=1,y=2,z=1,覆盖路径:sabed(条件的结果分别为:TFTF)

输入:③x=2,y=1,z=0,覆盖路径:sabed(条件的结果分别为:FTFT)

输入:④x=1,y=1,z=1,覆盖路径:sabd(条件的结果分别为:FFFF)

由于这4个条件每个条件都有取“真”、“假”两个值,因此所有条件结果的组合有24=16种。但是,当一个程序中判定语句较多时,其条件取值的组合数目也较多。需要设计的测试用例也会增加,这样反而会使测试效率降低。

路径覆盖指的是设计足够的测试用例,使得程序中的每一条可能组合的路径都至少执行一次。

请使用路径覆盖来为该程序设计测试用例。

为满足路径覆盖原则,我们可以构造以下测试用例:

(判定的结果分别为:TT)

输入:②x=1,y=2,z=1,覆盖路径:sabed

(判定的结果分别为:FT)

输入:③x=1,y=3,z=0,覆盖路径:sacbd

(判定的结果分别为:TF)

输入:④x=1,y=1,z=1,覆盖路径:sabd

(判定的结果分别为:FF)

独立路径是指包括一组以前没有处理的的语句或条件的一条路径。

从控制流图来看,一条独立路径是至少包含一条在其他独立路径中从未有过的边的路径。

1)程序控制流图的定义

控制流程图是描述程序控制流的一种图示方式。(有向图)

2)控制流图的两种图形符号

3)程序控制流图的5种基本结构

4)程序控制流图的描述

5)举个栗子:chestnut:

下图是典型的程序流程图转换为相对应的流图。对(a)图所示的程序流程图进行简化,得到(b)图所示的流图。

6)注意事项

在将程序流程图简化成控制流图时,应注意如下几点:

环路复杂度又称为圈复杂度,是一种为程序逻辑复杂度提供定量尺度的软件度量。它可以提供程序基本路径集的独立路径数量,这是确保所有语句至少执行一次的过程所必须的最少测试用例数。常用于基本路径测试法。

McCabe复杂性度量方式有如下三种:

V(G)={区域数边数结点数+2判定结点数+1\begin{cases}区域数\\边数-结点数+2\\判定结点数+1\\\end{cases}区域数边数结点数+2判定结点数+1:star::star::star:

1)通过控制流图的区域个数来计算

公式:V(G)=区域数

程序的环路复杂性为控制流图的区域数(即封闭的区域数+1)。

在下图中可以看到,有1和2两个封闭区域,因此,环路复杂度V(G)=2+1=3。

(2个封闭的区域+1个开放区域)

2)通过控制流图的边数和结点数来计算

公式:V(G)=e-n+2

其中,e即edge,表示图中边的数目;n即node,表示结点个数。

下图中V(G)=e-n+2=7条边6个结点+2=3。

因此,环路复杂度V(G)=3。

3)通过控制流图中的判定结点个数来计算

公式:V(G)=P+1

其中,P表示判定结点的数目。所谓判定节点数,即有多个分支的节点,比如下图中的节点2,它可以走3或者5,这个时候它就需要做判断了。所以,2是一个判定节点。同样地,下面的节点3也像节点2一样分析。

因此,图中V(G)=2个判定结点+1=3,所以环路复杂度为3。

讲到这里,我们来给环路复杂性做个小结。事实上,程序的环路复杂性给出了程序基本路径集中的独立路径条数,这是确保可执行语句至少执行一次所必需的测试用例数目的上界。

通过对以上三个例子的了解,相信大家对环路复杂度的三种求解方式有了一个新的认识。有了上面一系列内容的铺垫,我们来开始讲解基本路径测试法。

1)基本路径测试法是什么

路径测试就是从一个程序的入口开始,执行所经历的各个语句的完整过程。从广义的角度讲,任何有关路径分析的测试都可以被称为路径测试。

完成路径测试的理想情况就是做到路径覆盖,但对于复杂性较大的程序要做到所有的路径覆盖(测试所有可执行路径)是不可能的。

在不能做到所有路径覆盖的情况下,如果某一程序的每一个独立路径都被执行到,那么就可以认为程序中的每个语句都已经检验过了,即达到了语句覆盖。这种测试方法就是通常所说的基路径测试法。

基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径的集合,从而设计测试用例的方法。设计出的测试用例要保证在测试中程序的每个可执行语句至少执行一次。

2)基本路径测试法的4个步骤

基本路径测试法包括以下4个步骤:

3)例子阐述1:chestnut:

依据以下代码,用基本路径测试法,设计该程序的测试用例。

if(a>8&&b>10)//1,2

m=m+1;//3

if(a=10||c>5)//4,5

m=m+5;//6

解答:

①绘制程序控制流图,如下图所示。

②计算环路复杂度

V(G)=4(3个封闭区域+1个开放区域)

③确定线性无关路径:

路径1:1、4、6

路径2:1、4、5、6

路径3:1、2、4、5、6

路径4:1、2、3、4、5、6

④设计测试用例

4)例子阐述2:chestnut:

staticvoidpermute_args(intpanonopt_start,intpanonopt_end,intopt_eng,intncycle){

intcstart,cycle,i,j,nnonopts,nopts,pos;//1

nnonopts=panonopt_end-panonopt_start;

nopts=opt_end-panonopt_end;

cyclelen=(opt_end-panonopt_start)/ncycle;

for(i=0;i

cstart=panonopt_end+i;//3

pos=cstart;

for(j=0;j

if(pos>=panonopt_end){//5

pos-=nnonopts;//6

}else{

pos+=nopts;//7

}//8

【问题1】请针对上述C程序给出满足100%DC(判定覆盖)所需的逻辑条件。

【问题2】请画出上述程序的控制流图,并计算其控制流图的环路复杂度V(G)。

THE END
1.软件测试工程师,现在入行怎么样?而软件测试作为确保软件质量的重要环节,软件测试人员需求持续增长,尤其是那些具备扎实技能和丰富项目经验的人才。这对于那些还没有就业或者低薪想改变的年轻人来说,现在正是一个入行的绝佳机会。他们年轻、有活力、学习能力强,能够快速适应新的技术和环境。通过专业的培训,他们可以在软件测试领域崭露头角,获得高薪https://baijiahao.baidu.com/s?id=1816778427056543582&wfr=spider&for=pc
2.软件测试岗位,职业前景到底怎样?软件测试怎么样最近经常被问到软件测试这个行业的前景,网上也有大量唱衰测试这个行业的声音,很多选择职业方向的同学对是否要进入这个职业也非常迷茫。 所以开一贴来聊一聊秋草对软件测试这个岗位的要求以及对其前景的看法。 软件测试到底是个什么样的岗位? 选择一个行业,首先要了解这个行业存在的目的,到底是提供什么价值的? https://blog.csdn.net/danmyw/article/details/143270866
3.软件测试有前途吗软件测试有前途吗 不甘堕落 2024-10-29 11:49:42 推荐回答 不甘堕落 2024-10-30 10:15:02 软件测试有前途。软件测试在整个软件开发中占据了一半或一半以上的工作量。而且具有很高的组织管理和技术难度。搞好软件测试,是保证软件质量的关键步骤,是分析软件可靠性的重要依据。https://m.yyk.iask.sina.com.cn/q/OnkYQaQrrvF.html
4.软件测试工程师大学生就业前景如何?软件测试工程师的职业发展路径清晰且稳定。对于初入行业的大学生来说,可以从初级软件测试工程师做起。在这个阶段,主要工作是执行基本的测试用例,熟悉测试流程和软件功能。随着经验的积累和技能的提升,可以晋升为中级软件测试工程师,开始参与测试计划的制定、测试用例的设计,并对初级工程师进行指导。 https://www.bwie.com/jsgh/748.html
5.软件测试之困:测试工程化实践之路本书以软件测试工程化思维为基础,立足项目,采用描述、对话和独白等方式讲述测试工作中发生的故事,内容丰富、实用性强,是一本能帮助测试人员快速成长的图书。 本书首先介绍了测试工程化的认识和测试人员的商业意识;接着介绍了测试流程设计,以及如何通过流程拉齐各成员之间的目标,达到成员之间的合作有序和软件产品的质量https://labs.epubit.com/bookDetails?id=UB7da3e1c3b3dfd
6.X299主板怎么样/值得买吗?新一代酷睿i9和发烧级X299主板全面深度评测软件平台 使用的硬件都很标准了,四通道8GB内存(X299使用2666MHz、X99使用2400MHz),显卡则使用顶级的GTX1080Ti,更重要的是测试出CPU运算性能之间的区别。 基准性能测试 性能测试中,可以看到搭配i7-7820X的X299主板性能表现比上代的产品要强不少,CPU&内存综合性能提升了12%左右,但是CPU-Z的多核性能还稍有下降,但https://www.jb51.net/hardware/MotherBoard/561204_all.html
7.软件测试职业规划书(通用11篇)软件测试职业发展方向,大体上可以分为管理路线、技术路线、管理+技术路线。 测试初级阶段: 测试工程师,属于软件测试职业生涯的初级域,其适用范围是入行软件测试3年内的常规测试从业者,其主要工作内容是按照测试主管(即直接上司)分配的任务计划,编写测试用例、执行测试用例、提交软件缺陷,包括提交阶段性测试报告、参与阶https://www.gdyjs.com/jiuye/zhiyeguihua/191170.html
8.软件测试,发展前景有那么好吗?技能要求提升 随着行业发展,软件测试人员需要具备更高的技能水平,不仅要掌握基本的测试方法和工具,还需https://www.zhihu.com/question/627105539/answer/49418525987
9.101种最热门的EdTech工具Revision Buddies 为GCSE复习应用程序提供了一个现代化的学习方法,它是交互式的和引人入胜的。Revision Buddies 有成千上万的问题和详细的解释,这些问题和解释都是老师们写的,引导你找到考试需要了解的最相关的事实。 通过1000道选择题,分成相关大纲的每个主题,Revision Buddies 测试学生的知识,帮助他们找出学习中的差https://36kr.com/p/829435155242882
10.《帝国时代2》曾火遍全球却一度陷入陷入失败边缘凭借这一软件,团队能迅速浏览和分析图像数据上的内容,并为游戏生成许多自定义的数据文件。这一简单易学的GUI-based程序替代了不少早已过时的DOS指令行的功能。此外,它还能够自运行许多任务。长远来看为整个游戏开发过程省下了不少时间。 值得一提的是,Herb Marselas也付出了许多努力,编写了诸如Lint,BoundsChecker, 和https://www.gameres.com/756004.html
11.《软件测试经验与教训》.pdf文档全文免费阅读在线看《软件测试经验与教训》.pdf,软件测试 经验与教训 Lessons Learned in Software Testing Cem Kaner (美) James Bach 著 Bret Pettichord 译者序 应该承认,这是一本很吸引人的书。它的精彩之处在于它使各类软件测试人员,甚至是与测试人 员打交道的人,都能得到很好的启发https://max.book118.com/html/2015/1109/28959104.shtm
12.交流会发言稿(精选20篇)20XX年8月份我行从全辖抽调了一线业务技术骨干协助总行进行软件测试工作,参加测评人员不畏艰难,不怕辛苦,加班加点,连续奋战,经过多次反复测试,圆满完成了总行赋予的测评软件测试任务,得到了总行带队领导的好评。 (二)确立工作目标,突出训练重点 1、营造氛围,充分动员https://m.ruiwen.com/word/jiaoliuhuifayangao.html
13.软件测试年度工作总结(通用7篇)刚开始入行的时候,总是思考如何做好软件测试。认为公司的测试流程混乱总是很郁闷,认为自己学不到东西,如何才能测试好产品,常说心动不如行动,以前看到古龙小说中经常出现的场景无名小子不断挑战高手,总结积累。我总结了有些经验是实战中得到的,所以不断尝试引入新的测试流程然后评估,这个过程虽然很痛苦,但是从中积累了https://www.jy135.com/nianzhongzongjie/1471080.html
14.35岁失业,(软件测试)转行做啥:入职外包,已裸辞6.不转行,继续找软件测试—— 第一个面试 要求性能测试,10分钟挂掉; 第二个面试 瞎编自己会接口自动化,10分种挂掉; 第三个面试 要求熟练使用Linux,考了Linux命令,mysql命令,比较简单,但我回答的一塌糊涂,30分钟挂掉; 第四个面试 要求银行存款,支付经验,无此方面经验,10分钟挂掉;生活是个玄学,接到了这个offerhttps://m.douban.com/group/topic/294890027/
15.计算机职业规划范文(通用10篇)我的优势在于:较强的英语听说读写力量;丰富的需求分析和软件测试阅历;肯定的软件开发阅历;较强的学习力量;较强的沟通力量;良好的团队合作精神;综合力量比拟强(有些不虚心啊!但是实事求是!)我的劣势在于:专科毕业考的讨论生(有的企业会介意);没有足够的专项工作阅历。对于我的劣势我认为,虽然我是专科毕业考的讨论https://www.yjbys.com/jiuyezhidao/news/2009/1124/89435.html