6种白盒测试

  

实例比较6种白盒测试

语句覆盖

判定覆盖或分支覆盖

条件覆盖

判定/条件覆盖

多重条件覆盖

路径覆盖

MK2方法:

强烈推荐:多重条件覆盖

如果程序模块中没有循环,可以考虑路径覆盖

例子: public void foo(int a, int b, int x) {
  if (a > 1 &&
b == 0) {
   x = x / a;
  }
  if (a == 2 || x >
1) {
   x = x + 1;
  }
  }

1.句覆盖


语句覆盖:语句覆盖是最起码的结构覆盖要求,语句覆盖要求设计足够多的测试用例,使得程序中每条语句至少被执行一次。

测试用例

测试对应:a=2,b=0,x=3,每条语句被执行一次

不足

遗憾的是,这个准备相当不足。举例来说,也许第一个判断a > 1 && b == 0
应是“或”,而不是“与”。如果是这样,错误就会发现不到。另外可能第二个判断应该写成x >
0,这个错误也不会被发现。还有,程序中存在一条x未发生改变的路径(路径ABD),如果这是个错误,它也不会被发现。

结论

语句覆盖这个准则有很大的不足,以至于它通常没有什么用处。由于这种测试方法仅仅针对程序逻辑中显式存在的语句,但对于隐藏的条件和可能到达的隐式逻辑分支,是无法测试的。

2.判定覆盖或分支覆盖


判定覆盖又称为分支覆盖,它要求设计足够多的测试用例,使得程序中每个判定的每个可能结果(true、false)都至少执行一次,以及将程序或者子程序的每个入口点都至少执行一次。

测试用例

两个覆盖路径:路径ACE,路径ABD,或者覆盖了ACD和ABE的测试用例就满足了判定覆盖的要求

不足

仍然相当的不足。举例来说,我们仅有50%的可能性遍历到那条x未发生变化的路径(也即,我们选择前一种情况)。如果第二个判断存在错误(如把x> 1
写成了x < 1),那么前面两个例子中的两个测试用例都无法找出这个错误。

结论

往往大部分的判定语句是由多个逻辑条件组合而成,若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。

3.条件覆盖


条件覆盖要求设计足够多的测试用例,使得判定中的每个条件获得各种可能的结果,即每个条件至少有一次为真值,有一次为假值。

测试用例

例子中4个条件:a > 1 , b == 0,a == 2, x > 1。因此需要足够的测试用例,使得在A处出现a > 1、a
< = 1、b == 0、b != 0,在点B处出现a == 2、a != 2、x > 1、x< = 1的情况。选择用例1.a=2, b=0,
x=4  路径ACE;2.a=1, b=1, x=1  路径ABD

不足

条件覆盖并不能保证判定覆盖。举例来说:1.a=1, b=0, x=3  ABE   2.a=2, b=1,
x=1  ABE,满足条件覆盖,却不满足判定覆盖

结论

有的分支只执行true和false中的一个,条件覆盖并不能保证判定覆盖

4.判定/条件覆盖


设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身所有可能结果也至少出现一次。

测试用例

判定  if (a > 1 && b == 0) 和  if (a == 2 || x > 1)
都至少取一次true和false,使条件a > 1 、b == 0、a == 2、 x > 1都至少取一次true和false

不足

判定/条件覆盖准则的缺点是未考虑条件的组合情况;并且,不一定会发现逻辑表达式中的错误

结论

判定/条件覆盖满足判定覆盖准则和条件覆盖准则,弥补了二者的不足。

5.多重条件覆盖


又名组合覆盖,要求设计足够多的测试用例,使得每个判定中所有可能的条件结果组合,以及所有的入口点都至少执行一次

测试用例

对于判定  if (a > 1 && b == 0) 和  if (a == 2 || x > 1)
,需要使条件a> 1 、 b == 0都至少取一次true和false,然后进行组合;a == 2、 x >
1都至少取一次true和false,再组合

不足

