白盒测试
白盒测试概述
白盒测试又称透明盒测试,逻辑驱动测试
是测试被测单元内部如何工作的一种测试方法
允许测试人员根据程序内部逻辑结构及有关信息来设计和选择测试用例,对程序的逻辑结构进行测试
可覆盖全部代码、分支、条件和路径
目的:
保证程序中所有关键路径的测试,防止由于没有执行的路径在实际投入运行后执行到发生意外的情况
衡量测试完整性
程序内部所有的逻辑值真、假两个分支的覆盖
检查内存泄露
异常处理的分枝语句的执行
解决实验条件下很难搭建真实环境的问题
检查代码符合一定的编码规范,减少由于编码不规范而引入错误白盒测试和黑盒测试比较
联系:白盒测试和黑盒测试都是软件测试的一个方面;两者有时结合起来同时进行测试,称为“灰盒测试”。
区别:白盒,需要源代码;无法检测程序外部特性,无法测试遗漏需求;关心程序内部结构、逻辑以及代码的可维护性;编码、集成测试阶段进行。
黑盒,不需要源代码,需要可执行文件;从用户角度出发进行测试;关心程序的外在功能和非功能表现;确认测试、系统测试阶段进行。
白盒测试的策略
桌前检查
开发人员的自我检查
在指定功能实现后,单元测试前,对代码进行初步检查
重点是代码对编码规范的符合性
单元测试(UNTI TESTING)
单元:函数、过程、类
在桌前检查后进行,大部分由开发人员完成
主要测试功能,并覆盖程序中的语句和分析等达到逻辑覆盖准则。
代码评审(代码审查code review):源代码的同行评审编码初期或编码过程中有同行参与的一个代码评审活动
重点是代码风格的一致性和对编码规范的遵守程度
可以帮助发现问题,拓展开发人员思路
依据《代码检查单》进行
同行评审(Peer Review)
来源CMM
检查工作产品是否满足了以往工作产品中建立的规范
识别工作产品相对于标准的偏差,包括可能影响软件可维护性的问题
向创建者提出改进意见
促进参与者之间技术交流和学习
代码走查(Walk Through)
由专门的代码走查小组或测试组进行
需要开发人员提交有关的资料文档和源代码,并进行必要的讲解
静态分析(static analyse)
测试小组进行
辅助工具支持
对源代码进行质量评估
生成静态分析报告、代码质量报告
正式审查
坚持标准和规范的原因:可靠性、可读性、可维护性、可
移植性
代码审查单
输入/输出错误数据声明错误、计算错误、数据引用错误、函数参数错误、比较错误、控制流程错误、其他检查
白盒测试对测试人员的要求
了解软件语言
了解软件开发技术
有开发经验最好
掌握白盒测试工具
掌握白盒测试用力设计方法
掌握开发人员编程中容易出现的问题,不断积累经验
代码质量对软件质量的贡献
代码是软件产品中的重要部分
代码质量反映软件质量
其他非代码因素也起着关键作用
文档(设计、帮助、用户手册)
制约程序员编写高质量代码的因素
对需求和设计的理解不透澈
对软件业务流程不熟悉
没有开发经验
对开发工具或开发语言不熟悉
受情绪因素的影响等因素
管理机制不健全
静态白盒测试:检查设计和代码
静态测试是指测试非运行部分——检查和审查,白盒测试是指访问代码,能够查看和审查
静态白盒测试是指在不执行软件的条件下有条理的仔细审查软件设计、体系结构和代码,从而找出软件缺陷的过程,有时候成为结构化分析。
进行静态白盒测试的目的:尽早发现软件缺陷,以找出动态黑盒测试难以发现或隔离的软件缺陷,另一个好处是给黑盒测试人员提供
思路。
正式审查(formal review)就是进行静态白盒测试的过程4个基本要素:确定问题、遵守规则、准备、编写报告
编码的规范和标准
可靠性,可读性/可维护性,移植性
代码检查单
用于把代码与标准或规范进行对照补充,并确保代码符合项目的设计要求。
代码检查比动态测试更有效率,能快速找到缺陷,发现30%~70%的逻辑设计错误和编码缺陷
动态白盒测试
由于是动态的,就一定是测试运行中的程序,由于是白盒就一定要检查代码并观察运行状况。生成测试数据、分析测试结果的工作量大,开展测试费时费力费人。
逻辑覆盖方法:以程序内部逻辑结构为基础,有以下6种:
1.语句覆盖
基本思想:设计若干测试用例,运行被测程序,使程序中每个
判定表达式
缺点:由于这种测试方法仅仅针对程序逻辑中显示存在的与句,但对隐藏的条件是无法测试的,是最弱的逻辑覆盖。
2.判定覆盖
基本思想:设计所干测试用例,运行被测程序,使得程序中
和取假分支至少执行一次。
句覆盖一样的简单性,无须细分每个判定就可以得到测试用例缺点:大部分的判定语句是由多个逻辑条件组合而成,若仅仅判断其整个最终结果而忽略每个条件的取值情况必然会遗漏部分
测试路径,也是比较弱的逻辑覆盖。
3.条件覆盖
在在实际程序代码中,一个判定中通常都包含若干条件,条件覆盖的目的是设计若干测试用例,在执行被测程序后,要使每个判定中每个条件的可能值至少满足一次。
所有条件的真假都要覆盖到,不考虑组合
优点:增加了对条件判定情况的测试,增加了测试路径
缺点:条件覆盖不一定包含判定覆盖,条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果
4.判定——条件覆盖
实际上是将判定覆盖和条件覆盖结合起来的一种方法,使得判定中每个条件的所有可能取值至少满足一次,同是每个判定的可能结果也至少出现一次。
基本思想:设计足够的测试用例,使得判定条件中的所有条件的所有情况至少执行一次取值,同时所有判定的所有情况的取值至少执行一次。
优点:能同时满足判定、条件两种覆盖标注
缺点:从表面上判定-条件覆盖测试了各个判定中的所有条件的取值。实际上,编译器在检查含有多个条件的逻辑表达式时,某些情况下的某些条件将会被其他条件所掩盖,因此判定——条件覆盖也不一定能够完全查出逻辑表达式中的错误。未考虑条件组合。
5.条件组合覆盖
基本思想:设计足够的测试用例,使得所有可能的条件取值组
—条件覆盖
缺点:线性的增加了测试用例数量
6.路径覆盖
基本思想:设计所有的测试用例,来覆盖程序中的所有可能的
缺点:需要设计大量、复杂的测试用例,使得工作量呈指数级增长,而且不见得把所有的条件组合都覆盖。
基本路径测试,在程序控制流程的基础上,分析控制构造的环路复杂性,到处基本可执行路径集合,从而设计测试用例
逻辑覆盖总结
根据覆盖目标的不同可分为以上6种覆盖方法
语句覆盖:选择足够多的测试用例,使得程序中的每个可执行语句至少一次。
判定覆盖:通过执行足够的测试用例,使得程序中的每个判定可能取值(真/假)都至少满足一次,也称为“分支覆盖”。
条件覆盖:设计足够多的用例,使得程序中每个判定包含的每个条件都肯呢个取值(真/假)都至少满足一次。
判定/条件覆盖:设计足够多的用例,使程序中每个判定包含的每个条件的所有情况至少出现一次,并且每个判定本身的判定结果(真/假)也都至少满足一次。
组合覆盖:使得程序中每个判定的所有可能的条件取值组合都至少出现一次。
路径覆盖:要求覆盖程序中所有可能的路径。
组合覆盖(强)
判断——条件覆盖
判断覆盖条件覆盖
语句覆盖(最弱)
发现错误能力标准含义
1 弱语句覆盖每条语句至少执行一次
2 判定覆盖每一判定的每个分支至少执行一次
3 条件覆盖每一判定中的每个条件,分别按T、
F至少个执行一次
4 判定-条件覆盖同时满足判定覆盖和条件覆盖的要
求
5强条件组合覆盖求出判定中所有条件的各种可能组
合值,每一可能的条件组合至少执行
一次
逻辑覆盖法实力演练
V oid do work(int x,int y, int z)
{
Int k=0,J=0;
If ((x>3)&&*(z>10))
{ k=x*y-1;
J=sqrt(k);
}
If((x==4)||(y>5))
{J=x*y+10;
}
J=J%3
}
语句覆盖5.7.8
判定覆盖5.7.8
2.4.9
基本路径测试方法
测量覆盖准则
逻辑覆盖的出发点是合理的完善的,所谓覆盖就是想要做到全面而无遗漏,但逻辑覆盖并不能真的覆盖所有
路径测试:为了满足路径覆盖,必须首先确定具体的路径以及路径个数,通常采用控制流图
基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径计和从而设计用例,步骤如下:1.程序的控制流图:圆圈成为控制流图的一个节点,箭头称为边或连接,代表控制流,其中包含条件的节点被称为判定节点也较谓词节点,由判定节点发出的边必须终止于某一节点。由边和节点圈定的范围叫作区域,当对区域计数时,图形外的区域也应计作一个区域。
2.程序圈复杂度:从程序的环路复杂性可导出程序基本路径集合中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所
必须的测试用例数目上界
计算圈复杂度
流图中区域的数量对应于环形的复杂度
给定流图G的圈复杂度V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图节点的数量
给定流图G的圈复杂度V(G),定义V(G)=P+1,P是流图G 的判定点
导出独立路径
3.导出测试用例
4.准备测试用例
程序的控制流图:描述程序控制流的一种图示方法;圆圈称为控制流图的一个结点,表示一个或多个无分支的语句或源程序语句。
流图只有两种图形符号,一个圆圈称为结点,代表一条或多条语句
流图中的箭头称为边或链接,代表控制流
其中,包含条件的结点被称为判定结点,由判定结点发出的边必须终止于某一个结点。
由边和结点所限定的范围被称为区域
习题:
1说出静态白盒测试的几个好处
2判断是非:静态白盒测试可以找出需求遗漏之处和相关问题
3正式审查由哪些关键要素组成?
4为以下流程图所示的程序段设计一组测试用例,要求分别满足语句覆盖、判定覆盖、条件覆盖、判定——条件覆盖、组合覆盖和路径覆盖。
6按照基本路径的测试方法,设计测试用例
画流图,计算环形复杂度
导出独立路径
[试题分类]:[04]白盒测试方法/[0400][综合]白盒测试方法 1. 下面不属于白盒测试能保证的是。 A. 模块中所有独立途径至少测试一次 B. 测试所以逻辑决策真和假两个方面 C. 在所有循环的边界内部和边界上执行循环体 D. 不正确或漏掉的功能 答案:D 分数:1 题型:单选题 难度:1 2. 因果图方法是根据()之间的因果关系来设计测试用例的。 A. 输入与输岀 B. 设计与实现 C. 条件与结果 D. 主程序与子程序 答案:A 分数:1 题型:单选题 难度:1 3. 使用白盒测试方法时,确定测试数据应根据()和指定的覆盖标准 A. 程序的内部逻辑 B. 程序的复杂程度 C. 使用说明书 D. 程序的功能 答案:A 分数:1 题型:单选题 难度:1 4. 软件测试中常用的静态分析方法是()和接口分析。 A. 引用分析 B. 算法分析 C. 可靠性分析 D. 效率分析 答案:A 分数:1 题型:单选题 难度:1 5. 软件测试中常用的静态分析方法是引用分析和()。 A. 引用分析 B. 算法分析 C. 可靠性分析 D. 接口分析 答案:D 分数:1 题型:单选题 难度:1 6. 白盒方法中常用的方法是()方法。 A. 路径测试 B. 等价类 C. 因果图 D. 归纳测试
答案:A 分数:1 题型:单选题 难度:1 7. 在软件工程中,白箱测试法可用于测试程序的内部结构。此方法将程序看作是() A. 路径的集合 B. 循环的集合 C. 目标的集合 D. 地址的集合 答案:A 分数:1 题型:单选题 难度:1 8. 软件测试白箱测试是对软件的结构进行测试,下述: I.边缘值分析n.语句测试 皿.分值测试IV .路经测试 )是其应包括的内容。 A. I B. n和皿 C.皿和V D. n .皿和V 答案:D 分数:1 题型:单选题 难度:1 9. 在进行单元测试时,常用的方法是()。 A. 采用白盒测试,辅之以黑盒测试 B. 采用黑盒测试,辅之以白盒测试 C. 只适用白盒测试 D. 只适用黑盒测试 答案:A 分数:1 题型:单选题 难度:1 10. 白盒测试法一般使用于()测试。 A. 单元 B. 系统 C. 集成 D. 确认 答案:A 分数:1 题型:单选题 难度:1 [试题分类]:[04] 白盒测试方法/[0401]逻辑覆盖法 11. 关于条件测试错误的是() A. 可以检查程序中所包含的逻辑条件 B. 条件中包含的错误有布尔算子错误 C. 条件中包含的错误有布尔变量错误 D. 条件中包含的错误有接口错误 答案:D 分数:1 题型:单选题 难度:1
摘要:单元测试是软件测试的基础,本文详细的论述了单元测试的两个步骤人工静态检查法与动态执行跟踪法,所需执行的工作项目及相关的策略和方法。通过对这两个步骤的描述作者将多年的单元测试经验及测试理论注入于全文。 关键词:单元测试、人工检查、白盒测试、测试用例、跟踪调试 1 概述 单元测试是针对软件设计的最小单位——程序模块,进行正确性检验的测试工作。其目的在于发现每个程序模块内部可能存在的差错。 单元测试也是程序员的一项基本职责,程序员必须对自己所编写的代码保持认真负责的态度,这是也程序员的基本职业素质之一。同时单元测试能力也是程序员的一项基本能力,能力的高低直接影响到程序员的工作效率与软件的质量。 在编码的过程中作单元测试,其花费是最小的,而回报却特别优厚的。在编码的过程中考虑测试问题,得到的将是更优质的代码,因为在这时您对代码应该做些什么了解得最清楚。如果不这样做,而是一直等到某个模块崩溃了,到那时您可能已经忘记了代码是怎样工作的。即使是在强大的工作压力下,您也还必须重新把它弄清楚,这又要花费许多时间。进一步说,这样做出的更正往往不会那么彻底,可能更脆弱,因为您唤回的理解可能不那么完全。 通常合格的代码应该具备以下性质:正确性、清晰性、规范性、一致性、高效性等(根据优先级别排序)。 1. 正确性是指代码逻辑必须正确,能够实现预期的功能。 2. 清晰性是指代码必须简明、易懂,注释准确没有歧义。 3. 规范性是指代码必须符合企业或部门所定义的共同规范包括命名规则,代码风格等等。 4. 一致性是指代码必须在命名上(如:相同功能的变量尽量采用相同的标示符)、风格上都保持统一。 5. 高效性是指代码不但要满足以上性质,而且需要尽可能降低代码的执行时间。 2 单元测试步骤 在代码编写完成后的单元测试工作主要分为两个步骤人工静态检查和动态执行跟踪。 人工静态检查是测试的第一步,这个阶段工作主要是保证代码算法的逻辑正确性(尽量通过人工检查发现代码的逻辑错误)、清晰性、规范性、一致性、算法高效性。并尽可能的发现程序中没有发现的错误。 第二步是通过设计测试用例,执行待测程序来跟踪比较实际结果与预期结果来发现错误。经验表明,使用人工静态检查法能够有效的发现30%到70%的逻辑设计和编码错误。但是代码中仍会有大量的隐性错误无法通过视觉检查发现,必须通过跟踪调试法细心分析才能够捕捉到。所以,动态跟踪调试方法也成了单元测试的重点与难点。 3 人工检查 通常在人工检查阶段必须执行以下项目的活动: 第一、检查算法的逻辑正确性;确定所编写的代码算法、数据结构定义(如:队列、堆栈等)是否实现了模块或方法所要求的功能。 第二、模块接口的正确性检查;确定形式参数个数、数据类型、顺序是否正确;确定返回值类型及返回值的正确性。 第三、输入参数有没有作正确性检查;如果没有作正确性检查,确定该参数是否的确无需做参数正确性检查,否则请添加上参数的正确性检查。经验表明,缺少参数正确性检查的代码是造成软件系统不稳定的主要原因之一。 第四、调用其他方法接口的正确性;检查实参类型正确与否、传入的参数值正确与否、
白盒测试实验 一实验内容 1、系统地学习和理解白盒测试的基本概念、原理,掌握白盒测试的基本技术和方法; 2、举例进行白盒测试,使用语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合 覆盖、路径覆盖进行测试。 3、通过试验和应用,要逐步提高和运用白盒测试 技术解决实际测试问题的能力; 4、熟悉C++编程环境下编写、调试单元代码的基本操作技术和方法; 5、完成实验并认真书写实验报告(要求给出完整的测试信息,如测试程序、测试用例, 测试报告等) 二实验原理 白盒测试原理:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部成分是否已经过检查。它是把测试对象看作装在一个透明的白盒子里,也就是完全了解程序的结构和处理过程。这种方法按照程序内部的逻辑测试程序,检验程序中的每条通路是否都能按预定要求正确工作。其又称为结构测试。 对于该实验的例子给出其流程图如下图所示,我们来了解白盒测试的基本技术和方法。
语句覆盖是指选择足够的测试用例,使得程序中每个语句至少执行一次。如上例选择测试用例x=1,y=1和x=1,y=-1可覆盖所有语句。 判定覆盖是指选择足够的测试用例,使得程序中每一个判定至少获得一次“真”值和“假”值,从而使得程序的每个分支都通过一次(不是所有的逻辑路径)。选择测试用例x=1,y=1和x=1,y=-1可覆盖所有判定。 条件覆盖是指选择语句多数的测试用例,使得程序判定中的每个条件能获得各种不同的结果。选择测试用例x=1,y=1和x=-1,y=-1可覆盖所有条件。 判定/条件覆盖是指选择足够多的测试用例,使得程序判定中每个条件取得条件可能的值,并使每个判定取到各种可能的结果(每个分支都通过一次)。即满足条件覆盖,又满足判定覆盖。选择测试用例x=1,y=1和x=-1,y=-1可覆盖所有判定/条件。 条件组合覆盖是指选择足够的测试用例,使得每个判定中的条件的各种可能组合都至少出现一次(以判定为单位找条件组合)。 注:a,条件组合只针对同一个判断语句存在多个条件的情况,让这些条件的取值进行笛卡尔乘积组合。 b,不同的判断语句内的条件取值之间无需组合。 c,对于但条件的判断语句,只需要满足自己的所有取值即可。 选择测试用例x=1,y=1;x=1,y=-1,x=-1,y=1和x=-1,y=-1可覆盖所有条件组合。 路径覆盖是分析软件过程流的通用工具,有助分离逻辑路径,进行逻辑覆盖的测试,所用的流程图就是讨论软件结构复杂度时所用的流程图。 三实验方法 1、语句覆盖 测试用例输入输出magic 判定M的取值判定N的取值覆盖路径 x=1,y=1 12 T F abef x=1,y=-1 0 F T acdf 2、判定覆盖 测试用例输入输出magic 判定M的取值判定N的取值覆盖路径 x=1,y=1 12 T F abef x=1,y=-1 0 F T acdf 3、条件覆盖 测试用例输入输出magic 判定M的取值判定N的取值覆盖路径 x=1,y=1 12 T F abef x=-1,y=-1 0 T T acdf 4、判定/条件覆盖 测试用例输入输出magic 判定M的取值判定N的取值覆盖路径 x=1,y=1 12 T F abef x=-1,y=-1 0 T T acdf
[试题分类]: [04]白盒测试方法/[0400][综合]白盒测试方法 1. 下面不属于白盒测试能保证的是。 A.模块中所有独立途径至少测试一次 B.测试所以逻辑决策真和假两个方面 C.在所有循环的边界内部和边界上执行循环体 D.不正确或漏掉的功能 答案:D 分数:1 题型:单选题 难度:1 2.因果图方法是根据()之间的因果关系来设计测试用例的。 A.输入与输出 B.设计与实现 C.条件与结果 D.主程序与子程序 答案:A 分数:1 题型:单选题 难度:1 3.使用白盒测试方法时,确定测试数据应根据()和指定的覆盖标准。 A.程序的内部逻辑 B.程序的复杂程度 C.使用说明书 D.程序的功能 答案:A 分数:1 题型:单选题 难度:1 4.软件测试中常用的静态分析方法是()和接口分析。 A.引用分析 B.算法分析 C.可靠性分析 D.效率分析 答案:A 分数:1 题型:单选题 难度:1 5.软件测试中常用的静态分析方法是引用分析和()。 A.引用分析 B.算法分析 C.可靠性分析 D.接口分析 答案:D 分数:1 题型:单选题 难度:1 6.白盒方法中常用的方法是()方法。 A.路径测试 B.等价类 C.因果图 D.归纳测试 答案:A 分数:1 题型:单选题
7.在软件工程中,白箱测试法可用于测试程序的内部结构。此方法将程序看作是() A.路径的集合 B.循环的集合 C.目标的集合 D.地址的集合 答案:A 分数:1 题型:单选题 难度:1 8.软件测试白箱测试是对软件的结构进行测试,下述: Ⅰ.边缘值分析Ⅱ.语句测试 Ⅲ.分值测试Ⅳ.路经测试 ()是其应包括的内容。 A.Ⅰ B.Ⅱ和Ⅲ C.Ⅲ和Ⅳ D.Ⅱ.Ⅲ和Ⅳ 答案:D 分数:1 题型:单选题 难度:1 9.在进行单元测试时,常用的方法是()。 A.采用白盒测试,辅之以黑盒测试 B.采用黑盒测试,辅之以白盒测试 C.只适用白盒测试 D.只适用黑盒测试 答案:A 分数:1 题型:单选题 难度:1 10.白盒测试法一般使用于()测试。 A.单元 B.系统 C.集成 D.确认 答案:A 分数:1 题型:单选题 难度:1 [试题分类]: [04]白盒测试方法/[0401]逻辑覆盖法 11.关于条件测试错误的是() A.可以检查程序中所包含的逻辑条件 B.条件中包含的错误有布尔算子错误 C.条件中包含的错误有布尔变量错误 D.条件中包含的错误有接口错误 答案:D 分数:1 题型:单选题 难度:1 12.关于条件中包含的错误类型说法错误的是() A.关系算子错误 B.算术表达式错误 C.条件中包含的错误有布尔变量错误 D.条件中包含的错误有接口错误
1白盒测试用例设计方法 1.1白盒测试简介 白盒测试又称结构测试、逻辑驱动测试或基于程序的测试,一般多发生在单元测试阶段。白盒测试方法主要包括逻辑覆盖法,基本路径法,程序插装等。 这里重点介绍一下常用的基本路径法,对于逻辑覆盖简单介绍一下覆盖准则。 1.2基本路径法 在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出独立路径集合,从而设计测试用例,设计出的测试用例要保证在测试中程序的每一个可执行语句至少执行一次。 在介绍基本路径测试方法(又称独立路径测试)之前,先介绍流图符号: 图1 如图1所示,每一个圆,称为流图的节点,代表一个或多个语句,流程图中的处理方框序列和菱形决策框可映射为一个节点,流图中的箭头,称为边或连接,代表控制流,类似于流程图中的箭头。一条边必须终止于一个节点,即使该节点并不代表任何语句,例如,图2中两个处理方框交汇处是一个节点,边和节点限定的范围称为区域。 图2
任何过程设计表示法都可被翻译成流图,下面显示了一段流程图以及相应的流图。 注意,程序设计中遇到复合条件时(逻辑or, and, nor 等),生成的流图变得更为复杂,如(c)流图所示。此时必须为语句IF a OR b 中的每一个a 和b 创建一个独立的节点。
(c)流图 独立路径是指程序中至少引进一个新的处理语句集合,采用流图的术语,即独立路径必须至少包含一条在定义路径之前不曾用到的边。例如图(b)中所示流图的一个独立路径集合为: 路径1:1-11 路径2:1-2-3-4-5-10-1-11 路径3:1-2-3-6-8-9-10-1-11 路径4:1-2-3-6-7-9-10-1-11 上面定义的路径1,2,3 和4 包含了(b)流图的一个基本集,如果能将测试设计为强迫运行这些路径,那么程序中的每一条语句将至少被执行一次,每一个条件执行时都将分别取true 和false(分支覆盖)。应该注意到基本集并不唯一,实际上,给定的过程设计可派生出任意数量的不同基本集。如何才能知道需要寻找多少条路径呢?可以通过如下三种方法之一来计算独立路径的上界: 1. V=E-N+2,E 是流图中边的数量,N 是流图节点数量。 2. V=P+1,P 是流图中判定节点的数量 3. V=R,R 是流图中区域的数量 例如,(b)流图可以采用上述任意一种算法来计算独立路径的数量 1. V=11 条边-9 个节点+2=4 2. V=3 个判定节点+1=4 3. 流图有4 个区域,所以V=4 由此为了覆盖所有程序语句,必须设计至少4 个测试用例使程序运行于这4 条路径。 在采用基本路径测试方法中,获取测试用例可参考以下方式:
实验二白盒测试 一、实验目的 1、掌握白盒测试的基本方法; 2、掌握白盒测试用例的编写。 二、实验要求 1、根据给出的程序分别使用语句覆盖、判定覆盖(也称为分支覆盖)、条件覆盖、判定-条件覆盖、条件组合测试、路径测试设计测试用例。 2、输入数据进行测试,填写测试用例。 三、实验内容 1、用C++或者Java编写一个类,完成下面函数的功能,并编写另外一个类,调用该方法:void DoWork(int x,int y,int z) { int k=0,j=0; if((x>3)&&(z<10)) { k=x*y-1; //语句块1 j=sqrt(k); } if((x= =4)||(y>5)) { j=x*y+10; //语句块2 } j=j%3; //语句块3 } 要求: (1)画出上面函数的流程图。
(2)分别使用语句覆盖、判定覆盖(也称为分支覆盖)、条件覆盖、判定-条件覆盖、条 件组合测试、路径测试设计测试用例(注意测试用例的格式)。 语句覆盖: 用例:x=4,y=6,z=8 判定覆盖: 用例1:x = 4 , y = 6 , z = 8 用例2:x = 3 , y = 5 , z = 8 条件覆盖: 用例1:x=3,y=8,z=8 用例2:x=4,y=5,z=13 判定-条件覆盖: 用例1:x=4,y=8,z=8 用例2:x=3,y=5,z=13 条件组合测试 用例1:x=4,y=8,z=8 用例2:x=4,y=3,z=13
用例3:x=2,y=8,z=8 用例4:x=2,y=3,z=13 路径测试: 用例1:x=4,y=8,z=8 用例2:x=4,y=3,z=13 用例3:x=6,y=2,z=8 用例4:x=2,y=3,z=13 (3)执行每个测试用例,执行完毕后填写测试用例。 2、用C++或者Java编写“计算被输入日期是星期几,例如公元1年1月1日是星期一,只要输入年月日,能自动回复当天是星期几。”测试用例; 程序说明: A程序思路:计算输入日期与公元1年1月1日所相差的天数,具体如下:总天数=公元1年到输入日期上一年年底天数+输入年份的1月到上月月底天数+输入日期的天数; B闰年满足条件(year%4==0)&&(year%100!=0)||(year%400==0)。 要求: (1)分析各种输入情况,结合程序输出结果,并给出详细测试用例; (2)根据(1)所划分的等价类,进行边界值分析,并给出具体的测试用例; (3)决策表测试法; ①列出输入变量month、 day、 year的有效等价类;(条件桩) ②分析程序的规格说明,给出问题规定的可能采取操作;(动作桩) ③画出决策表(简化); ④根据决策表,给出详细测试用例。 代码: #include 一、白盒测试概念 1、定义 白盒测试又称结构测试、透明盒测试、逻辑驱动测试、基于代码的测试。盒子指被测试的软件,白盒指盒子是可视的。白盒测试是一种测试用例设计方法,测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例。白盒测试主要针对被测程序的源代码,主要用于软件验证,不考虑软件的功能实现,只验证内部动作是否按照设计说明书的规定进行。 2、目的 我们一方面注重软件功能需求的实现,另一方面还要注重程序逻辑细节,主要是因为软件自身的缺陷,具体如下: 1)逻辑错误和不正确假设与一条程序路径被运行的可能性成反比。日常处理往往被很好地了解,而“特殊情况”的处理则难于发现。 2)我们经常相信某逻辑路径不可能被执行,而事实上,它可能在正常的基础上被执行。程序的逻辑流有时是违反直觉的,只有路径测试才能发现这些错误。 3)代码中的笔误是随机且无法杜绝的。笔误出现在主流上和不明显的逻辑路径上的机率是一样的。很多被语法检查机制发现,但是其他的会在测试开始时才会被发现。 4)功能测试本身的局限性。如果程序实现了没有被描述的行为,功能测试是无法发现的,例如病毒,而白盒测试很容易发现它。 3、目标 采用白盒测试必须遵循以下几条原则,才能达到测试的目标: 1)保证一个模块中的所有独立路径至少被测试一次。 2)所有逻辑值均需测试真(true) 和假(false)两种情况。 3)检查程序的内部数据结构,保证其结构的有效性。 4)在上下边界及可操作范围内运行所有循环。 4、黑白灰区别 黑盒测试技术:也称功能测试或数据驱动测试,只关注规格说明中的功能,测试者在程序接口对软件界面和软件功能进行测试,它只检查实现了的功能是否按照“用户需求说明书”的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。主要用于软件确认测试,结合兼容、性能测试等方面,但黑盒测试不能保证已经实现的各个部分都被测试到。黑盒测试适用于各阶段测试。 白盒测试技术:只关注软件产品的测试,深入到代码一级的测试,它是知道产品内部结构,通过测试来检测产品内部动作是否按照“设计规格说明书”的规定正常进行,按照程 [试题分类]:[04]白盒测试方法/[0400][综合]白盒测试方法 1.下面不属于白盒测试能保证的是。 A. 模块中所有独立途径至少测试一次 B. 测试所以逻辑决策真和假两个方面 C. 在所有循环的边界内部和边界上执行循环体 D. 不正确或漏掉的功能 答案:D 分数:1 题型:单选题 难度:1 A. 输入与输岀 B. 设计与实现 C. 条件与结果 D. 主程序与子程序 答案:A 分数:1 题型:单选题 难度:1 A. 程序的内部逻辑 B. 程序的复杂程度 C. 使用说明书 D. 程序的功能 答案:A 分数:1 题型:单选题 难度:1 A. 引用分析 B. 算法分析 C. 可靠性分析 D. 效率分析 答案:A 4.软件测试中常用的静态分析方法是( )和接口分析。 2.因果图方法是根据( )之间的因果关系来设计测试用例的。 3.使用白盒测试方法时,确定测试数据应根据( )和指定的覆盖标准。 分数:1 题型:单选题 难度:1 A. 引用分析 B. 算法分析 C. 可靠性分析 D. 接口分析 答案:D 分数:1 题型:单选题 难度:1 A. 路径测试 B. 等价类 C. 因果图 D. 归纳测试 答案:A 分数:1 题型:单选题 难度:1 7.在软件工程中,白箱测试法可用于测试程序的内部结构。此方法将程序看作是( A. 路径的集合 B. 循环的集合 C. 目标的集合 D. 地址的集合 答案:A 分数:1 题型:单选题 难度:1 8.软件测试白箱测试是对软件的结构进行测试,下述: m.分值测试 ( )是其应包括的内容。 A. I 5.软件测试中常用的静态分析方法是引用分析和( )。 6.白盒方法中常用的方法是( )方法。 I .边缘值分析 n.语句测试 IV .路经测试 1、在白盒测试用例设计中,有语句覆盖、分支覆盖、条件覆盖、路径覆盖等,其中( A )是最强的覆盖准则。为了对如下图所示的程序段进行覆盖测试,必须适当地选取测试用例组。若x, y是两个变量,可供选择的测试用例组共有Ⅰ、Ⅱ、Ⅲ、Ⅳ四组,如表中给出,则实现判定覆盖至少应采取的测试用例组是( B )或( C );实现条件覆盖至少应采取的测试用例组是( D );实现路径覆盖至少应采取的测试用例组是( E )或( F )。 供选择的答案 A: ① 语句覆盖② 条件覆盖③ 判定覆盖④ 路径覆盖 B~F: ① Ⅰ和Ⅱ组② Ⅱ和Ⅲ组③ Ⅲ和Ⅳ组④ Ⅰ和Ⅳ组 ⑤ Ⅰ、Ⅱ、Ⅲ组⑥ Ⅱ、Ⅲ、Ⅳ组⑦ Ⅰ、Ⅲ、Ⅳ组 ⑧ Ⅰ、Ⅱ、Ⅳ组 解答:A. ④ B. ⑤ C. ⑧ D. ④ E. ⑤ F. ⑧ 2. 阅读下面这段程序,使用逻辑覆盖法进行测试,请问哪一组关于(a,b,c)的输入值可以达到条件覆盖。( B ) int func(int a,b,c) { int k=1; if ( (a>0) || (b<0) || (a+c>0) ) k=k+a; else k=k+b; if (c>0) k=k+c; return k; } A. (a,b,c) = (3,6,1)、(-4,-5,7) B. (a,b,c) = (2,5,8)、(-4,-9,-5) C. (a,b,c) = (6,8,-2)、(1,5,4) D. (a,b,c) = (4,9,-2)、(-4,8,3) 3. 阅读下面这段程序,使用逻辑覆盖法进行测试,请问哪一组关于(a,b,c)的输入值可以达到判定覆盖。( D ) int func(int a,b,c) { int k=1; if ( (a>0) &&(b<0) && (a+c>0) ) k=k+a; else k=k+b; if (c>0) k=k+c; return k; } A. (a,b,c) = (3,6,1)、(-4,-5,7) B. (a,b,c) = (2,5,8)、(-4,-9,-5) C. (a,b,c) = (6,8,-2)、(1,5,4) D. (a,b,c) = (4,-9,-2)、(-4,8,3) 4. 阅读下面这段程序,使用逻辑覆盖法进行测试,请问哪一组关于(a,b,c)的输入值可以达到判定条件覆盖。( B ) int func(int a,b,c) { int k=1; if ( (a>0) || (b<0) || (a+c>0) ) k=k+a; else k=k+b; if (c>0) k=k+c; return k; } A. (a,b,c) = (3,6,1)、(-4,-5,7) B. (a,b,c) = (2,-5,8)、(-4,9,-5) C. (a,b,c) = (6,8,-2)、(1,5,4) D. (a,b,c) = (4,9,-2)、(-4,8,3) 5、下面是一段求最大值的程序,其中datalist是数据表,n是datalist的长度。 int GetMax(int n, int datalist[ ]) { int k=0; for ( int j=1; j 实验1-白盒测试实验报告 第一章白盒测试 实验1 语句覆盖 【实验目的】 1、掌握测试用例的设计要素和关键组成部 分。 2、掌握语句覆盖标准,应用语句覆盖设计测 试用例。 3、掌握语句覆盖测试的优点和缺点。 【实验原理】 设计足够多的测试用例,使得程序中的每个语句至少执行一次。 【实验内容】 根据下面提供的程序,设计满足语句覆盖的测试用例。 1、程序1源代码如下所示: #include { int b; int c; int a; if(a*b*c!=0&&(a+b>c&&b+c>a&&a+c>b)) { if(a==b&&b==c) { cout<<"您输入的是等边三角形!"; } else if((a+b>c&&a==b)||(b+c>a&&b==c)||(a+c> b&&a==c)) { cout<<"您输入的是等腰三角形!"; } else if((a*a+b*b==c*c)||(b*b+c*c==a*a)||(a* a+c*c==b*b)) { cout<<您输入的是直角三角形"; } else { cout <<”普通三角形”; } } else { cout<<"您输入的不能构成一个三角形!"; } } 输入数据预期输出 A=6,b=7,c=8普通三角形 A=3,b=4,c=5直角三角形 A=4,b=2,c=4等腰三角形 A=1,b=1,c=1等边三角形 A=20,b=10,c=1非三角形 2、程序2源代码如下所示: void DoWork(int x,int y,int z) {白盒测试方法
白盒测试方法习题及答案
白盒测试练习及答案
实验1-白盒测试实验报告
白盒测试实例