白盒测试理解与示例 与Jacoco

白盒测试理解与示例(写的挺好的)

常用的软件测试方法有两大类:静态测试方法和动态测试方法。其中软件的静态测试不要求在计算机上实际执行所测程序,主要以一些人工的模拟技术对软件进行分析和测试;而软件的动态测试是通过输入一组预先按照一定的测试准则构造的实例数据来动态运行程序,而达到发现程序错误的过程。在动态分析技术中,最主要的测试有白盒和黑盒。 
其中,白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的。白盒要考虑测试用例对程序内部的覆盖程度,最好的白盒测试是能覆盖到每一条路径,但是由于路径数目极大,要执行每一条路径是不可能。但我们能做到就是让覆盖率变高一点,下面要介绍的六种覆盖测试方法,看看他们的覆盖程度。

六种白盒测试:(从低到高)

语句覆盖。

判定覆盖。

条件覆盖。

判定/条件覆盖。

条件组合覆盖。

一、语句覆盖(Statement coverage)

(1)定义:

  • “语句覆盖”是一个比较弱的测试标准,它的含义是:在测试时,首先设计若干个测试用例,然后运行被测程序, 使程序中的每个可执行语句至少执行一次。这时所谓“若干个”,自然是越少越好。

(2)用例设计:

图1是一个被测试的程序,它的源程序是: 
PROCEDURE M(VAR A,B,X:REAL); 
BEGIN 
IF(A>1) AND (B=0) THENX:=X/A; 
IF(A=2)OR (X>1) THENX:=X+1; 
END.

为使程序中每个语句至少执行一次,只需设计一个能通过路径ace的例子就可以了,例如选择输入数据为: 
A=2,B=0,X=3 
这样该程序段的4个语句均得到执行,从而作到了语句覆 盖。

但如果选用的测试用例是: 
A=2 B=0 X=-3 程序按路径abe执行,便未能达到语句覆盖。

从本例可看出,语句覆盖实际上是很弱的,程序中每个语句都得到执行这一点来看,语句覆盖的方法似乎能够比较全面地 检验每一个语句。但它也绝不是完美无缺的。假如这一程序段中两个判断的逻辑运算 有问题,如果第一个条件语句中的AND错误地编写成OR,上面的测试用例是不能发现这个错误的;又如第三个条件语句中X>1误写成X>0,这个测试用例也不能暴露它,此外,沿着路径abd执行时,X的值应该保持不变,以为每个语句都经历过,似乎可以放心了。其实这种测试不十分可靠。语句覆盖在测试被测程序中,除去对检查不可执行语句有一定作用外,并没有排除被测程序包含错误的风险。

  • 总之,一般认为“语句覆盖”是很不充分的一种标准。
  • 可以很直观地从源代码得到测试用例,无须细分每条判定表达式。
  • 由于这种测试方法仅仅针对程序逻辑中显式存在的语句(即可执行语句),但对于隐藏的条件和可能到达的隐式逻辑分支,是无法测试的。
  • 比“语句覆盖”稍强的覆盖标准是“判定覆盖”(或称branch coverage分支覆盖)标准。判定覆盖准则进行测试是指,设计若干测试用例,运行被侧程序,使得程序中每个判断的取真分支和取假分支至少经历一次,即判断的真假值均曾被满足。判定覆 盖又称为分支覆盖。
  • 对图1的程序,如果设计两个例子,使它们能通过路径ace和abd,或者通过路径acd和abe,就可达到“判定覆盖”标准,为此,可以选择输入数据为: 
    ①A=3,B=0,X=1(沿路径acd执行); ②A=2,B=1,X=3(沿路径abe执行)
  • 程序中含有判定的语句包括IF-THEN-ELSE、DO-WHILE、REPEAT-UNTIL等,除了双值的判定语句外,还有多值的判定语句,如PASCAL中的CASE语句、FORTRAN中带有三个分支的IF语句等。所以“判定覆盖”更一般的含义是:使得每一个判定获得每一种可能的结果。
  • “判定覆盖”比“语句覆盖”严格,因为如果每个分支都执行过了,则每个语句也就执行过了。
  • 但是,“判定覆盖”还是很不够的,例如上面两个测试用例未能检查沿着路径abd执行时,X的值是否保持不变。所以它只能满足条件覆盖的要求,但是不能对判断的条件进行检查。
  • 判定覆盖比语句覆盖要多几乎一倍的测试路径,当然也就具有比语句覆盖更强的测试能力。同样判定覆盖也具有和语句覆盖一样的简单性,无须细分每个判定就可以得到测试用例。
  • 往往大部分的判定语句是由多个逻辑条件组合而成(如,判定语句中包含AND、OR、CASE),若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。

(3)优点:

(4)缺点:

二、判定覆盖(Decision coverage)

(1)定义:

(2)用例设计:

(3)优点:

(4)缺点:

白盒测试:语句覆盖、条件覆盖、判定覆盖、条件-判定覆盖、组合覆盖、路径覆盖

6

1语句覆盖

使所有的判断语句都能执行一次的条件案例,例如当判断语句事组合语句的时候,并且用or连接,只满足一个案例即可

2判定覆盖(分支覆盖)

针对判断语句,在设定案例的时候,要设定True和False的两种案例;与语句覆盖不同的是增加了False的情况

3条件覆盖