线性地增加了测试用例的数量

结论

多重条件覆盖准则满足判定覆盖、条件覆盖和判定/条件覆盖准则。强烈推荐




































 

设计

步骤1

列出判定清单

 

1. if (a > 1 && b == 0)
2. if (a == 2 || x
> 1)

步骤2

列出判定中的条件清单

 

判定1:   1.a > 1     
2. b == 0     
判定2:   3.a ==
2    4.  x > 1

步骤3

列出每个条件的可能结果清单

 

1.a > 1  ,  a <= 1
2.b == 0 , 
b != 0
3.a == 2 , a != 2
4.x > 1  , x <= 1

步骤4

每个判定中所有可能的条件结果组合至少出现一次

 

判定1的可能结果组合
1.a > 1 , b == 0 
2.a > 1 ,
b != 0     
3.a <= 1, b ==
0     
4.a <= 1, b !=
0
判定2的可能结果组合
5.a == 2, x > 1 
6.a == 2, x <=

7.a != 2, x > 1 
8.a != 2, x <= 1

步骤5

设计足够测试用例,覆盖所有可能的条件结果组合至少一次

 

a=2, b=0, x=4  覆盖组合1,5
a=2, b=1, x=1 
覆盖组合2,6
a=1, b=0, x=2  覆盖组合3,7
a=1, b=1, x=1 
覆盖组合4,8

6.路径覆盖


设计足够的测试用例,覆盖程序中所有可能的路径。

不足

时间成本,如果遇到循环,测试时间和测试成本……消耗太多

结论

时间成本太高;不推荐。如果程序分支比较少,循环没有或者很简单,才使用

7.异常系的测试









源代码

 

try {

InsSecurity.getNavigwareUserInstance(userId);

} catch (CnCAccountLockOutException e)
{

context.put("popup", Boolean.TRUE);

throw new
InsCommandException(                                
       
InsPortalWebUIErrors.ERROR_USER_LOCKEDOUT);

} catch (Exception e) {

}

异常

已知getNavigwareUserInstance要抛出3个异常,所以请测试这3个异常

public static InsUser
getNavigwareUserInstance(String userId)

throws CnCUnknownEntityException,
CnCAccountLockOutException, DataBackendException {

 

测试方法:在代码中加入异常语句,测试异常;每条catch路径必须测到

 

例如:测试CnCAccountLockOutException

try {

InsSecurity.getNavigwareUserInstance(userId);

if(true){

throw new
CnCAccountLockOutException();

}

} catch (CnCAccountLockOutException e)
{

context.put("popup", Boolean.TRUE);

throw new
InsCommandException(                                           
InsPortalWebUIErrors.ERROR_USER_LOCKEDOUT);

} catch (Exception e) {

}

时间: 2024-12-06 10:53:46

6种白盒测试的相关文章

软件测试基本方法(二)之白盒测试

白盒测试 概念:按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作. 分类:白盒测试是基于覆盖的测试,尽可能覆盖程序的结构特性和逻辑路径,所以其具体方法有逻辑覆盖.循环覆盖.基本路径覆盖.逻辑覆盖又可进一步分为语句覆盖.判定(分支)覆盖.条件覆盖.判定-条件覆盖.条件组合覆盖等.白盒测试主要用于单元测试(我们需要了解程序源码和结构,而且基于输入输出,适合单元模块).下面重点介绍常用的几种白盒测试方法. 语句覆

白盒测试:理论基础

白盒测试:理论基础 2016-08-23 目录 1 白盒测试的概念2 白盒测试的主要目的3 测试覆盖标准4 白盒测试的主要方法  4.1 逻辑驱动测试    4.1.1 语句覆盖    4.1.2 判定覆盖(分支覆盖)    4.1.3 条件覆盖    4.1.4 判定/条件覆盖    4.1.5 条件组合覆盖    4.1.6 黑盒法补充测试用例  4.2 路径测试    4.2.1 基本路径测试      1) 控制流图      2) 独立路径      3) 基本路径测试       4

