
软件结构性测试.ppt
84页国家应用软件产品质量监督检验中心国家应用软件产品质量监督检验中心软件测试工程师培训软件结构性测试概览ü在本章中,我们将学习:–结构性测试概述 –程序结构分析 –逻辑覆盖 –结构性测试案例 目标完成此课程之后,学员将具备以下能力: –了解结构性测试的含义–进行程序结构分析–使用逻辑覆盖的方法进行白盒测试 –使用Devpartner进行白盒测试课程目录ü结构测试结构测试概述概述 ü程序结构分析 ü逻辑覆盖 ü结构测试案例分析ü结构测试工具使用结构测试定义 ü把测试对象看做一个透明的盒子ü白盒测试是根据被测程序的内部结构设计测试用例并完成测试的一种测试方法ü白盒测试或逻辑驱动测试ü基于一个应用代码的内部逻辑知识,测试覆盖全部代码、分支、路径和条件结构测试特点ü可以构成测试数据使特定程序部分得到测试ü有一定的充分性度量手段ü可获得较多工具支持ü通常只用于单元测试结构测试的方法ü程序结构分析–代码走查–代码审查–控制流分析–数据流分析–信息流分析ü逻辑覆盖–语句覆盖–分支覆盖–条件覆盖–分支-条件覆盖–路径覆盖结构测试的局限ü不可能查出程序是否违反了设计规范ü不可能查出程序中因遗漏路径而出错ü可能发现不了一些与数据有关的错误ü不易生成测试数据代码覆盖率ü采用白盒法进行测试时,考虑的是测试用例对程序内部逻辑的覆盖程度ü最彻底的白盒法是覆盖程序中的每一条路径,但这往往无法实现ü采用其它一些标准来量度覆盖的程度,并希望覆盖程度尽可能高些课程目录ü结构测试概述 ü程序结构分析程序结构分析 ü逻辑覆盖 ü结构测试案例分析ü结构测试工具使用程序结构分析ü代码走查ü代码审查ü控制流分析ü数据流分析ü信息流分析代码走查ü含义–代码走查是由一组程序和错误检查技术组成,并以代码审查组方式进行ü人员–组长(有威信的资深程序员担任):负责分配资料、安排计划、主持会议、记录并保存被发现的错误–资深程序员–测试人员–程序开发员(可做会议主持)代码走查ü原因–功能性测试很难实现>有太多的条件>有太多的测试用例代码审查ü内容–检查代码和设计的一致性–检查代码对标准的遵循、可读性–检查代码的逻辑表达的正确性–检查代码结构的合理性代码审查ü步骤–准备–程序阅读–审查会–跟踪及报告控制流分析 ü非结构化程序会给测试、排错、和程序的维护带来许多困难ü要求写出的程序结构良好ü检查程序的控制结构成为十分有意义的工作程序流程图 1325控制流图12435abcdef控制流图ü节点–标有编号的圆圈 –程序流程图中矩形框所表示的处理 –菱形表示的两个甚至多个出口判断 –多条流线相交的汇合点 控制流图ü控制流线或弧 –箭头 –与程序流程图中的流线一致,表明了控制的顺序 –控制流线通常标有名字控制流图矩阵 acbdef1234512345控制流图矩阵ü便于机器表示和处理控制流图 ü连接弧的节点的号码决定了矩阵中元素的位置ü注意控制流的方向ü两个节点没有弧线,所对应的位置也就没有元素程序结构的基本要求 ü写出的程序不应包含:–转向并不存在的标号 –没有用的语句标号 –从程序入口进入后无法达到的语句 –不能达到停机语句的语句 数据流分析 ü查找引用未定义变量等程序错误 ü查找对以前未曾使用的变量再次赋值等数据流异常的情况 ü常见的错误表现形式–错拼名字–名字混淆–语句丢失数据流ü如果程序中某一语句执行时能改变某程序变量V的值,则称V被该语句定义ü如果一语句的执行引用了内存中变量V的值,则称V被该语句引用ü例如:–X=Y+Z;–if Y>Z then return;控制流图与数据流表1234106758911节点被定义变量被引用变量1X,Y,Z2XW,X3X,Y4Y,Z5YV,Y6ZV,Z7VX8WY9ZV10ZZ11Z信息流分析ü通过对输入数据、输出数据、语句之间的关系的分析来检查程序错误ü整除算法例子ü输入:in_m是被除数,in_n是除数ü输出:out_q是商,out_r是余数整除算法例子1out_q = 0;2out_r = in_m;3While(out_r >= in_n) {4 out_q ++;5 out_r = out_r – in_n; }信息流关系图√√√√√√√in_min_n12345√√√√√√√√out_q out_r12345√√√√out_q out_rin_mIn_n(1)(2)(3)信息流分析ü能够列出对输入变量的所有可能的引用ü在程序的任何指定点检查其执行可能影响某一输出变量值的语句ü输入输出关系提供一种检查,看每个输出值是否由相关的输入值,而不是其他值导出课程目录ü白盒测试概述 ü程序结构分析 ü逻辑覆盖逻辑覆盖 ü结构测试案例分析ü结构测试工具使用覆盖准则 ü测试到什么地步可以结束测试?–覆盖准则被测小程序 if (A > 1 && B == 0) X = X/A;if (A == 2 || X > 1) X = X + 1;被测程序段流程图A > 1 && B == 0aA == 2 || X > 1X = X/AFTbcX = X + 1TeFd逻辑覆盖测试方法 ü语句覆盖 ü分支覆盖 ü条件覆盖 ü分支-条件覆盖 ü路径覆盖 语句覆盖 ü原理:如果语句中有错误,仅靠观察不执行可能发现不了ü在测试时,首先设计若干个测试用例,然后运行被测程序,使程序中的每个可执行语句至少执行一次 ü若干个 -> 尽量少 ü语句覆盖、程序段覆盖、程序块覆盖语句覆盖率ü语句覆盖率–已执行的可执行语句占程序中可执行语句总数的百分比ü复杂的程序不可能达到语句的完全覆盖ü语句覆盖率越高越好语句覆盖测试用例 ü达到语句覆盖100%的测试用例(路径ace) A = 2 B = 0 X = 3ü未达到语句覆盖100%的测试用例(路径abe) A = 2 B = 1 X = 3语句覆盖的优点ü检查所有语句ü结构简单的代码的测试效果较好ü容易实现自动测试ü代码覆盖率高 ü如果是程序块覆盖,则不涉及程序块中的源代码 语句覆盖不能检查出的错误ü条件语句错误–“A > 1 && B == 0” -> “A > 0 && B == 0”ü逻辑运算(&&、||)错误–“A > 1 && B == 0” -> “A > 1 || B == 0”–“ U = A<1 || B>2 ” -> “ U = A<1 ” 语句覆盖不能检查出的错误ü循环语句错误–循环次数错误–跳出循环条件错误语句覆盖不能检查出的错误ü循环语句例子for(i=0;i<10;i++){ statement;}While(x>3){ statement;}for(i=0;i<=10;i++)for(i=0;i<=10;i++){ { statement; statement;} }While(x>3&&x<7While(x>3&&x<7) ){ { statement; statement;} }语句覆盖率的问题ü能达到很高的语句覆盖率ü语句覆盖率看似很高,却有严重缺陷 if(x!=1) { statements; ……; } else { statement; }}99句}1句测试用例x = 2语句覆盖率99%50%的分支没有达到分支覆盖ü设计若干测试用例,运行被测程序,使得程序中每个判断的真假分支至少经历一次ü又称判定覆盖üwhile语句、switch语句、异常处理、跳转语句等等同样可以使用分支覆盖来测试ü分支覆盖率–已取过“真”和“假”两个值的判定占程序中所有条件判定个数的百分比分支覆盖测试用例 路径ace A=2 B=0 X=3 路径abd A=1 B=0 X=1 路径acd A=3 B=0 X=3 路径abe A=2 B=1 X=2或分支覆盖的利弊ü分支覆盖要比语句覆盖查错能力强一些:执行了分支覆盖,实际也就执行了语句覆盖ü分支覆盖与语句覆盖存在同样的缺点 –不能查出条件语句错误–不能查出逻辑运算错误–不能查出循环次数错误–不能查出循环条件错误条件覆盖ü设计若干测试用例,执行被测程序以后,要使每个判断中的每个条件的可能取值至少满足一次条件覆盖分析ü第1个判断应考虑 A > 1,记为T1 A <= 1,即记为F1 B == 0,记为T2 B != 0,记为F2ü第2个判断应考虑 A == 2,记为T3 A != 2,记为F3 X > 1,记为T4 X <= 1,记为F4条件覆盖测试用例用例编号ABX路径覆盖条件1203aceT1,T2,T3,T42101abdF1,T2,F3,F43211abeT1,F2,T3,F4似乎执行了条件覆盖必然实现了分支覆盖?条件覆盖测试用例用例编号ABX路径覆盖条件1103abeF1,T2,F3,T42211abeT1,F2,T3,F4执行条件覆盖并不能实现分支覆盖条件覆盖的利弊ü能够检查所有的条件错误ü不能实现对每个分支的检查ü用例数量的增加–a && b && (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, B == 0, 记为F1, T2(4) A <= 1, B != 0, 记为F1, F2(5) A == 2, X > 1, 记为T3, T4(6) A == 2, X <= 1, 记为T3, F4(7) A != 2, X > 1, 记为F3, T4(8) A != 2, X <= 1, 记为F3, F4分支-条件覆盖测试用例用例编号ABX覆盖组合号 路径覆盖条件1203(1)(5)aceT1,T2,T3,T42211(2)(6)abcT1,F2,T3,F43103(3)(7)abeF1,T2,F3,T44111(4)(8)abdF1,F2,F3,F4覆盖了3条路径,漏掉了路径acd分支-条件覆盖的利弊ü既考虑了每一个条件,又考虑了每一个分支,发现错误能力强于分支覆盖和条件覆盖ü并不能全面覆盖所有路径ü用例数量的增加路径覆盖ü设计足够多的测试用例,要求覆盖程序中所有可能的路径ü路径–ace 记为L1 –abd 记为L2–abe 记为L3–acd 记为L4路径覆盖测试用例用例编号ABX覆盖路径1203ace(L1)2101abd(L2)3211abe(L3)4301acd(L4)路径覆盖的利弊ü实现了所有路径的测试,发现错误能力强ü某些条件错误可能无法发现ü路径数庞大,不可能覆盖所有路径ü用例数量的增加循环测试路径覆盖ü0次循环–检查跳出循环 ü1次循环–检查循环初始值 ü2次循环–检查多次循环 üm次循环–检查某次循环 ü最大次数循环、比最大次数多一次、少一次循环–检查循环次数边界 简化循环路径ü循环使路径数量急剧增长ü简化–无论循环的形式和实际执行循环体的次数多少,只考虑循环一次和0次ü两种情况–进入循环体一次–跳出循环体循环程序流程图CBCB(1)(2)简化循环路径图ü(1)和(2)都可简化为(3)CB最少测试用例数计算ü对于具体的程序,至少要设计多少测试用例?ü估算最少测试用例数–帮助执行测试–有助于估算测试的时间结构化程序与N-S图ü结构化程序是由3种基本控制结构组成–顺序型–选择型(条件分支)–重复型(循环)ü测试时考虑的结构–顺序型–选择型(条件分支)程序结构与测试用例数程序结构与测试用例数ü当程序中判定多于一个时,形成的分支结构可以分为两类:嵌套型分支结构和连锁型分支结构ü对于嵌套型分支结构,若有n个判定语句,需要n+1个测试用例ü对于连锁型分支结构,若有n个判定语句,需要有2n个测试用例,覆盖它的2n条路径最少测试用例数计算实例ü计算最少测试用例数最少测试用例数计算实例最少测试用例数计算实例测试覆盖准则üFoster的ESTCA覆盖准则–错误敏感测试用例分析(Error Sensitive Test Cases Analysis)–问题ESTCA覆盖准则ü对于分支A(>, = , <, >=, <=)B,测试时应选择AB的情况分别测试一次ü对于分支A (>, <)C,A是变量,C是常量–当A>C时,选择A=C+小正数–当A












