黑盒测试:已知产品应具有功能前提下,来检验每个功能是否符合规格说明书,都能正常使用;

白盒测试:已知产品源代码前提下,来检验程序是否按照预定要求运行;又称结构测试。

白盒测试的用例:1、保证模块中所有独立路径至少被执行一次;2、对所有逻辑值都会测试T / F;3、在上下边界及可操作范围内运行所有循环情况;4、检查内部数据结构以确保其有效性。

在软件测试过程中单元测试大都采用白盒测试。

测试方法

常见的白盒测试方法有代码检查、逻辑覆盖、基本路径测试

代码检查(静态的白盒测试)

静态测试:不运行被测程序,互查、走查形式来进行审查,可以发现65%的缺陷。动态测试:运行、使用被测程序,发现问题。

代码规范性进行审查,格式、注释,提高代码可靠性、可移植性、易读性。

数据引用错误,是否引用了未初始化的变量;数组和字符串的下标是否为整数值且下标是否越界,变量是否被赋予了不同类型的值,是否为引用指针分配内存,一个数据结构是否在多个函数或子过程中引用,在每一个引用中是否明确定义了结构。

数据类型错误。变量数据类型是否定义错误,变量精度是否够,是否对不同数据类型进行比较或赋值。

数据声明错误。变量是否在声明的同时进行了初始化,是否正确初始化并与其类型一致,变量是否都赋予正确的长度、类型和存储类;变量名是否相似等。

计算错误。包括计算时是否了解和考虑到编译器对类型或长度不一致的变量的转换规则;计算中是否使用了不同数据类型的变量;除数或模是否可能为0,变量的值是否超过意义的范围,赋值的目的变量是否小于赋值表达式的值等。

逻辑运算错误。表达式是否存在优先级错误:每一个逻辑表达式是否都正确地表达,逻辑计算是否如期进行,求值次序是否有疑问,逻辑表达式的操作数是否为逻辑值等。

控制流程错误。程序中的语句组是否对应,程序、模块、子程序、循环能否终止,是否存在死循环,多分支语句,索引变量是否超过可能的分支数目,是否存在遗落的错误,导入意外进入循环。

子程序参数错误。子程序接收的参数类型和大小调用代码发送的是否匹配;子程序有多个入口点,引用的参数是否与当前入口点是否符合;常量是否当作形参传递,意外在子程序中改动;子程序是否更改了仅作为输入值的参数;每个参数的单位是否与相应的形参匹配;如果存在全局变量,在所有引用子程序中是否有相似的定义和属性等。

输入和输出错误。

其他错误。提示语、编码。

覆盖测试

以程序内部的逻辑结构为基础设计用例,要求对被测程序的逻辑结构了解,分为语句覆盖、判定覆盖、条件覆盖、判定、条件覆盖、组合覆盖、路径覆盖

image

语句覆盖:使程序中每个可执行语句至少被执行一次。即为ace x=4,y=-3,z=2。当程序段4个部分都可以被执行,从而实现语句覆盖。如果执行abe,则没有执行z=z(x+y)。事实上,语句覆盖是一种不充分的检验方法,比较弱的逻辑覆盖原则。当程序中两个判定的逻辑运算存在问题时,如两个判断的运算符写反了,使用同一测试数据仍可以按照ace路径执行,却发现不了两个判断中的逻辑错误。如程序段中x>=0写为x>0,使用原测试数据仍会执行ace路径,发现不了此错误。检查不可执行语句,但被测语句间的内部联系不能排除没有错误。

判定覆盖(分支覆盖):程序中的每个判定至少得到一次真值和假值,即判断中的真假分支至少均执行一次。

test1:x=4,y=-3,z=2

test3:x=-1,y=1,z=-1

test1执行了路径ace,test3执行了路径abd,所以两个判断中的4个分支都得到了检测,满足判定覆盖的条件。

另外test4执行了abe,test5执行了acd。

test4:x=3,y=2,z=1

test5:x=1,y=-3,z=-5

两组测试用例,不仅满足了判定覆盖,也满足了语句覆盖。判定覆盖比语句覆盖更强。但大部分的判定语句是有多个逻辑条件组合而成(and or case)若仅仅判断最终结果而忽略每个条件取值情况,如第二个判断中z>0误写为z<0,test3仍可执行路径abe。满足判定覆盖却仍无法确定判断内部条件的错误。

