白盒测试 语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖(转)...

转自:http://wenda.tianya.cn/wenda/thread?tid=758a1e447e62b7df&hl=ja

 

白盒测试作为测试人员常用的一种测试方法,越来越受到测试工程师的重视。白盒测试并不是简单的按照代码设计用例,而是需要根据不同的测试需求,结合不同的测试对象,使用适合的方法进行测试。因为对于不同复杂度的代码逻辑,可以衍生出许多种执行路径,只有适当的测试方法,才能帮助我们从代码的迷雾森林中找到正确的方向。本文介绍六种白盒子测试方法:语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖。

  白盒测试的概述

  由于逻辑错误和不正确假设与一条程序路径被运行的可能性成反比。由于我们经常相信某逻辑路径不可能被执行, 而事实上,它可能在正常的情况下被执行。由于代码中的笔误是随机且无法杜绝的,因此我们要进行白盒测试。

  白盒测试又称结构测试,透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的。

  白盒的测试用例需要做到:

·保证一个模块中的所有独立路径至少 被使用一次
  ·对所有逻辑值均需测试 true 和 false
  ·在上下边界及可操作范围内运行所有循环
  ·检查内部数据结构以确保其有效性

  白盒测试的目的:通过检查软件内部的逻辑结构,对软件中的逻辑路径进行覆盖测试;在程序不同地方设立检查点,检查程序的状态,以确定实际运行状态与预期状态是否一致。

  白盒测试的特点:依据软件设计说明书进行测试、对程序内部细节的严密检验、针对特定条件设计测试用例、对软件的逻辑路径进行覆盖测试。

  白盒测试的实施步骤:

1.测试计划阶段:根据需求说明书,制定测试进度。
  2.测试设计阶段:依据程序设计说明书,按照一定规范化的方法进行软件结构划分和设计测试用例。
  3.测试执行阶段:输入测试用例,得到测试结果。
  4.测试总结阶段:对比测试的结果和代码的预期结果,分析错误原因,找到并解决错误。

  白盒测试的方法:总体上分为静态方法和动态方法两大类。

  静态分析是一种不通过执行程序而进行测试的技术。静态分析的关键功能是检查软件的表示和描述是否一致,没有冲突或者没有歧义。

  动态分析的主要特点是当软件系统在模拟的或真实的环境中执行之前、之中和之后 , 对软件系统行为的分析。动态分析包含了程序在受控的环境下使用特定的期望结果进行正式的运行。它显示了一个系统在检查状态下是正确还是不正确。在动态分析技术中,最重要的技术是路径和分支测试。下面要介绍的六种覆盖测试方法属于动态分析方法。

  白盒测试的优缺点

  1. 优点

·迫使测试人员去仔细思考软件的实现
  ·可以检测代码中的每条分支和路径
  ·揭示隐藏在代码中的错误
  ·对代码的测试比较彻底
  ·最优化

  2. 缺点

  ·昂贵
  ·无法检测代码中遗漏的路径和数据敏感性错误
  ·不验证规格的正确性

六种覆盖方法

  首先为了下文的举例描述方便,这里先给出一张程序流程图。(本文以1995年软件设计师考试的一道考试题目为例,图中红色字母代表程序执行路径)。

  

  1、语句覆盖

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

  2)用例设计:(如果此时将A路径上的语句1—〉T去掉,那么用例如下)

  

X
Y
路径
1
50
50
OBDE
2
90
70
OBCE

 

  3)优点:可以很直观地从源代码得到测试用例,无须细分每条判定表达式。

  4)缺点:由于这种测试方法仅仅针对程序逻辑中显式存在的语句,但对于隐藏的条件和可能到达的隐式逻辑分支,是无法测试的。在本例中去掉了语句1—〉T去掉,那么就少了一条测试路径。在if结构中若源代码没有给出else后面的执行分支,那么语句覆盖测试就不会考虑这种情况。但是我们不能排除这种以外的分支不会被执行,而往往这种错误会经常出现。再如,在Do-While结构中,语句覆盖执行其中某一个条件分支。那么显然,语句覆盖对于多分支的逻辑运算是无法全面反映的,它只在乎运行一次,而不考虑其他情况。

  2、判定覆盖

  1)主要特点:判定覆盖又称为分支覆盖,它要求设计足够多的测试用例,使得程序中每个判定至少有一次为真值,有一次为假值,即:程序中的每个分支至少执行一次。每个判断的取真、取假至少执行一次。

  2)用例设计:

  

