白盒测试用例设计方法

一、白盒测试

  根据软件产品的内部工作过程,在计算机上进行测试,以证实每种内部操作是否符合设计规格要求,所有内部成分是否已经过检查。这种测试方法就是白盒测试。白盒测试把测试对象看做一个打开的盒子,允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。

  不论是黑盒测试,还是白盒测试,都不可能把所有可能的输入数据都拿来进行所谓的穷举测试。因为可能的测试输入数据数目往往达到天文数字。下面让我们看两个例子。

  假设一个程序P有输入X和Y及输出Z,参看图10-4-1。在字长为32位的计算机上运行。如果X 、Y只取整数,考虑把所有的X 、Y值都做为测试数据,按黑盒测试方法进行穷举测试,力图全面、无遗漏地“挖掘”出程序中的所有错误。这样做可能采用的测试数据组(Xi,Yi)的最大可能数目为: 。如果程序P测试一组X、Y数据需要 1毫秒,且一天工作24小时,一年工作365天,要完成264组测试,需要5亿年。

图 10-4-1 黑盒子

  而对一个具有多重选择和循环嵌套的程序,不同的路径数目也可能是天文数字。设给出一个如图 10-4-2所示的小程序的流程图,其中包括了一个执行达20次的循环。那么它所包含的不同执行路径数高达 条,若要对它进行穷举测试,覆盖所有的路径。假使测试程序对每一条路径进行测试需要1毫秒,同样假定一天工作24小时,一年工作365 天,那么要想把如图 10-4-2所示的小程序的所有路径测试完,则需要3170年。

图 10-4-2 白盒测试中的穷举测试

  以上的分析表明,实行穷举测试,由于工作量过大,实施起来是不现实的。任何软件开发项目都要受到期限、费用、人力和机时等条件的限制,尽管为了充分揭露程序中所有隐藏错误,需要针对所有可能的数据进行测试,但事实告诉我们,这样做是不可能的。

  软件工程的总目标是充分利用有限的人力、物力资源,高效率、高质量、低成本地完成软件开发项目。在测试阶段既然穷举测试不可行,为了节省时间和资源,提高测试效率,就必须要从数量极大的可用测试用例中精心地挑选少量的测试数据,使得采用这些测试数据能够达到最佳的测试效果,能够高效率地把隐藏的错误揭露出来。

常见的测试用例方法有:逻辑覆盖属于白盒测试, 等价类划分,边界值分析,因果图等属于黑盒测试。

  二、逻辑覆盖

  逻辑覆盖是以程序内部的逻辑结构为基础的设计测试用例的技术。属白盒测试。这一方法要求测试人员对程序的逻辑结构有清楚的了解,甚至要能掌握源程序的所有细节。由于覆盖测试的目标不同,逻辑覆盖又可分为:语句覆盖、判定覆盖、判定-条件覆盖、条件组合覆盖及路径覆盖。

  1.语句覆盖

  语句覆盖就是设计若干个测试用例,运行被测程序,使得每一可执行语句至少执行一次。这种覆盖又称为点覆盖,它使得程序中每个可执行语句都得到执行,但它是最弱的逻辑覆盖准,效果有限,必须与其他方法交互使用。

  2.判定覆盖

  判定覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次。判定覆盖又称为分支覆盖。

  判定覆盖只比语句覆盖稍强一些,但实际效果表明,只是判定覆盖,还不能保证一定能查出在判断的条件中存在的错误。因此,还需要更强的逻辑覆盖准则去检验判断内部条件。

       3.条件覆盖

  条件覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的每个条件的可能取值至少执行一次。

  条件覆盖深入到判定中的每个条件,但可能不能满足判定覆盖的要求。

  4.判定-条件覆盖

  判定-条件覆盖就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,同时每个判断本身的所有可能判断结果至少执行一次。换言之,即是要求各个判断的所有可能的条件取值组合至少执行一次。

  判定-条件覆盖有缺陷。从表面上来看,它测试了所有条件的取值。但是事实并非如此。往往某些条件掩盖了另一些条件。会遗漏某些条件取值错误的情况。为彻底地检查所有条件的取值,需要将判定语句中给出的复合条件表达式进行分解,形成由多个基本判定嵌套的流程图。这样就可以有效地检查所有的条件是否正确了。

图 10-4-3(a) 复合判定的例子

