收藏 分享(赏)

软件工程概论sw7-2-白盒测试.ppt

上传人:dzzj200808 文档编号:3361243 上传时间:2018-10-18 格式:PPT 页数:118 大小:1.71MB
下载 相关 举报
软件工程概论sw7-2-白盒测试.ppt_第1页
第1页 / 共118页
软件工程概论sw7-2-白盒测试.ppt_第2页
第2页 / 共118页
软件工程概论sw7-2-白盒测试.ppt_第3页
第3页 / 共118页
软件工程概论sw7-2-白盒测试.ppt_第4页
第4页 / 共118页
软件工程概论sw7-2-白盒测试.ppt_第5页
第5页 / 共118页
点击查看更多>>
资源描述

1、软件白盒测试,概览,在本章中,我们将学习:结构性白盒测试概述 程序结构分析 逻辑覆盖 结构性测试案例,课程目录,结构测试概述 程序结构分析 逻辑覆盖 结构测试案例分析 结构测试工具,结构性测试(1),程序实现是已知的,是测试人员能够根据功能实际实现的方式来标识测试用例,又称“白盒测试”、“透明盒测试”。,结构性测试(2),规格说明,规格说明,程序,程序,测试用例 (方法A),测试用例 (方法B),方法A覆盖的区域比方法B覆盖的区域大,但两种方法的覆盖区域只能在程序实现部分,有两种维恩图来表示功能性测试:,功能性测试与结构性测试比较,单独使用都有其局限性; 最好的方法:结合两种方法。,结构测试定

2、义,把测试对象看做一个透明的盒子 白盒测试是根据被测程序的内部结构设计测试用例并完成测试的一种测试方法 白盒测试或逻辑驱动测试 基于一个应用代码的内部逻辑知识,测试覆盖全部代码、分支、路径和条件,结构测试特点,可以构成测试数据使特定程序部分得到测试 有一定的充分性度量手段 可获得较多工具支持 通常只用于单元测试,结构测试的方法,静态测试方法: 程序结构分析 代码走查 代码审查 控制流分析 数据流分析 信息流分析,动态测试方法: 逻辑覆盖 语句覆盖 分支覆盖 条件覆盖 分支-条件覆盖 路径覆盖,代码覆盖率,采用白盒法进行测试时,考虑的是测试用例对程序内部逻辑的覆盖程度 最彻底的白盒法是覆盖程序中

3、的每一条路径,但这往往无法实现 采用其它一些标准来量度覆盖的程度,并希望覆盖程度尽可能高些,课程目录,结构测试概述 程序结构分析 逻辑覆盖 结构测试案例分析 结构测试工具使用,静态测试,静态测试包括代码审查和代码走查,此方法是软件测试的有效手段,静态测试技术特点,是指无须执行被测代码,而是借助专用的软件测试工具评审软件文档或程序,度量程序静态复杂度,检查软件是否符合编程标准,借以发现编写的程序的不足之处,减少错误出现的概率。静态测试在主机上完成,不需目标系统支持,测试的主要内容有编程标准验证、数据流分析技术、质量度量信息、代码结构可视化显示、测试外壳的创建。由此看出,静态测试只是对代码进行扫描

4、分析,检测它的语法规则复杂度等是否符合要求,主要是为软件的质量保证提供依据,以提高软件的可靠性和易维护性 静态测试可以手工、自动;,静态测试技术特点,静态测试不必动态地执行程序,也就不必要进行测试用例设计和结果判读等工作; 静态测试可以由人工进行,充分发挥人的逻辑思维优势。 静态测试试是不需要特别条件,容易开展。,桌面检查,桌面检查由程序员阅读自己所编的程序。 存在一下问题: 心理上的原因,没有发现错误的欲望; 人存在思维定势; 如果对功能理解错误,不容易纠正; 相当于调试程序。,代码走查与代码审查,Code Inspection & Walkthrough: 是由若干程序员与测试员组成一个小