X
Y
路径
1
90
90
OAE
2
50
50
OBDE
3
90
70
OBCE

 

  3)优点:判定覆盖比语句覆盖要多几乎一倍的测试路径,当然也就具有比语句覆盖更强的测试能力。同样判定覆盖也具有和语句覆盖一样的简单性,无须细分每个判定就可以得到测试用例。

  4)缺点:往往大部分的判定语句是由多个逻辑条件组合而成(如,判定语句中包含AND、OR、CASE),若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。

  3、条件覆盖

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

  2)用例设计:

  

X
Y
路径
1
90
70
OBC
2
40
OBD

 

  3)优点:显然条件覆盖比判定覆盖,增加了对符合判定情况的测试,增加了测试路径。

  4)缺点:要达到条件覆盖,需要足够多的测试用例,但条件覆盖并不能保证判定覆盖。条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。

 4、判定/条件覆盖

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

  2)用例设计:

  

X
Y
路径
1
90
90
OAE
2
50
50
OBDE
3
90
70
OBCE
4
70
90
OBCE

 

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

  4)缺点:判定/条件覆盖准则的缺点是未考虑条件的组合情况。

  5、组合覆盖

  1)主要特点:要求设计足够多的测试用例,使得每个判定中条件结果的所有可能组合至少出现一次。

  2)用例设计:

  

X
Y
路径
1
90
90
OAE
2
90
70
OBCE
3
90
30
OBDE
4
70
90
OBCE
5
30
90
OBDE
6
70
70
OBDE
7
50
50
OBDE

 

  3)优点:多重条件覆盖准则满足判定覆盖、条件覆盖和判定/条件覆盖准则。更改的判定/条件覆盖要求设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身的所有可能结果也至少出现一次。并且每个条件都显示能单独影响判定结果。

  4)缺点:线性地增加了测试用例的数量。

  6、路径覆盖

  1)主要特点:设计足够的测试用例,覆盖程序中所有可能的路径。

  2)用例设计:

  

X
Y
路径
1
90
90
OAE
2
50
50
OBDE
3
90
70
OBCE
4
70
90
OBCE

 

  3)优点:这种测试方法可以对程序进行彻底的测试,比前面五种的覆盖面都广。

  4)缺点:由于路径覆盖需要对所有可能的路径进行测试(包括循环、条件组合、分支选择等),那么需要设计大量、复杂的测试用例,使得工作量呈指数级增长。而在有些情况下,一些执行路径是不可能被执行的,如:
  If (!A)B++;
  If (!A)D--;

  这两个语句实际只包括了2条执行路径,即A为真或假时候对B和D的处理,真或假不可能都存在,而路径覆盖测试则认为是包含了真与假的4条执行路径。这样不仅降低了测试效率,而且大量的测试结果的累积,也为排错带来麻烦。

  总结

  白盒测试是一种被广泛使用的逻辑测试方法,是由程序内部逻辑驱动的一种单元测试方法。只有对程序内部十分了解才能进行适度有效的白盒测试。但是贯穿在程序内部的逻辑存在着不确定性和无穷性,尤其对于大规模复杂软件。因此我们不能穷举所有的逻辑路径,即使穷举也未必会带来好运(穷举不能查出程序逻辑规则错误,不能查出数据相关错误,不能查出程序遗漏的路径)。

  那么正确使用白盒测试,就要先从代码分析入手,根据不同的代码逻辑规则、语句执行情况,选用适合的覆盖方法。任何一个高效的测试用例,都是针对具体测试场景的。逻辑测试不是片面的测试正确的结果或是测试错误的结果,而是尽可能全面地覆盖每一个逻辑路径。

 