图 10-4-3(b) 改为单个条件判定的嵌套结构的例子

  5.多重条件覆盖

  多重条件覆盖就是设计足够的测试用例,运行被测程序,使得每个判断的所有可能的条件取值组合至少执行一次。

  这是一种相当强的覆盖准则,可以有效地检查各种可能的条件取值的组合是否正确。它不但可覆盖所有条件的可能取值的组合,还可覆盖所有判断的可取分支,但可能有的路径会遗漏掉。测试还不完全。

  6.路径测试

  路径测试就是设计足够的测试用例,覆盖程序中所有可能的路径。这是最强的覆盖准则。但在路径数目很大时,真正做到完全覆盖是很困难的,必须把覆盖路径数目压缩到一定限度。下面我们做一分析。

  三、关于控制结构测试的一些讨论

  1.分支结构的路径数

  当程序中判定多于一个时,形成的分支结构可以分为两类:嵌套型分支结构和连锁型分支结构。如图 10-4-4所示。对于嵌套型分支结构,若有n个判定语句,则需要n+1个测试用例;但对连锁型分支结构,若有n个判定语句,则需要有 个测试用例,去覆盖它的 条路径。当n较大时将无法测试。

(a)嵌套型分支结构

 

(b)连锁型分支结构

图 10-4-4 分支的两种类型

  为减少测试用例的数目,可采用试验设计法,抽取部分路径进行测试。由于抽样服从均匀分布,因此,在假定各条路径的重要性相同,或暂不明确各条路径的重要性的情况下可以做到均匀抽样。如果明确了各条路径的重要性,还可以采取加权的办法,筛选掉部分路径,再用如下的措施进行抽样。具体步骤如下:

  (1) 设耦合型分支结构中有n个判定,计算满足关系式 的最小自然数m;

  (2) 设 ,取正交表L4,并利用它设计测试数据。

  例如,一个耦合型分支结构中有三个判定语句P1,P2,P3。它全部路径是23=8条。先计算 的t,得t= 4。取正交表L4,如图10-4-5(a)所示,把每一列当做一个判定,每一行当做可取的测试用例,则正交表L4最多可取三个判定,分别代之以P1,P2,P3。判定P1,P2,P3的取假分支和取真分支分别记作S1、S2;S3、S4;S5、S6,用各个判定的取假分支取代正交表L4中的“0”,用取真分支取代正交表中的“1”,就建立起一个测试路径矩阵,如图 10-4-5(b)所示。这样,测试路径数目从 条减少到3+1=4条。

图 10-4-5(a) 正交表L4

图 10-4-5(b) 路径抽样矩阵

  2.条件测试的策略

  程序中的条件分为简单条件和复合条件。简单条件是一个布尔变量或一个关系表达式(可加前缀NOT),复合条件由简单条件通过逻辑运算符(AND、OR、NOT)和括号连接而成。如果条件出错,至少是条件中某一成分有错。条件中可能的出错类型有:布尔运算符错、布尔变量错、布尔括号错、关系运算符错、算术表达式错。

  如果在一个判定的复合条件表达式中每个布尔变量和关系运算符最多只出现一次,而且没有公共变量,应用一种称之为BRO(分支与关系运算符)的测试法可以发现多个布尔运算符或关系运算符错,以及其他错误。