5、组,集体阅读并讨论程序或者用“脑”执行并检查程序的过程。 分两步走: 预先做准备工作; 举行会议并讨论;,代码走查与代码审查的优点,避免了桌面检查的问题; 一旦发现错误,就可以定位错误的位置和性质,调试所需要化的代价低; 一次能够揭示一批错误,而不是一个错误; 避免了动态调试的一些问题;,代码走查与代码审查的优势,能够有效地发现30%70%的逻辑设计和编码错误; IBM统计使用代码审查的方法,错误的检测效率高达全部查处错误的80% Myers的研究发现代码审查和代码走查平均查处全部错误的38%。 研究表明:使用代码走查与代码审查发现某类错误比用计算机测试更有效,而对另一类错误情况正好相反。 代

6、码走查与代码审查与计算机测试是相互补充的,缺少任何一种方法都会使错误的检测率损失。,代码审查,代码审查测试内容包括: 检查代码和设计的一致性; 检查代码对标准的遵循、可读性; 检查代码的逻辑表达的正确性; 检查代码结构的合理性; 代码审查是由一组程序和错误检查技术组成,并且以代码审查组的方式进行。,代码审查组,代码审查组由4个人组成,1个组长,组长的条件: 称职的程序员;但不是被测程序的编写者; 不需要对所检查的程序很熟悉; 要有较强的组织协调能力和语言能力; 组长的职责: 分配资料; 安排计划; 主持会议; 纪录并保存被发现的错误;,代码审查组,其余成员: 资深的程序员 程序编写者; 专职测

7、试人员;,代码审查过程,准备: 组长将程序目录和设计说明书分发给小组成员。 成员熟悉材料; 被测试程序的设计和编码人员想审查组详细说明所准备的材料;特别是代码的功能和功能间的关系; 程序阅读: 审查组人员仔细阅读代码和相关资料,对照代码审查单标出明显的缺陷及错误。,代码审查过程,跟踪及报告: 会后将发现的错误登记报表并交给程序开发人员; 如果发现错误较多或发现重大错误,在改正后,组长要再次组织审查会议; 审查会议要限制在1.5小时2小时以内。 审查过程所需要的主要技术是代码审查单,通常将程序设计及编码中可能发生的各类错误分类,对没一类尽可能多地列举出典型错误。发现新的错误及时补充道代码审查表中

8、。,代码审查单的示例,数据引用错误 是否引用了未赋值或未初始化的变量? 所有的数组引用,其下标值是否在各自的相应的维数定义界内? 所有的数组引用,下标是否整数值? 所有引用的指针或变量是否已经分配了内存? 在检索操作或用下标引用数组时,是否存在“差1”错误?,代码审查单的示例,数据说明错误 所有变量是否都显式地说明了? 是否每个变量都赋与正常的长度、类型和存储分类? 变量的初始化和她的存储类是否无矛盾? 计算错误: 是否使用过非一致数据类型的变量进行运算? 是否存在混合运算? 赋值语句的目标变量是否比其右边的表达式小?,代码审查单的示例,代码审查还包括编程风格、标准、规范的符合性方面的内容。

9、在错误登记表中应标明所查处的错误类型、错误类别、错误的严重程度、错误的原因等。,Myers将错误分为8类: 数据引用错误; 数据说明错误; 计算错误; 比较错误; 控制流错误; 界面错误; 输入/输出错误; 其他错误;,有效地阅读程序,仔细阅读需求、设计等文档,了解软件的整体物理意义、应用背景、在大系统中的地位。 阅读结构化代码: 追踪通过每个子程序的主要逻辑行,然后开始跟踪第二条路径,相当于深度优先; 按排列顺序跟踪代码,相当于广度优先;,代码走查,代码走查就是在项目实施的过程中,在每一个模块单元编程结束,程序员对自己编写的代码测试完毕后,由另外一位程序员(一般情况下为同一项目组)对该程序员