条件覆盖:程序中每个判断中每个条件的可能值至少得到一次。

第一个判断条件(x>0)&&(y<0) 第二个判断条件(x>2)||(z>0)

x>0为真,记作T1

x>0为假,记作-T1

y<0为真,记作T2

y<0为假,记作-T2

x>2为真,记作T3

x>2为假,记作-T3

z>0为真,记作T4

z>0为假,记作-T4

条件覆盖并不能保证判定覆盖,条件覆盖只能保证每个条件至少有一次为真,而不是考虑所有判定的结果。

如test1 执行路径ace,覆盖条件T1 T2 T3 T4;test3执行路径abd,覆盖条件-T1 –T2 –T3 -T4.

较判定覆盖缺少了test4、test6,并没有覆盖abe abd两个分支.(test4 执行路径abe,覆盖条件T1 –T2 T3 T4;test6 执行路径abd,覆盖条件-T1 T2 –T3 -T4)

判定/条件覆盖:判断中每个条件的所有(真、假)取值至少出现一次,并且每个判断的所有(真、假)判断结果也至少出现一次。

test1、test3可以满足判定/条件覆盖,此方法并未考虑条件的组合情况,因此判定/条件覆盖并不比条件覆盖更强。

组合覆盖:每个判定条件的各种情况至少出现一次。

4个条件可能出现的组合为:

  1. x>0,y<0,记作 T1,  T2
  2. x>0,y>0,记作 T1,-T2
  3. x<0,y<0,记作-T1,  T2
  4. x<0,y>0,记作-T1,-T2
  5. x>2,z>0,记作 T3,  T4
  6. x>2,z<0,记作 T3,-T4
  7. x<2,z>0,记作-T3,  T4
  8. x<2,z<0,记作-T3,-T4

 

test1 x=4,y=-3,z=2,执行路径ace,覆盖组合1 5,覆盖条件T1 T2 T3 T4

test3 x=-1,y=1,z=-1,执行路径abd,覆盖组合4 8,覆盖条件-T1 –T2 –T3 –T4

test7 x=-1,y=-2,z=1,执行路径abe,覆盖组合3 7,覆盖条件-T1 T2 –T3 T4

test8 x=3,y=1,z=-1,执行路径abe,覆盖组合2 6,覆盖条件 T1 –T2 T3 –T4

一般来说满足条件组合覆盖的测试用例一定满足判定覆盖、条件覆盖、判断/条件覆盖。组合覆盖遗漏了acd路径。

路径覆盖:覆盖程序中所有路径。abd abe acd ace,选择test3 test7 test5 test1四个用例即可满足路径覆盖。

路径测试

从一个的程序的入口开始,执行所经历的每个语句的完整过程。

路径测试法,在程序控制流程图的基础上,通过分析控制构造的环路复杂性,导出基本可以执行的路径集合,来设计用例。

步骤:

  1. 画出程序控制流程图
  2. 程序环形复杂度。可导出程序基本路径集合中独立的路径条数,从程序入口到出口的多次执行中,至少有一个语句未被重复。
  3. 导出基本路径集,确定程序的独立路径。
  4. 根据上一步的独立路径,设计测试用例的输入数据和预期输出,确保基本路径集中每一个路径的执行。

弧a和弧b或的关系,并行的路径,a+b(相加);弧a和弧b是先后想接的关系,ab(相乘)

image abdf acef abef acdf,路径表达式为a(b+c)(d+e)f,带入1,计算出路径数为4

image abd+abcbd+abcdcbd….,路径表达式为ab(1+cb+(cb)2+….)d,带入1,计算出循环2次路径数为1*(1+1+1*2)*1=4

image

image image

Z路径覆盖

去除次要因素,限制循环次数,从而减少路径数量。简化循环下的路径覆盖称为Z路径覆盖。

image

用例 路径 输入数据 预期输出
用例1 路径1:3–>13 x=0,y=0 a=1,b=2
用例2 路径2:3–>5–>6–>12–>3–>13 x=1,y=0 a=b-3=-1,b=2
用例3 路径3:3–>5–>8–>9–>12–>3–>13 x=1,y=1 a=b+5=7,b=2
用例4 路径4:3–>5–>8–>11–>12–>3–>13 x=1,y=2 a=b*2=4,b=2

版权声明:本文为stay-sober原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/stay-sober/p/4366517.html