【软件构造】——白盒测试方法

软件构造——白盒测试方法



  第一篇博客,一直在想写点什么,本来想第一篇写写自己JAVA学习,之前尝试写了个稿,奈何自己太菜,感觉很垃圾;今天上课看到大家讨论代码覆盖率的问题,自己在听的时候也很困惑,所以下课又查资料看了看,想写一篇来总结一下

  代码覆盖率:是一种通过计算测试过程中被执行的源代码占全部源代码的比例,进而间接度量软件质量的方法。它在保证测试质量的时候潜在保证实际产品的质量,可以基于此在程序中寻找没有被测试用例测试过的地方,进一步创建新的测试用例来增加覆盖率。按性质,它属于白盒测试的范畴,即主要依据源代码的内部结构来设计测试用例,通过设计不同的输入来测试软件的不同部分

  代码覆盖度越低,测试越不充分;但要做到很高的代码覆盖度,需要更多的测试用例,测试代价高

一、黑盒测试与白盒测试

  首先介绍一下黑盒测试与白盒测试

1.黑盒测试

   也称功能测试、数据驱动测试,它将被测软件看作一个打不开的黑盒,主要根据功能需求设计测试用例,进行测试。
  概念:黑盒测试是从一种从软件外部对软件实施的测试,也称功能测试或基于规格说明的测试。其基本观点是:任何程序都可以看作是从输入定义域到输出值域的映射,这种观点将被测程序看作一个打不开的黑盒,黑盒里面的内容(实现)是完全不知道的,只知道软件要做什么。因无法看到盒子中的内容,所以不知道软件是如何实现的,也不关心黑盒里面的结构,只关心软件的输入数据和输出结果。

2.白盒测试

  也称结构测试或逻辑驱动测试,它是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能。

二、白盒测试的测试对象

  白盒测试的测试对象是基于被测试程序的源代码,而不是软件的需求规格说明书。
  使用白盒测试方法时,测试人员(基本就是程序猿)必须全面了解程序内部逻辑结构,检查程序的内部结构,从检查程序的逻辑着手,对相关的逻辑路径进行测试,最后得出测试结果。

三、白盒测试方法

  白盒测试方法从是否执行代码看有两大类:静态测试方法和动态测试方法。

1.静态测试:

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

2.动态测试:

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

在这里插入图片描述
这里着重说动态测试中逻辑覆盖法里的六种覆盖

四、代码覆盖率

在这里插入图片描述

以下是使用代码覆盖率的一些主要原因:

它可以帮助你评估测试的效率
它提供了定量测量手段
它帮助你了解对源代码测试程度。

五、6种逻辑覆盖方法

1.语句覆盖(SC)

  • 语句覆盖(Statement Coverage)的含义就是设计足够的测试用例,使得被测程序中每条语句至少执行一次。又称行覆盖、段覆盖、基本块覆盖,它是最常见的覆盖方式。
  • 举个🌰
public class Test{
    public void Test1(int x,int y,int z){
        if(y>1 && z==0){
            x = (int)(x/y)
        }
        if(y==2 || x>1){
           x = x + 1
        }
    }
}

在这里插入图片描述

  为了使每条语句都能够至少执行一次,我们可以构造以下测试用例:
输入: x=5 , y=2 , z=0
执行路径为:sacbed

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

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

2.判定覆盖Or分支覆盖

  • 判定覆盖(Decision Coverage)又称为分支覆盖,其原则是设计足够的测试用例,使得程序中的每个判的“真”和“假”都至少被执行一次。例如 if or while or switch-case or for
  • 举个🌰
public class Test{
   public void Test2(int x,int y,int z){
       if(y>1 && z==0){
           x=(int)(x/y)
       }
       if(y==2 || x>1){
           x=x+1
       }
   }
}

在这里插入图片描述
以上述代码为例,构造以下测试用例即可实现判定覆盖标准:
输入:① x=1,y=3,z=0 ,执行路径为 sacbd
(判断的结果分别为T,F)
输入:② x=3,y=1,z=1 ,执行路径为 sabed
(判断的结果分别为F,T)

测试数据P1P2
x=1,y=3,z=0TF
x=3,y=1,z=1FT