杂【第一天】包括eclipse常见操作,程序调试模式

观看传智播客视频笔记,感谢 eclipse的常见操作: 1.当即热版本低于编译器版本是,会出现bad Vresion number in class file的错误: 2.快捷键: alt+/:模板键 ctrl+1:快速修复 ctrl+shift+o:导包 设置代码阿保存的时候自动格式化:windows->首选项->Java->Editor->save Actions 代码移动:alt+上下键 重置视图:window->reset perspective... 3.典型的字节

java攻城狮之路--复习xml&amp;dom_pull编程

xml&dom_pull编程: 1.去掉欢迎弹窗界面:在window项的preferences选项中输入“configuration center” 找到这一项然后     把复选框勾去即可. 2.去掉打开Myeclipse时弹出的:Please allow Subclipse team to receive......办法: Windows-->Preferences-->General-->Startup and Shutdown-->取消Subclipse Usage

Flask 测试

测试是每个应用系统发布前必须经历的步骤,自动化测试对测试效率的提高也是毋庸置疑的.对于Flask应用来说,当然可以使用Web自动化测试工具,比如Selenium等来测.Flask官方推荐的自动化测试方法是一种白盒测试,它依赖于Werkzeug的Client对象来模拟客户端.使用这个方法的好处是你不需要真的运行一个应用实例,也不依赖于任何浏览器.而测试框架就使用Python中的unittest包,对于大家上手也方便. Set Up和Tear Down方法 Set Up方法会在每个测试用例执行前被调

单元测试之NSNull 检测

Unit Testing: 单元测试 测试这个词很容易理解,那么什么是单元(Unit)呢?一个单元指的就是应用程序中可以测试的最小单元.一组源代码可以测试,一般要求有明确的输入与输出.因此一般来说源代码中明确的包含输入输出的每一个方法被认为一个测试的单元(一个case).注意,这里的输出并不局限于方法的返回值对输入参数的改变,也包括方法在执行过程中改变的任何数据. 单元测试在程序里面可以理解一个模块一个方法,在每个可能存在的模块都进行测试,确保每个模块都没有问题,从而提高整体程序的质量. 单元测

JavaEE实战——XML语法和约束技术

MyEclipse8.5 1.配置workspace ----- 建议不要采用含有空格和中文目录,所有代码保存workspace空间中 2.新建工程时,设置工程需要jre环境 MyEclipse提供多种内置layout --- 每种布局 界面不同,菜单不同 工程的属性 编码集 --- 导入其它工程时,注意编码类型一致 java build path 设置 classpath位置 ,指定当前工程引入类库 source中指定.java 文件 和.class文件 存放位置 librialies 指定当

[转] 单元测试详解

1.什么是单元测试(Unit Testing)? 测试(Testing)这个词很容易理解,那么什么是单元(Unit)呢? 一个单元指的是应用程序中可测试的最小的一组源代码.一组源代码可测试,一般要求其有明确的输入和输出.因此,一般来讲,源代码中包含明确的输入和输出的 每一个方法被认为是一个可测试的单元.注意,这里指的输出,并不局限于方法的返回值或对输入参数的改变,而包括了方法的执行过程中,改变的任何数据. 单元在程序里可以简单的理解为一个模块,一个方法.单元测试也就是在完成每个模块后都进行的测试

单元测试之Mock

为什么需要Mock. 真实对象具有不确定的行为.所以会产生不可预测的结果. 真实对象很难被创建. 真实对象的某些行为很难被触发(如网络错误). 真实对象令程序的运行速度很慢. 真实对象有(或者是)用户界面. 测试需要询问真实对象它是如何被调用的. 真实对象实际上并不存在.例如其它小组开发的模块. 使用Mock的3个步骤 使用一个接口来描述该对象. 为产品代码实现该接口. 以测试为目的,在Mock对象中实现该接口. Test Double Dummy.被传递但是从不被实际使用的对象.通常用于填充参