转载二:http://www.cnblogs.com/yinluhui0229/articles/2051482.html

 

判定覆盖 与 条件覆盖 的区别

 

     判定覆盖只关心判定表达式的值(真/假),而条件覆盖涉及到判定表达式的每个条件的值(真/假)。

举个最简单的例子,方便理解:

   判定表达式:a>1 or b>1

     用判定覆盖设计的测试数据:

          a=5 (判定表达式的值为“真”)

          a=0 (判定表达式的值为“假”)

          这里不需要管b的取值,就已经满足判定覆盖的条件了。

     用条件覆盖设计的测试数据:

           a=5 (条件a>1的值为“真”)

           a=0(条件a>1的值为“假”)

           b=5 (条件b>1的值为“真”)

          b=0 (条件b>1的值为“假”)

          这里不考虑 a>1 or b>1 这个表达式的取值的情况,但必须把a>1  和 b>1 这两个条件的取值考虑全。

转载于:https://www.cnblogs.com/diegodu/p/4514118.html

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

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

相关文章

matlab getsplitpic,MATLAB_9-模式识别笔记

1,识别单独字符的:思想:picsize[20,10];创建一个矩阵,将两个照片整理成大小一致的。具体就是使用后面的:aimresize(a,picsize);fontsABCDEFGHNVJXSMQ;建立字符串用于匹配输出(就是识别的功能!)下面一个for循…

浅谈android4.0开发之GridLayout布局

作者:李响 本文重点讲述了自android4.0版本号后新增的GridLayout网格布局的一些基本内容,并在此基础上实现了一个简单的计算器布局框架。通过本文,您可以了解到一些android UI开发的新特性,并可以实现相关应用。 在android4.0版本号之…

解扰matlab,数据序列扰乱与解扰MATLAB实现及性能分析—利用m序列.doc

数据序列扰乱与解扰MATLAB实现及性能分析—利用m序列《数据序列的扰乱与解扰的MATLAB实现及性能分析—利用17级m序列》 第 PAGE 1页 共20页数据序列的扰乱与解扰的MATLAB实现及性能分析—利用17级m序列学生姓名: 指导老师:摘要 本课程设计主要为了进一步…

ThinkPHP---RBAC

一、什么是RBAC 基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。 在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而…

c mysql bulk,MySqlBulkLoader批量上传遇到的问题和解决方法

最近用 MySqlBulkLoader 向MySql数据库批量上传数据遇到了些问题,做下记录问题1:如图原因:版本不合,使用的MySql版本和引用的mysql.data 版本不和解决方案:用nuget将mysql.data升级到对应版本,如果是MySql8…

Nim教程【七】

这是国内第一个关于Nim的系列教程 先说废话 很开心,在今天凌晨快一点多的时候拿到了 nim-lang.com;nim-lang.cn;nim-lang.net 这三个域名,到不是为了投资,准备用nim-lang.com做一个社区出来 不知道国内有没有人或者机构…

验证必须是数字php,Element 中表单非必填数据项 必须为数字的验证问题