针对判断语句里面案例的取值都要去一次,不考虑条件的取值

4判定/条件覆盖

判定覆盖各条件覆盖交叉,针对于判定中的条件取值

5组合覆盖

判定-条件覆盖的加强版

6路径覆盖

参考:

https://www.baidu.com/link?url=EQQ6Qc-zy1Xup2cLtHvs_3z1df9eirKEI6gmSqYaIEUGMgFus_mdGWspGYRUWncYTlUI4Q5vdJ7lMrCqBTvwxvjnrzd1MyRdPFr29yeWjQ_&wd=&eqid=dea7fa6600000e5a0000000456418b0c

http://www.cnblogs.com/jerry19880126/articles/2623433.html

http://blog.sina.com.cn/s/blog_69fe22cb0100nag2.html

原文地址:https://www.cnblogs.com/ITniu/p/11111729.html

时间: 2024-10-12 20:54:11

白盒测试理解与示例 与Jacoco的相关文章

jquery的ajax同步和异步的理解及示例

之前一直在写JQUERY代码的时候遇到AJAX加载数据都需要考虑代码运行顺序问题.最近的项目用了到AJAX同步.这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出去假死状态,当这个AJAX执行完毕后才会继续运行其他代码页面假死状态解除. 而异步则这个AJAX代码运行中的时候其他代码一样可以运行. jquery的async:false,这个属性 默认是true:异步,false:同步. 复制代码代码如下: $.ajax({ type: "post", 

Golang的反射reflect深入理解和示例

编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 每种语言的反射模型都不同,并且有些语言根本不支持反射.Golang语言实现了反射,反射机制就是在运行时动态的调用对象的方法和属性,官方自带的reflect包就是反射相关的,只要包含这个包就可以使用. 多插一句,

迭代器模式的理解和示例

一.是什么 1. 定义: 在对象集合之间游走,而不暴露集合的实现 二.示例 代理背景: 1. 有汉堡包店和晚餐店的菜单, 假设汉堡包店的菜单是用List存放, 晚餐店是用数组存放的(用不同的存放方式,为了体现迭代器统一的处理方式) 2. 服务生要将两家店的菜单都打印出来 3. 这里先自己重写Iterator, 为了体现迭代器的设计模式,在实际使用中,可以直接循环Iterator 2.1 菜单项 Menu, 菜单有名称和价格 /** * 菜单 */ public class Menu { priv

命令模式的理解和示例

一.是什么?作用 1. 命令模式 将“请求”封装成对象,以使用不同的请求队列或者日志来参数话其他对象,命令模式亦可以来支持撤销的操作 2. 将请求封装成命令对象,请求的具体执行由命令接收者执行: 作用: 命令发送者与命令执行者解耦: 每一个命令都是一个操作 3. 类图 Invoke(调用者): 调用者负责执行命令 Command(命令接口): 负责将操作封装成统一的方法 Concreatecommand(命令实现类): 负责将命令真正执行者的操作封装起来 Receiver(接受者): 命令的真正

理解Java中字符流与字节流的区别

1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序列的对象被称为输入流:能够向其写入一个字节序列的对象被称为输出流. 2. 字节流 Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据.Java中最基本的两个字节流类是InputStream和OutputStream,它们分别代表了组基本的输入字节流和输出字节流.InputStre

C# 多线程经典示例 吃苹果

本文主要讲述了多线程开发中经典示例,通过本示例,可以加深对多线程的理解. 示例概述: 下面用一个模拟吃苹果的实例,说明C#中多线程的实现方法.要求开发一个程序实现如下情况:一个家庭有三个孩子,爸爸妈妈不断削苹果往盘子里面放,老大.老二.老三不断从盘子里面取苹果吃.盘子的大小有限,最多只能放5个苹果,并且爸妈不能同时往盘子里面放苹果,妈妈具有优先权.三个孩子取苹果时,盘子不能为空,三人不能同时取,老三优先权最高,老大最低.老大吃的最快,取的频率最高,老二次之. 涉及到知识点: 线程Thread 创

Java 反射机制(包括组成、结构、示例说明等内容)

http://www.cnblogs.com/skywang12345/p/3345205.html 第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据"类的部分已经的信息"来还原"类的全部的信息".这里"类的部分已经的信息",可以是"类名"或"类的对象"等信息."类的全部信息"就是指"类的属性,方法,继承关系和Annotation

Arduino 入门程序示例之步进流电机(2015-06-28)

概述 演示单极步进电机的控制.没有现成的 H 桥模块,双极步进电机就不做实验啦. 这里没有使用 stepper 库,用 IO 粗糙地原始地驱动,更增进对步进电机驱动的理解. 示例程序 整步驱动 // ---------------------------------------------------------------------------- // unipolarStepperTest_fullStep.ino // // Created 2015-06-27 // By seesea

理解网络编程和套接字

编写“Hello world!”服务器端 服务器端(server)是能够受理连接请求的程序.下面构建服务器端以验证之前提到的函数调用过程,该服务器端收到连接请求后向请求者返回“Hello world!”答复.除各种函数的调用顺序外,我们还未涉及任何实际编程.因此,阅读代码时请重点关注套接字相关函数的调用过程,不必理解全部示例. hello_server.c 1.  #include <stdio.h> 2.  #include <stdlib.h> 3.  #include <