10、的代码和运行程序进行代码走查和运行功能的检查。,代码走查的目的,规范代码的编写; 提高代码的稳定性与效率; 增进其他程序员对本模块的了解; 提高程序员的编程水平;,检查内容,程序代码是否符合公司和项目组的编程规范,程序的注释是否便于理解,命名是否清晰、合理、明确; 运行代码如果有界面,其界面规格是否符合项目组制定的统一界面风格; 对用户的提示信息是否简单,清晰,准确; 代码走查人员必须能够看懂代码及代码编写人的思路。,程序所判断的路径是不是永远也走不到的路径; 循环中的死循环; 需要预先预留空间的数据容器 (如:一般的数组在初始化时就已经分配了足够的空间,即使用不了,它所占用的空间也不能用做它

11、用); 一些需要关闭的对象 (如:文件处理中的流,数据库处理中的连接); 对象编程中的类,方法和变量的保护属性 (public, protected, private); 程序中的无用代码最好删除;,进入系统实现阶段,A,A,代码走查步骤,本模块编写人在本模块的功能测试完成并优化代码后,向项目经理提供本模块所涉及到的所有代码的清单, 填写代码走查申请单,并向项目经理申请做本模块的代码走查; 项目经理指派人员进行某模块的代码走查,走查过程中遇到问题时应该和编写人协商解决,走查结束后,代码走查人员应进一步对本模块进行功能测试,完成后提交项目经理并说明走查的情况,填写代码走查报告单; 项目经理对代码

12、走查和模块功能做20%的抽查; 提交单元测试报告,向测试组申请功能测试或系统测试。,代码走查报告单,项目名称:XXXXXX 模块名称:XXXXXX 走查人:XXX 提交日期:XXXXXX代码列表: 编号:应该和“代码走查申请单”中的对应部分的编号相一致; 走查项的通过可以用打勾来表示,如果有未通过项则需说明原因 走查项说明: 项1-代码是否符合编码规范 项2-代码是否符合项目规定的界面风格 项3-代码中出现的提示信息是否明了 项4-走查人是否清楚编写人的思路 项5-此部分代码测试运行是否通过,代码走查报告单,控制流分析,非结构化程序会给测试、排错、和程序的维护带来许多困难 要求写出的程序结构良

13、好 检查程序的控制结构成为十分有意义的工作,程序流程图,1,3,2,5,控制流图,1,2,4,3,5,a,b,c,d,e,f,控制流图,节点 标有编号的圆圈 程序流程图中矩形框所表示的处理 菱形表示的两个甚至多个出口判断 多条流线相交的汇合点,控制流图,控制流线或弧 箭头 与程序流程图中的流线一致,表明了控制的顺序 控制流线通常标有名字,控制流图矩阵,1,2,3,4,5,1,2,3,4,5,控制流图矩阵,便于机器表示和处理控制流图 连接弧的节点的号码决定了矩阵中元素的位置 注意控制流的方向(行-列) 两个节点没有弧线,所对应的位置也就没有元素,程序结构的基本要求,写出的程序不应包含: 转向并不

14、存在的标号 没有用的语句标号 从程序入口进入后无法达到的语句 不能达到停机语句的语句 目前对这四种情况的检测主要通过编译器和程序分析工具来实现。 可以利用控制流图分析出来,是否存在以上情况。 例如:1-2-3、4-4-5(结束),数据流分析,查找引用未定义变量等程序错误 查找对以前未曾使用的变量再次赋值等数据流异常的情况 常见的错误表现形式 错拼名字 名字混淆 语句丢失,数据流,如果程序中某一语句执行时能改变某程序变量V的值,则称V被该语句定义 如果一语句的执行引用了内存中变量V的值,则称V被该语句引用 例如: X=Y+Z;-X被定义,Y和Z被引用 if YZ then return;-Y和Z

15、被引用,控制流图与数据流表,1,2,3,4,10,6,7,5,8,9,11,Z的值被送给外部环境,例如:假定某个变量的值在使用以前被错误的改写了(对输出没有任何作用),这个语句就会被发现,信息流分析,通过对输入数据、输出数据、语句之间的关系的分析来检查程序错误 信息流分析用来分析,是否存在无用的语句。 整除算法例子 输入:in_m是被除数,in_n是除数 输出:out_q是商,out_r是余数,整除算法例子,out_q = 0; out_r = in_m; While(out_r = in_n) out_q +;out_r = out_r in_n; ,信息流关系图,in_m,in_n,1,2