BRO策略引入条件约束的概念。设有n个简单条件的复合条件C,其条件约束为 ,其中 是条件C中第i个简单条件的输出约束。如果在C的执行过程中,其每个简单条件的输出都满足D中对应的约束,则称条件C的条件约束D由C的执行所覆盖。特别地,布尔变量或布尔表达式的输出约束必须是真(t)或假(f);关系表达式的输出约束为符号>、=、<。

  (1) 设条件为 。其中 是布尔变量, 的输出约束为 ,在此, 和 或为t或为f。则 是 可能的一个约束。覆盖此约束的测试(一次运行)将令 为t, 为f。BRO策略要求对 的可能约束集合 中的每一个,分别设计一组测试用例。如果布尔运算符有错,这三组测试用例的运行结果必有一组导致 失败。

  (2) 设条件为 。其中 是布尔表达式, 和 是算术表达式, 的输出约束为 ,在此, 或为t或为f; 则是<、= 或>。因此,只有 与 中 的不同,可以修改 的约束集合 ,导出 的约束集合。因为在 中,“t”相当于“=”,“f”相当于“<”或“>”,则 的约束集合为 。据此设计4组测试用例,检查 中可能的布尔或关系运算符中的错误。

  (3) 设条件为 。其中 都是算术表达式, 的输出约束为 ,在此, 和 的约束均为<、=、>。 中只有 与 中的 不同,可以修改 的约束集合 ,导出 的约束集合。因为在 中,“t” 相当于“>”,"f"相当于“<”或“=”,则 的约束集合为 。根据这个约束集合设计测试用例,就能够检测 中的关系运算符中的错误。

  3.循环测试

  循环分为4种不同类型:简单循环、连锁循环、嵌套循环和非结构循环,见图 10-4-6。

  对于简单循环,测试应包括以下几种,其中的n表示循环允许的最大次数。

  (1) 零次循环:从循环入口直接跳到循环出口。

  (2) 一次循环:查找循环初始值方面的错误。

  (3) 二次循环:检查在多次循环时才能暴露的错误。

  (4) m次循环:此时的m<n,也是检查在多次循环时才能暴露的错误。

  ·最大次数循环、比最大次数多一次的循环、比最大次数少一次的循环。

  对于嵌套循环,不能将简单循环的测试方法简单地扩大到嵌套循环,因为可能的测试数目将随嵌套层次的增加呈几何倍数增长。这可能导致一个天文数字的测试数目。下面给出一种有助于减少测试数目的测试方法。

  ·除最内层循环外,从最内层循环开始,置所有其他层的循环为最小值;

  ·对最内层循环做简单循环的全部测试。测试时保持所有外层循环的循环变量为最小值。另外,对越界值和非法值做类似的测试。

  ·逐步外推,对其外面一层循环进行测试。测试时保持所有外层循环的循环变量取最小值,所有其它嵌套内层循环的循环变量取“典型”值。

  ·反复进行,直到所有各层循环测试完毕。

  对全部各层循环同时取最小循环次数,或者同时取最大循环次数。对于后一种测试,由于测试量太大,需人为指定最大循环次数。

  对于连锁循环,要区别两种情况。如果各个循环互相独立,则连锁循环可以用与简单循环相同的方法进行测试。例如,有两个循环处于连锁状态,则前一个循环的循环变量的值就可以做为后一个循环的初值。但如果几个循环不是互相独立的,则需要使用测试嵌套循环的办法来处理。

  对于非结构循环,应该使用结构化程序设计方法重新设计测试用例。

  四、基本路径测试

  如果把覆盖的路径数压缩到一定限度内,例如,程序中的循环体只执行零次和一次,就成为基本路径测试。它是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。

  设计出的测试用例要保证在测试中,程序的每一个可执行语句至少要执行一次。

1.程序的控制流图

  控制流图是描述程序控制流的一种图示方法。基本控制构造的图形符号如图10-4-7所示。符号○称为控制流图的一个结点,一组顺序处理框可以映射为一个单一的结点。控制流图中的箭头称为边,它表示了控制流的方向,在选择或多分支结构中分支的汇聚处,即使没有执行语句也应该有一个汇聚结点。边和结点圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为一个区域。

图 10-4-7 控制流图的各种图形符号

  如果判定中的条件表达式是复合条件时,即条件表达式是由一个或多个逻辑运算符(OR,AND,NAND,NOR)连接的逻辑表达式,则需要改复合条件的判定为一系列只有单个条件的嵌套的判定。例如对应图 10-4-8(a)的复合条件的判定,应该画成如图 10-4-8(b)所示的控制流图。条件语句ifaORb中条件a和条件b各有一个只有单个条件的判定结点。

  2.计算程序环路复杂性

  进行程序的基本路径测试时,程序的环路复杂性给出了程序基本路径集合中的独立路径条数,这是确保程序中每个可执行语句至少执行一次所必需的测试用例数目的上界。所谓独立路径,是指包括一组以前没有处理的语句或条件的一条路径。如在图10-4-9(b)所示的控制流图中,一组独立的路径是

  path1:1-11
  path2:1-2-3-4-5-10-1-11
  path3:1-2-3-6-8-9-10-1-11
  path4:1-2-3-6-7-9-10-1-11

  路径path1,path2,path3,path4组成了图 10-4-9(b)所示控制流图的一个基本路径集。只要设计出的测试用例能够确保这些基本路径的执行,就可以使得程序中的每个可执行语句至少执行一次,每个条件的取真和取假分支也能得到测试。基本路径集不是唯一的,对于给定的控制流图,可以得到不同的基本路径集。

(a)程序流程图

(b)控制流图