Element-ui 的el-form组建中,自带基本的验证功能,比如某些项必填的验证,直接加入rules 规则中即可,如下实例:在页面中书写如下:在vue 初始化data中filterForm: {firstDay: ,lastDay: },rules: {firstDay: […

为开发者准备的9个实用PHP代码片段(转)

[导读] 当你开发网站、app或博客系统时,如果有一些实用的代码片段可以直接使用,就可以节省你大量的时间和精力。这篇文章就为你分享几个实用的PHP代码片段,帮助你的Web开发。 本文由PHP100中文网编译,转载请看文末的转载要求&…

idea 自动生产序列吗,IDEA自动生成序列化Id

实体对象实现了java.io.Serializable接口后,一般都会提供一个serialVersionUID以做版本区分。在idea里,可以通过设置来快速生成serialVersionUID。设置方法1、打开Preferences–>Editor–>Inspections,然后在右侧输入UID进行搜索(搜索方…

ZH奶酪:Ionic中(弹出式窗口)的$ionicModal使用方法

Ionic中[弹出式窗口]有两种(如下图所示),$ionicModal和$ionicPopup; $ionicModal是完整的页面; $ionicPopup是(Dialog)对话框样式的,直接用JavaScript设定对话框的一些参数,通常用于通知消息、确认等作用&a…

php getdefaultvalue,PHP ReflectionParameter getDefaultValueConstantName()用法及代码示例

ReflectionParameter::getDefaultValueConstantName()函数是PHP中的内置函数,如果默认值为常数或null,则用于返回默认值的常数名称。用法:string ReflectionParameter::getDefaultValueConstantName ( void )参数:该函数不接受任何参数。返回…

php表单中姓名必须使用汉字,我想在表单验证中加入中文姓名合法性模糊匹配判断?...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼刚开始只是想检验一下输入的是不是中文,后来学了正则表达式后,想尝试一下,把常见的姓氏通过字符串判断的形式,主要是对姓氏进行验证,当然还有输入长度,可我对自…

php实现购物车 redis,redis 哈希数据类型简单操作(实现购物车案例)

这里不累赘如何安装redis和php redis扩展,主要熟悉调用redis哈希数据类型如图简单方法操作如下1:hSet2:hGet4:hDel5:hGetAll4:hExists5:hIncrBy简单购物车实现namespaceHome\Controller;useThink\Controller;useOrg\Net\Http;useThink\Cache\Driver\Red…

写在25岁

虽然到25岁,大家会告诉你女人容颜开始衰退,要多加注意保养,要学会化妆,要会穿高跟鞋。虽然到25岁,大家告诉你要赶紧结婚生子,否则女人开始贬值。虽然到25岁,大家会告诉你工作不要那么拼&#xf…

matlab中D A1在哪,A1=d(1:15,:);A2=d(16:30,:);A3=

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼A1d(1:15,:);A2d(16:30,:);A3d(31:45,:);A4d(46:60,:);A5d(61:75,:);A6d(76:90,:);B1d(91:105,:);B2d(106:120,:);B3d(121:135,:);B4d(136:150,:);B5d(151:165,:);B6d(166:180,:);B7d(181:195,:);B8d(196:210,:);B9d(211:225,:);C1…

使用block的好处

1 使用block 可以轻松地绑定各处代码块,使用delete 结构是分散的,不利于变量之间传值,不像block可以随意地获取变量值。 2.使用block可以方便执行异步代码,作为异步处理回调。 In terms of code readability, the block makes it …

python mysql ssl,python – 在SQLAlchemy中使用SSL

我最近改变了我的项目使用SQLAlchemy并且我的项目运行正常,它使用了外部MySQL服务器.现在我正在尝试使用具有SSL CA的不同MySQL服务器,并且它不会连接.(它确实使用MySQL Workbench进行连接,因此证书应该没问题)我正在使用以下代码:ssl_args {ssl: {ca: ca_path}}en…

Easyui中使用jquery或js动态添加元素时出现的样式失效的解决方法

Easyui中使用jquery或js动态添加元素时出现的样式失效的解决方法 在添加完之后&#xff0c;可以使用 $.parser.parse();这个方法进行处理:(1) 对整个页面重新渲染: $.parser.parse();  (2) 渲染某个特定的组件:var targetObj $("<input namemydate classeasyui-date…

ftp完成版本更新php,php – 将开发团队从FTP转换为版本控制系统

问题&#xff1a;>你(他们)从来没有遇到过灾难,你(他们)需要恢复到以前版本的网站,但却不能因为他们破坏了它&#xff1f;>他们是否使用临时Web服务器来测试更改&#xff1f;>当然,如果没有某些测试,他们不会修改生产服务器中的代码&#xff1f;我怀疑第一个的答案是“…

IOS-NSDateFormatter使用介绍

IOS-NSDateFormatter使用介绍 NSDateFormatter的使用&#xff1a; NSDate *nowDate [[NSDate alloc] init];NSDateFormatter *dateFormatter [[NSDateFormatter alloc] init];[dateFormatter setDateFormat:"yyyy-mm"];NSString *time [dateFormatter stringFromD…