if(y>1 && z0)记为P1   if(y2 || x>1)记为P2

  判定覆盖仍然具有和语句覆盖一样无法发现逻辑判断符号 “&&” 误写了 “||” 的逻辑错误。判定覆盖仅仅判断判定语句执行的最终结果而忽略每个条件的取值,所以也属于弱覆盖。

3.条件覆盖

  • 条件覆盖:条件覆盖是指选择足够的测试用例,使得运行这些测试用例时,判定中每个条件的所有可能结果至少出现一次,但未必能覆盖全部分支

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

  • 举个🌰
public class Test{
   public void Test2(int x,int y,int z){
       if(y>1 && z==0){
           x=(int)(x/y)
       }
       if(y==2 || x>1){
           x=x+1
       }
   }
}

在这里插入图片描述

要使程序中每个判断的每个条件都至少取真值、假值一次,我们可以构造以下测试用例:
输入:① x=1,y=2,z=0 ,执行路径为 sacbed
(条件的结果分别为TTTF)
输入:② x=2,y=1,z=1 ,执行路径为 sabed
(条件的结果分别为FFFT)

测试数据C1C2C3C4P1P2
x=1,y=2,z=0TTTFTF
x=2,y=1,z=1FFTTFT

y > 1:记为C1  z == 0:记为C2  Y 2:记为C3   x > 1:记为C4
if(y>1 && z
0)记为P1   if(y==2 || x>1)记为P2

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

** ----- 这里就要总结一下条件覆盖和分支覆盖的区别 ----- **
  这也是我写这篇博客最开始的想阐述的东西
  可能大家也注意到在两个测试用例中使用了不同的例子,并且条件的结果是不同的;没错!条件覆盖比分支(判定)覆盖;增加了对判定中所有条件的测试

4.判定-条件覆盖(CDC)

  • 要求设计足够的测试用例,:使得判断中每个条件的所有可能取值至少执行一次,同时每个判断的所有可能判断结果至少执行,即要求各个判断的所有可能的条件取值组合至少执行一次。

      例如,对于判定语句 if(a>1 AND c<1) ,该判定语句有 a>1、c<1 两个条件,则在设计测试用例时,要保证 a>1、c<1 两个条件取“真”、“假”值至少一次,同时,判定语句 if(a>1 AND c<1) 取“真”、“假”也至少出现一次。
  • 举个🌰
public class Test{
   public void Test4(int x,int y,int z){
       if(y>1 && z==0){
           x=(int)(x/y)
       }
       if(y==2 || x>1){
           x=x+1
       }
   }
}

在这里插入图片描述

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

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

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

判定-条件覆盖满足了判定覆盖准则和条件覆盖准则,弥补了二者的不足。但是判定-条件覆盖不一定比条件覆盖的逻辑更强。判定-条件覆盖的缺点: 没有考虑条件的组合情况。

5.条件组合覆盖(MCC)

  • 在白盒测试法中,选择足够的测试用例,使所有判定中各条件判断结果的所有组合至少出现一次,满足这种覆盖标准成为条件组合覆盖。满足了判定覆盖、条件覆盖、判定-条件覆盖准则
  • 举个🌰
public class Test{
   public void Test5(int x,int y,int z){
       if(y>1 && z==0){
           x=(int)(x/y)
       }
       if(y==2 || x>1){
           x=x+1
       }
   }
}

在这里插入图片描述
为满足条件组合覆盖原则,我们可以构造以下测试用例:

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

6.路径覆盖

  • 路径覆盖指的是设计足够的测试用例,使得程序中的每一条可能组合的路径都至少执行一次
  • 举个🌰
public class Test{
   public void Test6(int x,int y,int z){
       if(y>1 && z==0){
           x=(int)(x/y)
       }
       if(y==2 || x>1){
           x=x+1
       }
   }
}

在这里插入图片描述
为满足路径覆盖原则,我们可以构造以下测试用例:

输入:① x=4,y=2,z=0 ,覆盖路径:sacbed
(判定的结果分别为: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 )

六.总结🍔🍔🍔

终于!终于写完了!!!!

🍿🍿

🍿*★°*☆( ̄▽ ̄)☆*°★* 🍿

🍿拜拜喽!🍿

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值