图 10-4-9 程序流程图与对应的控制流图

  通常环路复杂性可用以下3种方法求得。

  (1) 将环路复杂性定义为控制流图中的区域数。

  (2) 设E为控制流图的边数,N为图的结点数,则定义环路复杂性为V(G)=E-N+2。

  (3) 若设P为控制流图中的判定结点数,则有V(G)=P+1。

  因为图 10-4-9(b)所示控制流图有4个区域。其环路复杂性为4。它是构成基本路径集的独立路径数的上界。可以据此得到应该设计的测试用例的数目。

  3.导出测试用例

  利用逻辑覆盖方法生成测试用例,确保基本路径集中每条路径的执行。

 

参考资料:

1  白盒测试用例设计方法 http://www.51testing.com/html/72/n-226472-2.html

2 《实用软件工程》 8.3 白盒测试的测试用例设计

3   软件单元测试工具比较  http://blog.csdn.net/ajian005/article/details/6588314

转载:http://m.blog.csdn.net/article/details?id=31005607

转载于:https://www.cnblogs.com/WuXuanKun/p/6195110.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283172.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s 读书笔记 - 详解 Pod 调度(Ⅰ卷)

上一篇 《深入掌握 Pod》 文章我们介绍了 Pod 的知识点&#xff0c;接下来我们来继续学习 Pod 在 k8s 中的调度原理。在 k8s 平台上&#xff0c;通常情况下很少直接创建一个 Pod&#xff0c;大多情况下都是通过 Pod 的资源管理对象 来创建&#xff0c;例如&#xff1a;RC/RS、…

SaS中ne在mysql语句对应_SAS学习经验总结分享:篇四—SQL过程

SQL过程SQL过程是实现对数据集或关系数据库的表进行操作的过程&#xff0c;对数据集或关系数据库的表进行查询、修改、创建表、删除数据、插入数据和更新数据等功能。提现了SAS对大型数据库管理系统通用的SQL语言支持。SQL过程语法Proc sql ;数据操纵语句;quit;数据操纵语句&am…

.Net转Java自学之路—基础巩固篇八—总结(封装、继承、多态)

巴拉巴拉转载于:https://www.cnblogs.com/zltao/p/9074944.html

我对于全栈工程师的理解

对于才达到初级前端攻城狮的我来说&#xff0c;懵懵懂懂的我有了了解全栈工程师的机会&#xff0c;那什么是全栈工程师呢&#xff1f; 全栈工程师&#xff0c;也叫全端工程师(同时具备前端和后台能力)&#xff0c;英文Full Stack developer。是指掌握多种技能&#xff0c;并能利…

php数组操作集锦- 掌握了数组操作, 也就掌握了php

作为只是作为一种生存手段, 搞技术不用钻牛角尖! 有些东西, 只要大致了解, 如果已经进行了深入的了解, 但还是不能解决,就不要继续了... "专"相关的字, 只有 "钻" 金属旁的是zuan, 其余的都是 "zhuan" 包括: 转, 传, 专心.等等.. 其时, 要想掌握…

.NET MAUI实战 Navigation

1.概要用过WPF的小伙伴一般都用过Prism&#xff0c;Prism里面的导航概念在MAUI中也有类似的概念&#xff0c;在MAUI中是直接集成在框架中我们不需要安装任何其他的nuget包。直接使用Navigation对象即可,通常在移动平台中使用的更多&#xff0c;桌面程序中。我们先来看看微软官方…

mysql 修复表 阿里云_MySql数据表修复方法-阿里云开发者社区