16、,3,4,5,out_q,out_r,1,2,3,4,5,out_q,out_r,in_m,In_n,(1)输入变量影响语句,(2)语句影响到输出变量,(3),输入影响到输出,信息流分析,能够列出对输入变量的所有可能的引用 在程序的任何指定点检查其执行可能影响某一输出变量值的语句 输入输出关系提供一种检查,看每个输出值是否由相关的输入值,而不是其他值导出,课程目录,白盒测试概述 程序结构分析 逻辑覆盖 结构测试案例分析 结构测试工具使用,覆盖准则,测试到什么地步可以结束测试? 覆盖准则,被测小程序,if (A 1 ,被测程序段流程图,A 1 & B = 0,a,A = 2 | X 1,X =

17、X/A,F,T,b,c,X = X + 1,T,e,F,d,逻辑覆盖测试方法,语句覆盖 分支覆盖 条件覆盖 分支-条件覆盖 路径覆盖,语句覆盖,原理:如果语句中有错误,仅靠观察不执行可能发现不了 在测试时,首先设计若干个测试用例,然后运行被测程序,使程序中的每个可执行语句至少执行一次 若干个 - 尽量少 语句覆盖、程序段覆盖、程序块覆盖,语句覆盖率,语句覆盖率 已执行的可执行语句占程序中可执行语句总数的百分比 复杂的程序不可能达到语句的完全覆盖 语句覆盖率越高越好,语句覆盖测试用例,达到语句覆盖100%的测试用例(路径ace)A = 2B = 0X = 3,未达到语句覆盖100%的测试用例(路

18、径abe)A = 2B = 1X = 3,语句覆盖的优点,检查所有语句 结构简单的代码的测试效果较好 容易实现自动测试 代码覆盖率高 如果是程序块覆盖,则不涉及程序块中的源代码,语句覆盖不能检查出的错误,条件语句错误 “A 1 & B = 0” - “A 0 & B = 0” 逻辑运算(&、|)错误 “A 1 & B = 0” - “A 1 | B = 0” “ U = A2 ” - “ U = A1 ”,语句覆盖不能检查出的错误,循环语句错误 循环次数错误 跳出循环条件错误,语句覆盖不能检查出的错误,循环语句例子for(i=0;i3) statement; ,for(i=0;i3 ,语句覆盖

19、率的问题,能达到很高的语句覆盖率 语句覆盖率看似很高,却有严重缺陷if(x!=1)statements;elsestatement;,99句,1句,测试用例 x = 2 语句覆盖率99% 50%的分支没有达到,分支覆盖,设计若干测试用例,运行被测程序,使得程序中每个判断的真假分支至少经历一次 又称判定覆盖 while语句、switch语句、异常处理、跳转语句等等同样可以使用分支覆盖来测试 分支覆盖率 已取过“真”和“假”两个值的判定占程序中所有条件判定个数的百分比,分支覆盖测试用例,路径aceA=2B=0X=3路径abdA=1B=0X=1,路径acdA=3B=0X=3路径abeA=2B=1X=

20、2,或,分支覆盖的利弊,分支覆盖要比语句覆盖查错能力强一些:执行了分支覆盖,实际也就执行了语句覆盖 分支覆盖与语句覆盖存在同样的缺点 不能查出条件语句错误 不能查出逻辑运算错误 不能查出循环次数错误 不能查出循环条件错误,条件覆盖,设计若干测试用例,执行被测程序以后,要使每个判断中的每个条件的可能取值至少满足一次,条件覆盖分析,第1个判断应考虑A 1,记为T1A 1,记为T4X = 1,记为F4,条件覆盖测试用例,似乎执行了条件覆盖必然实现了分支覆盖?,条件覆盖测试用例,执行条件覆盖并不能实现分支覆盖,条件覆盖的利弊,能够检查所有的条件错误 不能实现对每个分支的检查 用例数量的增加 a & b

21、 & (c | (d & e) (a | b) & (c | d) & e,分支-条件覆盖,设计足够的测试用例,使得判断中每个条件的所有可能至少出现一次,并且每个判断本身的判定结果也至少出现一次,分支-条件覆盖分析,(1)A 1, B = 0, 记为T1, T2 (2) A 1, B != 0, 记为T1, F2 (3) A 1, 记为T3, T4 (6) A = 2, X 1, 记为F3, T4 (8) A != 2, X = 1, 记为F3, F4,分支-条件覆盖测试用例,覆盖了3条路径,漏掉了路径acd,分支-条件覆盖的利弊,既考虑了每一个条件,又考虑了每一个分支,发现错误能力强于分支覆

22、盖和条件覆盖 并不能全面覆盖所有路径 用例数量的增加,路径覆盖,设计足够多的测试用例,要求覆盖程序中所有可能的路径 路径 ace 记为L1 abd 记为L2 abe 记为L3 acd 记为L4,路径覆盖测试用例,基本路径测试方法,路径测试就是从一个程序的入口开始,执行所经历的各个语句的完整过程。从广义的角度讲,任何有关路径分析的测试都可以被称为路径测试。 完成路径测试的理想情况是做到路径覆盖,但对于复杂性大的程序要做到所有路径覆盖(测试所有可执行路径)是不可能的。 在不能做到所有路径覆盖的前提下,如果某一程序的每一个独立路径都被测试过,那么可以认为程序中的每个语句都已经检验过了,即达到了语句覆

23、盖。这种测试方法就是通常所说的基本路径测试方法。,基本路径测试方法(续),基本路径测试方法是在控制流图的基础上,通过分析控制结构的环形复杂度,导出执行路径的基本集,再从该基本集设计测试用例。基本路径测试方法包括以下4个步骤: (1)画出程序的控制流图。 (2)计算程序的环形复杂度,导出程序基本路径集中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。 (3)导出基本路径集,确定程序的独立路径。 (4)根据(3)中的独立路径,设计测试用例的输入数据和预期输出。,环形复杂度,环形复杂度也称为圈复杂度,它是一种为程序逻辑复杂度提供定量尺度的软件度量。 环形复杂度的应

24、用可以将环形复杂度用于基本路径方法,它可以提供:程序基本集的独立路径数量;确保所有语句至少执行一次的测试数量的上界。 独立路径是指程序中至少引入了一个新的处理语句集合或一个新条件的程序通路。采用流图的术语,即独立路径必须至少包含一条在本次定义路径之前不曾用过的边。 测试可以被设计为基本路径集的执行过程,但基本路径集通常并不唯一。,计算环形复杂度的方法,环形复杂度以图论为基础,为我们提供了非常有用的软件度量。可用如下三种方法之一来计算环形复杂度: 控制流图中区域的数量对应于环形复杂度。 给定控制流图G的环形复杂度V(G),定义为V(G) = E-N+2其中,E是控制流图中边的数量,N是控制流图中

25、的节点数量。 给定控制流图G的环形复杂度V(G),也可定义为 V(G) = P+1其中,P是控制流图G中判定节点的数量。判定节点是输出边至少2条以上的节点。,基本路径测试方法(续),void Sort ( int iRecordNum, int iType ) 1 2 int x=0; 3 int y=0; 4 while ( iRecordNum- 0 ) 5 6 If ( iType=0 ) 7 x=y+2; 8 else 9 If ( iType=1 ) 10 x=y+10; 11 else 12 x=y+20; 13 14 ,基本路径测试方法(续),画出控制流图:如右图所示 计算环形复

26、杂度:10(条边)- 8(个节点)+ 2 = 4 导出独立路径(用语句编号表示)路径1:414路径2:46714路径3:4691013414路径4:4691213414,路径覆盖的利弊,实现了所有路径的测试,发现错误能力强 某些条件错误可能无法发现 路径数庞大,不可能覆盖所有路径 用例数量的增加,循环测试路径覆盖,0次循环 检查跳出循环 1次循环 检查循环初始值 2次循环 检查多次循环 m次循环 检查某次循环 最大次数循环、比最大次数多一次、少一次循环 检查循环次数边界,简化循环路径,循环使路径数量急剧增长 简化 无论循环的形式和实际执行循环体的次数多少,只考虑循环一次和0次 两种情况 进入循

27、环体一次 跳出循环体,循环程序流程图,C,B,C,B,(1),(2),简化循环路径图,(1)和(2)都可简化为(3),C,B,最少测试用例数计算,对于具体的程序,至少要设计多少测试用例? 估算最少测试用例数 帮助执行测试 有助于估算测试的时间,结构化程序与N-S图,结构化程序是由3种基本控制结构组成 顺序型 选择型(条件分支) 重复型(循环) 测试时考虑的结构 顺序型 选择型(条件分支),程序结构与测试用例数,并行,串行,程序结构与测试用例数,当程序中判定多于一个时,形成的分支结构可以分为两类:嵌套型分支结构和连锁型分支结构 对于嵌套型分支结构,若有n个判定语句,需要n+1个测试用例 对于连锁

28、型分支结构,若有n个判定语句,需要有2n个测试用例,覆盖它的2n条路径,最少测试用例数计算实例,计算最少测试用例数,最少测试用例数计算实例,最少测试用例数计算实例,测试覆盖准则,Foster的ESTCA覆盖准则 错误敏感测试用例分析(Error Sensitive Test Cases Analysis) 问题,ESTCA覆盖准则,对于分支A(, = , =, B的情况分别测试一次 对于分支A (, C时,选择A=C小正数 当AC时,选择A=C小正数 对于测试用例取值,在每个测试用例中尽量不同的值或符号,覆盖率要求,对单元测试来说,语句覆盖和分支覆盖是最基本的要求 由于程序中错误(异常)处理工

29、作的重要性以及其结构相对简单,要求错误处理要做到路径覆盖 对质量要求高的软件单元,可根据情况提出条件覆盖、分支-条件覆盖以及路径覆盖要求,课程目录,结构测试概述 程序结构分析 逻辑覆盖 结构测试案例分析 结构测试工具使用,结构测试案例,求最小值 求数组中的最小值 k = i;for(j = i+1; j = n; j+)if(Aj Ak)k = j;,程序流程图,k = i; j = i+1,j = n?,Aj Ak?,k = j,j+,a,c,b,d,e,f,最少测试用例数,3,测试用例(最少),疑问,测试用例是否足够?循环测试是否足够? 在结构复杂,测试用例数非常多的情况下,这些测试用例已

30、经可以满足测试,但并不具有充分性 如何达到充分性? 测试2次循环,测试用例(充分),课程目录,结构测试概述 程序结构分析 逻辑覆盖 结构测试案例分析 结构测试工具使用,目前的白盒测试工具,DevPartner(Compuware)(C+、VC+、.net、java) IBM Rational Purify(C,C+ ) NUnit(.net) JUnit(java) CppUnit(C+),Devpartner的使用,Compuware 的 DevPartner 家族可以帮助您快速提高 Microsoft、Java 及 64 位应用程序的质量和性能。 分为(C/VC/.net)和java两个系

31、列DevPartner 可以精确报告程序使用内存的情况,识别效率低下的慢速代码,并将性能瓶颈确定到问题所在的源代码行。 DevPartner 还可以让您跟踪多个服务器之间的事务,让您获得大量的信息,并且对性能问题进行深入的分析。,Devpartner的使用,DevPartner 8.0 Professional Edition,Devpartner的使用,DevPartner 8.0 Professional Edition,NUnit的使用,NUnit是一个单元测试框架,专门针对于.NET来写的.其实在前面有JUnit(Java),CPPUnit(C+),他们都是xUnit的一员.最初,它是

32、从JUnit而来.现在的版本是2.2. NUnit最初是由James W. Newkirk, Alexei A. Vorontsov 和Philip A. Craig, 后来开发团队逐渐庞大起来.在开发过程中, Kent Beck 和Erich Gamma2位牛人也提供了许多帮助. NUnit是xUnit家族种的第4个主打产品,完全由C#语言来编写,并且编写时充分利用了许多.NET的特性,比如反射,客户属性等等.,NUnit的使用,本课总结,结构性测试包含程序结构分析和代码覆盖测试 衡量结构性测试的优劣的标准是代码覆盖率 使用工具将提高结构性测试的质量和加快测试的时间,课后习题,第一题:总结各种白盒测试方法的应用场景及其优缺点。 第二题: 使用逻辑覆盖测试方法测试以下程序段: Void Do(int X, int A, int B)if(A1) ,课后习题,第三题:计算下列程序片段的环形复杂度,使用逻辑覆盖测试方法测试。 Void DoWork(int x,int y, int z)int k=0,j=0;if(x3) ,Thanks!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报