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

白盒测试

概念:按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。

分类:白盒测试是基于覆盖的测试,尽可能覆盖程序的结构特性和逻辑路径,所以其具体方法有逻辑覆盖、循环覆盖、基本路径覆盖。逻辑覆盖又可进一步分为语句覆盖、判定(分支)覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖等。白盒测试主要用于单元测试(我们需要了解程序源码和结构,而且基于输入输出,适合单元模块)。下面重点介绍常用的几种白盒测试方法。

语句覆盖:

定义:只要求覆盖到所有可执行语句(每个可执行语句至少运行一次),不关注判断运算,确保可执行语句处没有错误。

例子:

按照白盒,我们只需覆盖到所有可执行语句即可,而为此我们只需用测试用例(X=1,Y=4,Z=9)。这样三句话都会打印出来。但如果编码时将X=1 AND Y>3错误写成X=1 OR Y>3,虽然我们的测试用例可以覆盖到所有可执行语句,而且证明可执行语句无误,但因此我们的密码系统面临巨大风险,Y只要大于3就能攻破第一道防线。而我们对此浑然不知。所以语句覆盖不能满足我们的需求(有人说它是最弱的逻辑覆盖准则)。

判定(分支)覆盖:

定义:每个判断的取真分支和取假分支至少经历一次。弥补语句覆盖对判断逻辑的不足。

例子:同上。

  • (X=1,Y=4,Z=9)—— 通过路径T->T
  • (X=0,Y=4,Z=0)—— 通过路径F->F

上面两个测试用例,将两个判断条件的真假值都遍历了,是执行判定覆盖的最少测试用例。这样当将X=1 AND Y>3误写成X=1 OR Y>3时,第二个测试用例就能发现错误。但如果选择的测试用例是(X=0,Y=0,Z=0)还是不能发现错误。试试下面的覆盖。

条件覆盖:

定义:使每个判断中每个条件的真假至少满足一次。

例子:同上。

第一个判断中有两个条件X=1和Y>3,第二个判断中有一个条件Z=9。

  • (X=1,Y=4,Z=9)—— X=1真,Y>3真,Z=9真
  • (X=0,Y=0,Z=0)—— X=1假,Y>3假,Z=9假

也是两个测试用例即可。这种覆盖有两个问题:

  • 任然不能解决那个OR问题
  • 如果选择的测试用例是(X=1,Y=2,Z=9)和(X=0,Y=4,Z=0),虽然符合条件覆盖,但第一个判断只执行了假分支,这会遗漏逻辑错误。

判定——条件覆盖:

定义:是判定覆盖和条件覆盖的结合。保证每个判断中每个条件的真假至少满足一次,同时每个判断的取真分支和取假分支至少经历一次。

例子:同上。

  • (X=1,Y=4,Z=9)
  • (X=0,Y=0,Z=0)

这样既让每个判断的真假分支都取到,也让每个判断中每个条件的真假也都取到。但这同样解决不了OR问题——当AND误写为OR时,两个用例的执行路径不变,所以仅凭这两个用例是无法察觉错误的。

条件组合覆盖:

定义:对于每个判断,组合其中的条件的真假值(假如这个判断中由两个条件组成,那么应设计T1T2、T1F2、F1T2、F1F2这样的组合),并让每个判断的真假值都取到。

例子:同上。

  • (X=1,Y=4,Z=9)—— X=1真,Y>3真,Z=9真——覆盖路径:T-T
  • (X=1,Y=0,Z=0)—— X=1真,Y>3假,Z=9假——覆盖路径:F-F
  • (X=0,Y=4,Z=9)—— X=1假,Y>3真,Z=9真——覆盖路径:F-T
  • (X=0,Y=0,Z=0)—— X=1假,Y>3假,Z=9假——覆盖路径:F-F

当OR问题出现时,上述第二、三个用例的路径就会发生改变,察觉到错误。这样便解决了OR问题,因为第一个判断中条件真假的组合中一真一假的组合是区分AND和OR的根本手段。虽然OR问题解决了,但我们发现有一条路径没有覆盖到——T-F。

路径覆盖:

定义:覆盖所有可能执行的路径。

例子:同上。

让我们在条件组合覆盖用例的基础上修改第二个用例。

  • (X=1,Y=4,Z=9)—— X=1真,Y>3真,Z=9真——覆盖路径:T-T
  • (X=1,Y=4,Z=0)—— X=1真,Y>3真,Z=9假——覆盖路径:T-F
  • (X=0,Y=4,Z=9)—— X=1假,Y>3真,Z=9真——覆盖路径:F-T
  • (X=0,Y=0,Z=0)—— X=1假,Y>3假,Z=9假——覆盖路径:F-F

虽然路径都覆盖了,但路径覆盖没有覆盖所有的条件组合。

总结:

可见没有一种覆盖能完全覆盖所有的测试用例。因此,在实际的测试用例设计中,往往将多种覆盖进行组合,达到最高的覆盖率。像本例中,最终测试用例是在在条件组合覆盖的基础上补上路径覆盖所涉及的。

  • (X=1,Y=4,Z=9)—— X=1真,Y>3真,Z=9真——覆盖路径:T-T
  • (X=1,Y=0,Z=0)—— X=1真,Y>3假,Z=9假——覆盖路径:F-F
  • (X=0,Y=4,Z=9)—— X=1假,Y>3真,Z=9真——覆盖路径:F-T
  • (X=0,Y=0,Z=0)—— X=1假,Y>3假,Z=9假——覆盖路径:F-F
  • (X=1,Y=4,Z=0)—— X=1真,Y>3真,Z=9假——覆盖路径:T-F

补:

基本路径测试法:

(1)程序流程图