mysqld进程在一个写入当中被杀死。计算机的意外关闭(例如&#xff0c;如果计算机掉电)。一个硬件错误这章描述如何检查和处理在MySQL数据库中的数据损坏。如果你的表损坏很多&#xff0c;你应该尝试找出其原因&#xff01;见G.1 调试一个MySQL服务器。在执行崩溃恢复时&#xf…

关于响应式布局,你必须要知道的

一、前言 响应式Web设计可以让一个网站同时适配多种设备和多个屏幕&#xff0c;可以让网站的布局和功能随用户的使用环境&#xff08;屏幕大小、输入方式、设备/浏览器能力&#xff09;而变化。本文主要介绍一些响应式布局容易忽略但又很重要的知识点。 二、视口 移动前端中常说…

python报错 scrolled: false_python 元组tuple - python基础入门(14)

文章首发微信公众号&#xff0c;微信搜索&#xff1a;猿说python在上一篇文章中我们讲解了关于python列表List的相关内容&#xff0c;今天给大家解释一下列表List的兄弟 – 元组&#xff0c;俗称: tuple.元组tuple和列表List类似&#xff0c;元组有如下特点&#xff1a;1.由一个…

SpringBoot集成Druid不支持多条SQL

在DataSource 初始化Bean 添加 List<Filter> proxyFilters new ArrayList<Filter>();WallFilter statFilter new WallFilter();WallConfig config new WallConfig();config.setMultiStatementAllow(true); // 批量操作statFilter.setConfig(config);proxyFilte…

搭建 vue2 单元测试环境(karma+mocha+webpack3)

从网上找了很多例子关于单元测试&#xff0c;都是如何新建项目的时候的添加单元测试&#xff0c;用vue-cli中怎么添加&#xff0c;但是我的项目已经生成了&#xff0c;不能再一次重新初始化&#xff0c;这时如何添加单元测试&#xff0c;这里面遇到了好多坑&#xff0c;写在这里…

开放原子开源峰会 - SmartIDE正式开源并发布v1.0版本丨IDCF

在上周刚刚结束的【2022开放原子全球开源峰会】上 SmartIDE作为正在进行开放原子基金会TOC审核的开源项目&#xff0c;在云原生论坛上向全球的开源开发者介绍了下一代云原生CloudIDE的全新使用体验&#xff0c;并且正式发布了 SmartIDE v1.0 版本。作者&#xff1a;徐磊文章首发…

【算法学习】网络流模板……

网络流最大流&#xff08;最小割&#xff09;Dinic模板…… 1 const int INF99999999; 2 const int Maxn; 3 const int Maxm; 4 inline int Min(int p,int q){return p<q?p:q;} 5 int n,m,h[Maxn5],to[Maxm*25],cap[Maxm*25],nxt[Maxm*25],tot1,Sum0,que[Maxn5],l,r,lv[Max…

给初学者的 RxJava2.0 教程 (八)

Outline [TOC] 前言 在上一节中, 我们学习了FLowable的一些基本知识, 同时也挖了许多坑, 这一节就让我们来填坑吧. 正题 在上一节中最后我们有个例子, 当上游一次性发送128个事件的时候是没有任何问题的, 一旦超过128就会抛出MissingBackpressureException异常, 提示你上游发太…

mysql数据库的目录_了解MySQl数据库目录

数据库目录是MySQL数据库服务器存放数据文件的地方&#xff0c;不仅包括有关表的文件&#xff0c;还包括数据文件和MySQL的服务器选项文件。不同的分发&#xff0c;数据库目录的缺省位置是不同的。数据目录的位置缺省的数据库位置缺省数据库的位置编译在服务器中。◆如果您是在…

修改docker的默认存储位置及镜像存储位置

2019独角兽企业重金招聘Python工程师标准>>> 方法一、软链接 默认情况下Docker的存放位置为&#xff1a;/var/lib/docker 可以通过下面命令查看具体位置&#xff1a; sudo docker info | grep "Docker Root Dir" 解决这个问题&#xff0c;最直接的方法当然…

微信小程序第三方服务公司有哪些

虽然微信小程序还没有正式推出&#xff0c;但围绕着微信小程序第三方服务公司之间的战争早已经开始。他们在小程序生成工具&#xff08;一键生成小程序&#xff0c;无需开发&#xff09;、微信小程序开发工具、小程序数据统计等领域展开激烈竞争&#xff0c;我们一起来看看微信…

python maketrans_Python maketrans()方法 - Python 教程 - 自强学堂

Python maketrans()方法描述Python maketrans() 方法用于创建字符映射的转换表&#xff0c;对于接受两个参数的最简单的调用方式&#xff0c;第一个参数是字符串&#xff0c;表示需要转换的字符&#xff0c;第二个参数也是字符串表示转换的目标。注&#xff1a;两个字符串的长度…

Blazor University (49)依赖注入 —— 比较依赖范围

原文链接&#xff1a;https://blazor-university.com/dependency-injection/dependency-lifetimes-and-scopes/comparing-dependency-scopes/比较依赖范围源代码[1]在本节中&#xff0c;我们将创建一个 Blazor 应用程序来演示各种依赖注入作用域的不同生命周期。为此&#xff0…

CSS选择器的权重与优先规

我们把特殊性分为4个等级&#xff0c;每个等级代表一类选择器&#xff0c;每个等级的值为其所代表的选择器的个数乘以这一等级的权值&#xff0c;最后把所有等级的值相加得出选择器的特殊值。 4个等级的定义如下&#xff1a; 第一等&#xff1a;代表内联样式&#xff0c;如: st…