740 likes | 849 Vues
软件工程. 周志钊 zhouzhizhao08@163.com. 执行程序、排除的错误的过程;是对软件规格说明、设计和编码的最全面最后的审查. 定义. 发现软件中的错误提高正确性、可靠性、质量. 执行 , 以发现错误 好用例 , 发现尚未发现的错误 好测试 , 发现错的测试用例. 作用. 目标. 占工作量的 40% 以上,甚至 3~5 倍以上. 工作量. 软 件 测 试 基 本 概 念. 软件测试的原则. ① 尽早 不断地进行软件“测试” ②输入数据,合理不合理都要选 ③按阶段制定测试计划,严格执行 ④错多重测 ⑤避免自测 ⑥勿用穷举
E N D
软件工程 周志钊 zhouzhizhao08@163.com
执行程序、排除的错误的过程;是对软件规格说明、设计和编码的最全面最后的审查执行程序、排除的错误的过程;是对软件规格说明、设计和编码的最全面最后的审查 定义 发现软件中的错误提高正确性、可靠性、质量 执行,以发现错误好用例,发现尚未发现的错误 好测试,发现错的测试用例 作用 目标 占工作量的40%以上,甚至3~5倍以上 工作量 软 件 测 试 基 本 概 念
软件测试的原则 ①尽早 不断地进行软件“测试” ②输入数据,合理不合理都要选 ③按阶段制定测试计划,严格执行 ④错多重测 ⑤避免自测 ⑥勿用穷举 ⑦长期保存文档
静态测试 采用人工检测和 计算机辅助 静态分析的方法 对程序进行检测 动态测试 事先设计好一组 测试用例,然后通过运行程序来发现错误 软 件 测 试 方 法 2种方法
静态测试 • 静态测试是采用人工检测和计算机辅助静态分析的手段对程序进行检测,方法如下: • (1)人工测试:是指不依靠计算机运行程序,而靠人工审查程序或评审软件。人工审查程序的重点是对编码质量进行检查,而软件审查除了审查编码还要对各阶段的软件产品(各种文档)进行复查。人工检测可以发现计算机不易发现的错误,特别是软件总体设计和详细设计阶段的错误。据统计,能有效地发现30%~70%的逻辑设计和编码错误,可以减少系统测试的总工作量。
静态测试 • (2)计算机辅助静态分析:指利用静态分析软件工具对被测试程序进行特性分析,从程序中提取一些信息,主要检查用错的局部变量和全程变量、不匹配参数、错误的循环嵌套、潜在的死循环及不会执行到的代码等。还可以分析各种类型的语句出现的次数、变量和常量的引用表、标识符的使用方式、过程的调用层次及违背编码规则等。
动态测试 • 动态测试与静态测试相反,主要是设计一组输入数据,然后通过运行程序来发现错误。在软件的设计中,出现了大量的测试用例设计方法。测试任何工程化产品,一般有两种方法: (1)黑盒测试:了解了产品的功能,然后构造测试,来证实所有的功能是完全可执行的。 (2)白盒测试:知道测试产品的内部结构及处理过程,可以构造测试用例,对所有的结构都进行测试。
黑 盒 测 试 输出 输入 又称功能测试,不考虑内部结构和处理过程,测试仅在接口上进行。用来证实软件功能的可操作性,检查程序是否满足功能要求,是否能很好地接收数据,并产生正确的输出。一般用来检验系统的基本特征。
输入整数x、y,求r值 r = x + 4/y 黑 盒 测 试 输出 输入 预期结果:r = 4 合理的输入:x=4 ,y=2x=-4,y=4x=0,y=0 x 值有误 y值有误 不合理的输入:x=3.5,y=2.6 x=a, y=& 值不正确???
黑 盒 测 试 • 黑盒测试的任务是发现以下错误: (1)是否有不正确或遗漏了的功能。 (2)在界面上,能否正确地处理合理和不合理的输入数据,并产生正确的输出信息。 (3)访问外部信息是否有错。 (4)性能上是否满足要求等。 (5)初始化和终止错误。 用黑盒法测试时,必须在所有可能的输入条件和输出条件中确定测试数据。
白 盒 测 试 完全了解程序的内部结构和详细的处理过程,测试在程序内部结构上进行。对程序中尽可能多的逻辑路径进行测试,在所有的点检验内部控制结构和数据结构是否和预期相同。
Y Y N N N Y Y N N 白 盒 测 试 开始 1. 输入x,y 路径1:1, 2, 3, 10 2.x<0 路径2:1,2,4,5,6,10 路径3:1,2,4,5, 7,8,9,10 4.r1=sqrt(x) 3. x值错 5. y= =0 • 测试数据1:x=-2,y=7 6. y值错 7. r2=4/y • 测试数据2:x=4,y=0 8. r=r1+r2 • 测试数据3:x=4,y=7 9. 输出r值 10. 结束
黑、白盒对比分析总结 • 因为白盒测试不检查功能,因此即使每条路径都测试并正确了,程序仍可能有错。例如要求编写一个升序的程序,错编成降序程序(功能错误),就是穷举路径测试也无法发现。再如由于疏忽漏写了路径,白盒测试也发现不了。 • 所以,黑盒法和白盒法都不能使测试达到彻底。为了让有限的测试发现更多的错误,需精心设计测试用例。
软件测试技术 白盒测试——逻辑覆盖 白盒测试——基本路径 白盒测试——循环测试 黑盒测试——等价类划分 黑盒测试——边界值分析、 错误推测、组合数据测试
开始 1 T 2 (a>1) AND (b=0) 语句段1 F 3 T 4 (a=2) OR (x>1) 语句段2 F 5 结束 白盒测试—逻辑覆盖 1. 逻辑覆盖 下面根据如图所示的程序,分别讨论几种常用的覆盖技术。
几种常用的逻辑覆盖技术 • 1)语句覆盖 • 2)判定覆盖 • 3)条件覆盖 • 4)判定/条件覆盖 • 5)条件组合覆盖 • 6)路径覆盖
几种常用的逻辑覆盖技术 1、语句覆盖: 语句覆盖就是设计足够的调试用例,使得程序中的每个语句至少执行一次。 上图程序段中共有4条路径:P1(124)、P2(135)、P3(125)、P4(134)。 P1正好满足语句覆盖的条件。可以设计如下的输入数据: A=2,B=0,x=4 语句覆盖不能发现判断中的逻辑运算错误。第一个判断中的逻辑运算符“&&”若错写成了“||”,利用上面的输入数据则检查不出这个错误。
几种常用的逻辑覆盖技术 2、判定覆盖: 判定覆盖就是设计足够的测试用例,使得程序中每个判定的取“真”分支和取“假”分支至少都执行一次,判定覆盖又称分支覆盖。 • 测试用例如果能够测试路径P1(124)和P2(135),就可以满足判定覆盖要求。可以设计如下两组输入数据: A=2,B=0,x=4 A=1,B=1,x=1 • 也可以让测试用例测试路径P3(125)和P4(134)。相应的两组输入数据如下: A=2,B=1,x=1 A=4,B=0,x=4 • 判定覆盖比语句覆盖强,但是仍不能保证判断条件的正确性。例如:第二个判断条件中的x>1若错写成了x<1,利用上面的输入数据就不能检查出这个错误。
几种常用的逻辑覆盖技术 3、条件覆盖: 条件覆盖就是设计足够的测试用例,使得程序判定中的每个条件的各种可能的值都至少出现一次。 条件:A>1,B=0,A=2,x>1。需要有足够的测试用例使得上述四个条件都能有满足和不满足的情况。以下这两组输入数据能满足这些要求: A=2,B=0,x=4 A=1,B=1,x=1 满足条件覆盖不一定满足判定覆盖。
几种常用的逻辑覆盖技术 4、判定/条件覆盖: 判定/条件覆盖就是设计足够的测试用例,使得判定中的每个条件都取到各种可能的值,而且每个判定表达式也都取到各种可能的结果。 对于上面的例子,下述两组输入数据能满足这些要求: A=2,B=0,x=4 A=1,B=1,x=1 采用判定/条件覆盖时,逻辑表达式中的错误不一定能测试出来。
几种常用的逻辑覆盖技术 5、条件组合覆盖:就是设计足够的测试用例,使得每个判定中的条件的各种可能组合都至少出现一次。 可能的条件组合: (1)A>1,B=0 (2)A>1,B≠0 (3)A≤1,B=0 (4)A≤1,B≠0 (5)A=2,x>1 (6)A=2,x≤1 (7)A≠2,x>1 (8)A≠2,x≤1 相应的输入数据: A=2,B=0,x=4 满足(1)和(5) A=2,B=1,x=1 满足(2)和(6) A=1,B=0,x=2 满足(3)和(7) A=1,B=1,x=1 满足(4)和(8) 显然,满足条件组合覆盖的测试数据,也一定满足判定覆盖、条件覆盖和判定/条件覆盖标准。但是,满足条件组合覆盖标准的测试数据并不一定覆盖了程序中的每条路径,例如,利用上述四组测试数据就遗漏了路径P3(125)。
几种常用的逻辑覆盖技术 6、路径覆盖: 设计足够多的测试数据,可以覆盖被测程序中的所有可能的路径。 共有4条路径,设计4组测试用例,就可以覆盖这4条路径: x=2,y=0,z=3;覆盖路径124 x=2,y=1,z=1;覆盖路径134 x=1,y=1,z=1;覆盖路径135 x=3,y=0,z=1;覆盖路径125
白盒测试—循环测试 • 除了选择结构外,循环也是程序中主要逻辑结构,要覆盖含有循环的所有路径是不可能的,但可通过限制循环次数来测试。 1)对于最多为n次的单循环,可设计测试用例实现下列测试: ①跳过循环,即一次也不执行; ②仅循环1次; ③循环2次; ④循环m次,m<n ; ⑤分别循环第n – 1次,n次和n+1次。
白盒测试—循环测试 2)对于嵌套循环的测试: ①从最内层循环开始测试,此时外层循环都取最小值,对内层进行单循环的测试; ②向外退一层进行测试,此时其内层循环取一些典型值,其外层循环仍取最小值; ③继续向外层扩展,直至测试完成。
白盒测试—基本路径 • 实际问题中,一个不太复杂的程序路径是一个庞大的数字,将覆盖的路径数压缩到一定限度内可简化测试。通过分析程序流程图,导出基本路径集合,从而设计测试用例,保证这些路径至少通过一次。 (1)以详细设计或源程序为基础,导出程序流程图的拓扑结构——程序图。
白盒测试—基本路径 (a)程序流程图 (b)程序图
白盒测试—基本路径 (2)程序图G的环路复杂性V(G)的计算。 例如,上图的V(G)=4,还可以按如下两种方法计算: V(G)= 判定结点数+1=3+1=4。 V(G)= 边的数量-节点数量+2=11-9+2=4。 环路复杂性V(G)指出程序基本路径集合中独立路径的条数。独立路径是指至少包含一条其他独立路径中未有过的边的路径。
1 2 R4 9 3 4 11 10 5 12 已知 1 4 2 3 6 R1 控制流程 流图 测试用例 环形复杂性 基本路径集合 R6 R2 7 8 白盒测试—基本路径 • 程序图的环路复杂性亦是平面图中区域的个数。
白盒测试—基本路径 (3)确定只包含独立路径的基本路径集。 在上图中,一组独立的路径是: • path1:1—11 • path2:1—2—3—4—5—10—1—11 • path3:1—2—3—6—8—9—10—1—11 • path4:1—2—3—6—7—9—10—1—11 (4)为每一条独立路径各设计一组测试用例,确保基本路径集合中每条独立路径至少执行一次。
基本路径测试举例 • 某程序读入三个整数,分别解释为三角形的各边,并据此打印信息,说明三角形是普通的、等腰的或等边的。 • 设计并实现上述的程序,用基本路径测试法设计测试用例,实际测试后总结所得到的结果。
a+b<=c || |a-b|>=c a==c a==b a==c 输出不是 输出等腰 输出等边 输出普通 输出等腰 输出等腰 开始 1 输入a,b,c 2、3和4 1)程序流程图如下: F a<=0||b<=0||c<=0 5 T 输入a,b,c 6 和 7 F 9 F T 13 10 T F F 15 F T T b==c 17 11 8 16 T 14 12 18 结束
2)C语言程序如下: #include "math.h " main( ) { int a ,b , c; printf ("please input a , b , c: "); scanf ("%d%d%d ", &a , &b , &c ); while ( a<=0 || b<=0 || c<=0 ) { printf ( " a , b , c must be > 0!\nplease input a , b , c: " ); scanf ("%d%d%d " ,&a , &b , &c ); } if ( a+b <= c || abs (a-b) >= c ) printf (“It is not a triangle!\n "); else if ( a==b ) if ( a==c ) printf ( "It is a equilateral triangle!\n " ); else printf ("It is a isosceles triangle!\n " ); else if (a==c ) printf ("It is a isosceles triangle!\n " ); else if (b==c ) printf ("It is a isosceles triangle!\n " ); else printf ("It is a general triangle!\n " ); }
R3 R1 17 16 15 14 13 12 11 10 9 8 7 6 4 5 3 2 1 18 R2 R10 R4 R5 R8 R7 R9 R6 3)程序图(流图) 4)求出巡回秩数: ①V(G)=E-N+2=26-18+2=10 ②V(G)=P+1=9+1=10 其中结点2、3、4、6、7、9、10、13、15是判定结点 ③V(G)=10(个区域)
5)确定基本路径集合(10条) 路径1: 1 – 2 – 5 – 2 路径2: 1 – 2 – 3 – 5 – 2 路径3: 1 – 2 – 3 – 4 – 5 – 2 路径4: 1 – 2 – 3 – 4 – 6 – 8 – 18 路径5: 1 – 2 – 3 – 4 – 6 – 7 – 8 – 18 路径6: 1 – 2 – 3 – 4 – 6 – 7 – 9 – 10 – 11 – 18 路径7: 1 – 2 – 3 – 4 – 6 – 7 – 9 – 10 – 12 – 18 路径8: 1 – 2 – 3 – 4 – 6 – 7 – 9 – 13 – 14 – 18 路径9: 1 – 2 – 3 – 4 – 6 – 7 – 9 – 13 – 15 – 16 – 18 路径10:1 – 2 – 3 – 4 – 6 – 7 – 9 – 13 – 15 – 17 – 18
6)为每一条独立路径设计设计用例 ①路径1的测试用例:a = – 3, b = 4, c = 5; 期望结果:输出 出错:a , b , c must be > 0! 提示输入:please input a , b , c: ②路径2的测试用例:a = 3 , b = – 4 , c = 5 ; 期望结果:输出 出错:a , b , c must be > 0! 提示输入:please input a , b , c: ③路径3的测试用例:a = 3 , b = 4 , c = – 5 ; 期望结果:输出 出错:a , b , c must be > 0! 提示输入:please input a , b , c: ④路径4的测试用例:a = 3 , b = 1 , c = 5 ; 期望结果:输出 :It is not a triangle! ⑤路径5的测试用例:a = 3 , b = 7 , c = 2; 期望结果:输出 :It is not a triangle!
6)为每一条独立路径设计设计用例 ⑥路径6的测试用例:a = 3 , b = 3 , c = 3 ; 期望结果:输出 : It is a equilateral triangle! ⑦路径7的测试用例:a = 3 , b = 3 , c = 5 ; 期望结果:输出 : It is a isosceles triangle! ⑧路径8的测试用例:a = 3 , b = 4 , c = 3 ; 期望结果:输出 : It is a isosceles triangle! ⑨路径9的测试用例:a = 3 , b = 4 , c = 4 ; 期望结果:输出 : It is a isosceles triangle! ⑩路径10的测试用例:a = 3 , b = 4 , c = 5 ; 期望结果:输出 : It is a general triangle!
黑盒测试 目的:主要是测试软件是否满足功能需求。 测试的错误类型有: ①不正确或遗漏的功能; ②接口错误; ③性能错误; ④数据结构或外部数据访问错误; ⑤初始化或终止条件错误等等。 黑盒测试设计测试用例的方法: 等价类的划分、边界值分析、 错误推测、组合数据测试等。
黑盒测试—等价类划分 • 不可能用所有可能的输入数据测试程序功能,而只能从输入数据中选一个子集进行测试。 • 等价类划分是选择测试子集的办法。它将输入数据域按有效的或无效的(也称合理的或不合理的)划分成若干个等价类,认为测试等价类的代表值的结果就等于对该类其他值的测试。
黑盒测试—等价类划分 • 【例7.1】设有一个档案管理系统,要求用户输入以年月表示的日期。假设日期限定在1990年1月~2003年12月,并规定日期由6位数字字符组成,前4位表示年,后2位表示月。现用等价类划分法设计测试用例,来测试程序的“日期检查功能”。 1)划分等价类并编号 表7-1 等价类划分的结果
黑盒测试—等价类划分 2)设计测试用例,以便覆盖所有的有效等价类 (每个用例尽可能多地覆盖尚未被覆盖过的有效等价类) 在表7-1中列出了3个有效等价类, • 编号分别为①、⑤、⑧, • 设计的测试用例如下: • 测试数据 期望结果 覆盖的有效等价类 • 200211 输入有效 ①、⑤、⑧
黑盒测试—等价类划分 • 3)为每一个无效等价类设计一个测试用例,设计结果如下: 测试数据 期望结果 覆盖的无效等价类 95June 无效输入 ② 20036 无效输入 ③ 2001006 无效输入 ④ 198912 无效输入 ⑥ 201001 无效输入 ⑦ 200100 无效输入 ⑨ 200113 无效输入 ⑩
等价类划分的几条经验性原则 ①如果规定了输入值的范围,则可划分出一个有效的和两个无效的等价类。 ②如果规定了数据输入的个数,则可划分出一个有效的和两个无效的等价类。 ③如果规定了输入数据的一组值,而且程序对不同的输入值进行不同的处理,则每个允许的输入值是一个有效的等价类,有一个无效的等价类(这组值以外的值)。 ④如果规定了输入数据必须遵循的规则,则有一个有效的等价类和若干个无效的等价类(从不同的角度违反规则)。 ⑤如果输入条件规定了一个集合,则可划分出一个有效的等价类和一个无效的等价类。
黑盒测试—边界值分析 • 等价类划分的缺点是没有选择某些高效的、能够发现更多错误的测试用例。 • 边界值分析(boundary value analysis,BVA)是指设计测试用例,使程序在输入或输出的边界值或者边界值左右的值执行。 • 实践表明,程序往往在处理边界情况时发生错误,因此检查边界情况的测试用例是比较高效的,可以查出更多错误。
黑盒测试—边界值分析 • 边界值分析方法可以单独设计测试用例,也可以作为等价类划分方法的补充,即在各个等价类中主要是选择边界上及其左右的值。 边界值分析方法设计测试用例的经验性原则: 1)如果输入条件指定了范围[a,b],则a、b以及紧挨a、b左右的各一个值都应作为测试用例。比如,学生成绩为[0,100],应取-1、0、1、99、100、101共6个值作为测试用例。
黑盒测试—边界值分析 2)如果输入条件指定了输入数据的个数范围,则按最大、最小个数及其左右的个数各设计一个测试用例。比如,一个输入文件应包括1~255个记录,则应分别设计输入0个、1个、2个、254个、255个、256个记录的测试用例。 3)将规则1)和2)应用于输出条件,即设计测试用例使输出值达到边界值及其左右的值。
黑盒测试—边界值分析 • 如一个学生成绩管理系统规定,只能查询95~98级大学生的各科成绩,可以设计测试用例,除了查询范围内的学生的学生成绩,还需设计查询94级、99级学生成绩的测试用例(不合理输出等价类)。 • 由于输出值的边界与输入值的边界没有必然的对应关系,所以要检查输出值的边界不一定可能,要产生超出输出值之外的结果也不一定能做到,但必要时还需试一试。
黑盒测试—错误推测 • 在测试程序时,人们根据经验或直觉推测程序中可能存在的各种错误,从而有针对性地编写检查这些错误的测试用例,这就是错误推测法。 • 基本思想是:程序测试员通过已经掌握的测试理论和实际测试中积累的经验,推测程序在哪些情况下可能发生错误,并将可能发生错误的情况列出,然后为每一可能发生错误的情况各设计一个测试用例。