上述例子的流程图为:

(2)计算程序环路复杂度。

  • V(G) = 区域数目。区域是由边界和节点包围起来的形状所构成,计算区域时包括图的外部区域,将其作为一个区域。所以上图有3个区域,也就是有3条基本路径。
  • V(G) = 边界数目-节点数目+2。这样V(G) = 6 - 5 + 2 = 3。
  • V(G) = 判断节点数目 + 1。上图的判断节点是A和C,所以V(G) = 2 + 1 = 3——一般用它作为圈的复杂度,而圈复杂度是路径数的上限,下面就来看一看基本路径是哪些。

(3)确定基本路径。

上图所示的程序有3条基本路径,下面是一组基本路径:

  • A-C-end
  • A-B-C-end
  • A-B-C-D-end

基本路径是什么,3条基本路径是如何得出的(为什么有3条,选择这3条的原则)。希望知道的朋友留下评论:)

软件测试基本方法(二)之白盒测试,布布扣,bubuko.com

时间: 2024-11-02 13:53:30

软件测试基本方法(二)之白盒测试的相关文章

软件测试理论基础总结(二)

1.软件开发的生命周期? 软件生命周期是指从软件产品的设想开始到软件不再使用而结束的时间: 2.软件生命周期的模型? ①瀑布模型 特点:从上一项活动接受本项活动的工作对象,作为输入:利用这一输入实施本项活动应完成的内容:给出本项活动的工作成果,作为输出传给 下一项活动: 瀑布模型的优缺点: ②螺旋模型 特点:瀑布模型(系统化)+快速原型(迭代过程)+风险分析: 一个螺旋式周期: 确定目标,选择方案,选定完成目标的策略: 风险角度分析该策略: 启动一个开发阶段: 评价前一步的结果,计划下一轮的工作

获得执行计划方法二-explain plan

1 安装 $ORACLE_HOME/rdbms/admin/utlxplan.sql (UNIX)  脚本生成一个表这个程序会创建一个名为plan_table的表 2 运行 explain PLAN [ SET STATEMENT_ID [=] < string literal > ] [ INTO < table_name > ] FOR < sql_statement > 其中: STATEMENT_ID:是一个唯一的字符串,把当前执行计划与存储在同一PLAN中的其

软件测试基本方法(七)之验收测试

验收测试是在功能测试和系统测试之后进行的,所以验收测试的前提条件是系统或软件产品已通过了内部测试.然后和用户一起验收软件,在真实环境下运行软件,看是否存在与用户需求不一致的问题或违背产品规格书的要求.由于测试人员不可能完全用户实际使用情况,所以软件是否真正满足最终用户的要求,应由用户进行一系列的验收测试. (1)验收测试定义: 检查软件是否符合合同要求,包括需求规格说明.设计规格说明和用户手册等. (2)测试内容: 易用性测试(用户界面和可用性测试) 兼容性测试(软件兼容性测试.数据共享兼容性测

软件测试基本方法(三)之黑盒测试

黑盒测试: 概念:也称功能测试,它是通过测试来检测每个功能是否都能正常使用.在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构情况下,在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息.黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试. 分类:黑盒测试有很多具体方法,这里只选取两种最常用的--等价类划分法和边界值分析法. 等价类划分法: 定义:分为有效等价类和无效等价类.有效

java-第十四章-代参的方法(二)-实现MyShopping系统的添加会员功能

 package com.wxws.sms; public class Customer {  int No;  int integarl; } package com.wxws.sms; public class Customers {  Customer[] customers = new Customer[100];  public void add(Customer cust){   for (int i = 0; i <customers.length; i++) {    if (c

java-第十四章-代参的方法(二)-查找会员积分

 package com.wxws.smsB; public class Customer {  int No;  int integarl; } package com.wxws.smsB; public class Customers {  Customer[] customers = new Customer[100];  public void add(Customer cust) {   for (int i = 0; i < customers.length; i++) {    i

软件测试基本方法(四)之测试过程模型

瀑布模型是最常见也是最基本的过程模型,但实践中受到越来越大的局限性,我认为现代软件越发庞大和复杂,我们往往不能一眼洞穿,加上用户需求的多样化和不确定性,都让瀑布模型力不从心.于是出现了原型模型.迭代模型.敏捷过程模型和并发模型.例如原型模型就是为了加大与用户的交流,挖掘用户真正的需求.这里只是泛泛地谈一谈一些著名的测试过程改进模型. TMM(测试成熟度模型) 过程能力:描述了遵循一个软件测试过程可能达到的预期结果的范围. TMM的建立得益于: 充分吸收CMM的精华 基于历史演化的测试过程 业界的

软件测试基本方法(五)之单元测试

这是我们最亲密的测试,我们平常写课程设计,当然谈不上商业级的测试,往往就一个单元测试占据了测试.有些人习惯先搭起框架,然后再单元测试:也有些人在完成了一个功能模块后即着手进行该模块的测试.但殊途同归,要保证软件系统的质量,首先就要保证构成系统的单元的质量,这些单元可能是一个对象.类和函数,也可能是更大的单元--组件或模块. (1)为什么要进行单元测试: 软件中存在的错误发现得越早,则修改和维护的费用就越低,而且难度越小,单元测试是早期抓住这些错误的最好时机. (2)定义: 单元测试是对软件基本组

Java-第十四章-代参的方法(二)-编程实现,输入班里10名学生的身高,获得身高最高的学生要求对象数组类型方法

package com.ww.yzpA; public class Students { int No; int Height; } package com.ww.yzpA; public class Height { public Students getMaxHeigth(Students[] str) { Students A = new Students(); for (int i = 0; i < str.length; i++) { if (str[i].Height > A.He