软件工程第六章-软件测试课件.ppt
第第6 6讲讲 软件测试软件测试6.1 6.1 软件测试的基本概念软件测试的基本概念6.2 6.2 测试的原则、类型和文档测试的原则、类型和文档6.3 6.3 黑盒测试方法黑盒测试方法6.4 6.4 白盒测试方法白盒测试方法6.5 6.5 软件测试的基本过程软件测试的基本过程6.6 6.6 软件纠错软件纠错(1 1)什么是软件测试?其目的是什么?)什么是软件测试?其目的是什么?(2 2)什么是成功的测试?什么是失败的测试?)什么是成功的测试?什么是失败的测试?(3 3)什么是好的软件测试?)什么是好的软件测试?(4 4)穷举测试能够把所有的错误找完吗?)穷举测试能够把所有的错误找完吗?(5 5)通过测试能够证明软件无错吗?)通过测试能够证明软件无错吗?(6 6)测试的基本工作有哪些?)测试的基本工作有哪些?(7 7)什么是测试用例?)什么是测试用例?(8 8)测试由谁来完成?)测试由谁来完成?(9 9)测试与纠错有何关系?)测试与纠错有何关系?(1010)纠错由谁来完成?)纠错由谁来完成?(1111)测试的信息流之间有何关系?)测试的信息流之间有何关系?6.1 6.1 软件测试的基本概念软件测试的基本概念 (1 1)什么是软件测试?其目的是什么?)什么是软件测试?其目的是什么?测试的定义测试的定义软件(程序)测试是为了发现错误而执行程软件(程序)测试是为了发现错误而执行程序的过程。序的过程。测试的目的测试的目的发现程序的错误。发现程序的错误。测试为什么重要nARIANE火箭耗资70亿美元,1996年发射37秒后爆炸nbeginsensor_get(vertical_veloc_sensor);sensor_get(horizontal_veloc_sensor); vertical_veloc_bias := integer(vertical_veloc_sensor);horizontal_veloc_bias := integer(horizontal_veloc_sensor); . exceptionwhen numeric_error = calculate_vertical_veloc();when others = use_irs1(); end; v发射失败的原因 程序中试图将6464位浮点数转换成1616位整数时的溢出错误 如果看其浮点转换程序,并没有任何问题。问题在于他们复用了Ariane 4的部分软件需求文档因而软件工程师不知道其Ariane 5的水平加速度比Ariane 4快5倍因此要求额外3位整数存储,所以其背后的真正原因是系统需求。 测试为什么重要测试为什么重要n 爱国者导弹第一次海湾战争期间,美国爱国者导弹系统拦截伊拉克飞毛腿导弹失败。导弹摧毁了一个美军兵营,造成28名士兵死亡,100人受伤。v 起因 导弹拦截软件的取整错误导致计时不正确,令爱国者忽略了飞毛腿导弹 (2 2)什么是成功的测试?什么是失败的测试?)什么是成功的测试?什么是失败的测试?什么是成功的测试?什么是成功的测试?能够找到至今尚未发现的错误。能够找到至今尚未发现的错误。什么是失败的测试?什么是失败的测试?没有找到至今尚未发现的错误。没有找到至今尚未发现的错误。(3 3)什么是好的软件测试?什么是好的软件测试?用最少的代价用最少的代价能够找到至今尚未发现的更多的错误。能够找到至今尚未发现的更多的错误。测试工作反映了经济学的观点测试工作反映了经济学的观点。(4 4)穷举测试能够把所有的错误找完吗?)穷举测试能够把所有的错误找完吗?例例1 1 对于程序内部路径的测对于程序内部路径的测试试如图中所示从如图中所示从A A到到B B的中间有一的中间有一个个2020次的循环,循环中有次的循环,循环中有5 5条路条路径,那么从径,那么从A A到到B B的独立路径数的独立路径数约为约为10101414(即(即5 520205 519195 51 1)例例2 2 对于程序功能的测试对于程序功能的测试一个程序需要一个程序需要3 3个整型数的输入。个整型数的输入。假设计算机字长是假设计算机字长是1616位,则每位,则每个整数可能取值有个整数可能取值有2 21616个,那么个,那么3 3个输入整数的各种可能值的情个输入整数的各种可能值的情况约为况约为2 21616 2 21616 2 21616 2 24848 3 3 10 101414AB20(5 5)通过测试能够证明软件无错吗?)通过测试能够证明软件无错吗?穷举测试是不可取的。穷举测试是不可取的。通过测试不可能把所有的软件错误找完。通过测试不可能把所有的软件错误找完。因此,通过测试不可能证明软件不存在错误。因此,通过测试不可能证明软件不存在错误。测试只能证明错误存在,而不能证明错误不存在(不彻底性)。测试只能证明错误存在,而不能证明错误不存在(不彻底性)。(6 6)测试的基本工作有哪些测试的基本工作有哪些?制定测试计划制定测试计划建立测试环境建立测试环境设计测试用例设计测试用例执行测试执行测试结果分析结果分析完成测试报告完成测试报告(7 7)什么是测试用例?)什么是测试用例?测试用例测试用例(Test Case)(Test Case)测试数据测试数据+ +期望的结果期望的结果测试用例的重要作用:测试用例是连接测试计测试用例的重要作用:测试用例是连接测试计划与实施测试的桥梁。划与实施测试的桥梁。设计测试用例是搞好软件测试的关键。设计测试用例是搞好软件测试的关键。(8 8)测试由谁来完成?)测试由谁来完成?一般情况下,应该由非程序员或非程序开发机一般情况下,应该由非程序员或非程序开发机构来完成。构来完成。这样做的主要原因主要:这样做的主要原因主要:从心理学的角度考虑;从心理学的角度考虑;从质量的观点看,应该有专门的机构或组织来完成。从质量的观点看,应该有专门的机构或组织来完成。(9 9)测试与纠错有何关系?)测试与纠错有何关系?纠错的目的和任务:根据测试所发现的错误,确定错纠错的目的和任务:根据测试所发现的错误,确定错误发生的位置、性质,并纠正这些错误。误发生的位置、性质,并纠正这些错误。纠错的过程就是程序调试的过程。纠错的过程就是程序调试的过程。测试是纠错测试是纠错/排错排错/调试的基础和依据;纠错需要测试所调试的基础和依据;纠错需要测试所发现的错误现象,才能确定错误发生的性质、位置,发现的错误现象,才能确定错误发生的性质、位置,并纠正这些错误。并纠正这些错误。(1010)纠错由谁来完成?)纠错由谁来完成?程序员程序员(测试数据测试数据)(1111)测试的信息流之间有何关系?)测试的信息流之间有何关系?测试过程的输入测试过程的输入测试过程中需要测试过程中需要3 3类输入类输入( (见上图见上图) ):软件配置软件配置包括软件需求规格说明、软件设计规格说明、源代码等。包括软件需求规格说明、软件设计规格说明、源代码等。测试配置测试配置包括测试计划、测试用例、测试驱动程序等。包括测试计划、测试用例、测试驱动程序等。测试工具测试工具为测试的实施提供某种服务,以减轻完成测试任务中的手工劳动。为测试的实施提供某种服务,以减轻完成测试任务中的手工劳动。测试工具测试工具测试数据自动生成程序测试数据自动生成程序静态分析程序静态分析程序动态分析程序动态分析程序测试结果分析程序测试结果分析程序驱动测试的测试数据库等等。驱动测试的测试数据库等等。分析测试结果分析测试结果测试完成后,要对所有的测试结果进行分析,如果发现测试完成后,要对所有的测试结果进行分析,如果发现软件有错误,就要排错并修正有关文档,接着再测试,软件有错误,就要排错并修正有关文档,接着再测试,直到通过为止。直到通过为止。如果经常出现需要修改设计的严重错误,则软件质量与如果经常出现需要修改设计的严重错误,则软件质量与可靠性值得怀疑,需进一步测试。可靠性值得怀疑,需进一步测试。如果测试未发现错误,则应重新审查测试配置如果测试未发现错误,则应重新审查测试配置。6.2 6.2 测试的原则、类型和文档测试的原则、类型和文档1)测试原则(1)所有的测试都应追溯到用户需求。软件测试的目标在于揭示错误。而最严重的错误是那些导致程序无法满足需求的错误。(2)充分注意测试中的群集现象。在被测程序段中,若发现错误数目多,则残存错误数目也比较多。因此,应当对错误群集的程序段进行重点测试,以提高测试投资的效益。(3)测试应从“小规模”开始,逐步转向”大规模”。(4)测试应该由非程序员或非开发机构来进行。(5)对于非法的和非预期的输入情况也要象正常测试一样,编写测试用例。检查程序是否做了要做的事仅仅是成功的一半,另一半是看程序是否做了不该做的事。(6)妥善保存测试计划、测试用例、出错统计和最终分析报告。回归测试 2)软件测试方法(1)静态分析:通过对被测程序的静态检查,发现代码中潜在的错误。静态分析包括2种方式: 静态分析器分析(自动方式);如PMD 扫描java源代码,查找潜在的问题:可能的bugs,如空的try/catch/finally/switch声明 死亡的代码,没有使用的本地变量,参数和私有方法 过于复杂的表达式,如不必要的if表达式 重复的代码,拷贝、粘贴的代码 代码评审(人工方式),包括代码会审、走查、办公桌检查等。 (2)动态测试(简称测试):将被测程序在机器上运行来发现程序中的错误。动态测试包括2类方式: 黑盒测试(测试程序的功能) 白盒测试(测试程序的结构) 3 3)测试的文档)测试的文档(1)测试计划主体是测试内容说明。包括:测试项目名称,各项测试的目的、步骤、进度,测试用例的设计等。 (2)测试报告主体是测试结果。包括:测试项目名称,实测结果与期望结果的比较,发现的问题,测试达到的效果等。(3)测试用例(1)黑盒测试的基本概念不考虑程序的内部结构和处理过程,只在程序的接口处进行测试,以检查程序功能是否能按规格说明书中的要求正常实现。黑盒测试又称为功能测试,其主要目的是为了发现程序在功能方面的错误。6.3 6.3 黑盒测试方法黑盒测试方法n黑盒法分类黑盒法分类等等价价类类化化分分法法边边界界值值分分析析法法错错误误猜猜测测法法因因果果图图法法(2 2)等价类划分法)等价类划分法基本思想:根据程序的I/O特性,将程序的输入域划分为有限个等价区段 “等价类”,并从等价类中选出最有“代表性”的用例。 等价类:是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的。测试某等价类的代表值就等价于对这一类其它值的测试。如果一个测试用例不能检测出某个错误,那么等价类中其它测试用例也不能发现这一错误。等价类分为: 有效等价类 对于程序的规格说明是合理的、有意义的输入数据构成的集合。 无效等价类 对于程序的规格说明,是不合理的,是没有意义的输入数据构成的集合。等价类划分法的步骤等价类划分法的步骤划分等价类划分等价类合理的(有效的)、不合理的(无效的)合理的(有效的)、不合理的(无效的)2 2类类找出测试用例找出测试用例给每个等价类规定一个惟一的编号;给每个等价类规定一个惟一的编号;设计一个新的测试用例,使其尽可能多地覆盖未被覆设计一个新的测试用例,使其尽可能多地覆盖未被覆盖的有效等价类,直到所有合理等价类被覆盖完为止;盖的有效等价类,直到所有合理等价类被覆盖完为止;设计一个测试用例,使其仅仅覆盖一个未被覆盖的无设计一个测试用例,使其仅仅覆盖一个未被覆盖的无效等价类,直到所有不合理等价类被覆盖完为止。效等价类,直到所有不合理等价类被覆盖完为止。例例 如下是一个程序的功能描述,用等价类划分法设计测试用例。如下是一个程序的功能描述,用等价类划分法设计测试用例。功能描述:某城市的电话号功能描述:某城市的电话号码由码由3 3部分组成。假定被测程部分组成。假定被测程序能接收一切符合下述规定序能接收一切符合下述规定的电话号码,拒绝所有不符的电话号码,拒绝所有不符合规定的电话号码。合规定的电话号码。地区码:空白或地区码:空白或3 3位数字;位数字;前缀:非前缀:非0 0或或1 1开头开头的的3 3位数字;位数字;后缀:后缀:4 4位数字。位数字。输入条件输入条件合理的等价类合理的等价类不合理的等价类不合理的等价类地区码地区码空白空白(1) 3(1) 3位数字位数字(2)(2)有非数字字符有非数字字符(5) (5) 少于少于3 3位数字位数字(6) (6) 多于多于3 3位数字位数字(7) (7) 前缀前缀从从200200到到999999的的3 3位数字位数字(3)(3)有非数字字符有非数字字符(8) (8) 少于少于3 3位数字位数字(9) (9) 多于多于3 3位数字位数字(10)(10)起始位为起始位为0 0(11) (11) 起始位为起始位为 1 1 (12) (12)后缀后缀4 4位数字位数字(4)(4)有非数字字符有非数字字符(13) (13) 少于少于3 3位数字位数字(14) (14) 多于多于3 3位数字位数字(15)(15)测试用例测试用例测试范围测试范围期望结果期望结果 276 2345 276 2345等价类等价类(1) (3) (4) (1) (3) (4) 有效有效027 805 9321027 805 9321等价类等价类(2) (3) (4)(2) (3) (4)有效有效20A 123 435620A 123 4356等价类等价类(5)(5)无效无效剩下的剩下的1010个用例个用例无效等价类无效等价类(6)-(15)(6)-(15) 无效无效测试用例的设计:测试用例的设计:(3 3)边界值分析)边界值分析基本思想基本思想: :人们从长期的测试工作中发现,大量的错误是发生人们从长期的测试工作中发现,大量的错误是发生在输入或输出范围的边界,而不是在输入范围的内在输入或输出范围的边界,而不是在输入范围的内部。部。因此,针对各种边界情况设计测试用例,可以查出因此,针对各种边界情况设计测试用例,可以查出更多的错误。更多的错误。边界条件边界条件相对于输入与输出等价类直接在其边缘上,稍高相对于输入与输出等价类直接在其边缘上,稍高于或稍低于其边界的这些状态条件。于或稍低于其边界的这些状态条件。边界值分析方法与等价类划分方法的区别:边界值分析方法与等价类划分方法的区别:边界值不是从某个等价类中随便挑选一个作为代表,而边界值不是从某个等价类中随便挑选一个作为代表,而是选出一个或几个元素,使得这个等价类的每个边界都是选出一个或几个元素,使得这个等价类的每个边界都要作为测试对象;要作为测试对象;边界值分析不仅仅考虑输入条件,同时还要考虑输出条边界值分析不仅仅考虑输入条件,同时还要考虑输出条件(即输出等价类)。件(即输出等价类)。边界值分析方法选择测试用例的步骤边界值分析方法选择测试用例的步骤首先应确定边界情况。首先应确定边界情况。其次,选取测试数据。其次,选取测试数据。应当选取正好等于、刚刚大于或刚刚小于边界的值作应当选取正好等于、刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值为测试数据,而不是选取等价类中的典型值或任意值作为测试数据。作为测试数据。例例 边界值分析边界值分析模块模块bubblesort(a,n)bubblesort(a,n)是对数组是对数组a a中的中的n n个整型数从小到个整型数从小到大进行排序。大进行排序。假设假设n n为为1010。那么可以用。那么可以用5 5组数据进行测试:组数据进行测试:0 0个数据个数据1 1个数据个数据9 9个数据个数据1010个数据个数据1111个数据个数据(4 4)错误猜测法)错误猜测法 基本思想:基本思想: 根据经验或直觉推测程序中可能存在的各种错根据经验或直觉推测程序中可能存在的各种错误,从而有针对性地编写检查这些错误地测试误,从而有针对性地编写检查这些错误地测试用例。用例。 例:模块例:模块bubblesort(a,n)bubblesort(a,n)是对数组是对数组a a中的中的n n个整型个整型数从小到大进行排序。假设数从小到大进行排序。假设n n为为1010。那么可以用。那么可以用3 3组数据进行测试:组数据进行测试:0 0个数据个数据已经从小到大排好序的已经从小到大排好序的1010个数据个数据从大到小的从大到小的1010个逆序数据个逆序数据(5 5)因果图法)因果图法等价类划分和边界值分析方法,都是着重考虑输入条件,等价类划分和边界值分析方法,都是着重考虑输入条件,而未考虑输入条件之间的联系。如果在测试时必须考虑而未考虑输入条件之间的联系。如果在测试时必须考虑输入条件的各种组合则可能又会产生一些新的情况。输入条件的各种组合则可能又会产生一些新的情况。因此,必须考虑使用一种适合于多种条件组合的动态测因此,必须考虑使用一种适合于多种条件组合的动态测试方法,这就是因果图法试方法,这就是因果图法把输入条件视为把输入条件视为“因因”,把输出条件视为把输出条件视为“果果”,采用逻辑图的形式来表达功能,采用逻辑图的形式来表达功能说明书中输入条件的说明书中输入条件的各种组合各种组合与输出的关系。与输出的关系。 因果图方法最终生成的是判定表,它适合于检查程序输因果图方法最终生成的是判定表,它适合于检查程序输人条件的各种组合情况。人条件的各种组合情况。n因果图方法实例因果图方法实例某电力公司有某电力公司有A A、B B、C C、D D四类收费标准四类收费标准, ,并规定:并规定:居民用电居民用电 100100度度/ /月月 按按A A类收费类收费 100100度度/ /月按月按B B类收费类收费动力用电动力用电 1000010000度度/ /月月, ,非高峰非高峰, ,B B类收费类收费 1000010000度度/ /月月, ,非高峰非高峰, ,C C类收费类收费 1000010000度度/ /月月, , 高峰高峰, ,C C类收费类收费 1000010000度度/ /月月, , 高峰高峰, ,D D类收费类收费1 1I1I12 2B B4 4A AC C3 35 5D DI4I4I3I3I2I2居民用电居民用电动力用电100100度度/ /月月100001) AND (B=0) IF (A1) AND (B=0) THEN X:=X/A; THEN X:=X/A; IF (A=2)OR(X1) IF (A=2)OR(X1) THEN X:=X+1 THEN X:=X+1 END; END;入口入口返回返回A1 ANDB=0A=2 ORX1X=X/AX=X+1YYNNABX期望期望204红线判定覆盖判定覆盖期望结果应该有具体期望结果应该有具体的值,这里用有颜色的值,这里用有颜色的线表示。的线表示。测试数据如下表所示,测试数据如下表所示,满足判定覆盖准测。满足判定覆盖准测。入口入口返回返回A1 ANDB=0A=2 ORX1X=X/AX=X+1YYNNABX期期望望204红红线线111蓝蓝线线判定判定1判定判定2判定判定2判定判定1FTFT条件覆盖条件覆盖期望结果应该有具体期望结果应该有具体的值,这里用有颜色的值,这里用有颜色的线表示。的线表示。测试数据如下表所示,测试数据如下表所示,满足条件覆盖准测。满足条件覆盖准测。 ABX期望期望204红线红线111蓝线蓝线入口入口返回返回A1 ANDB=0A=2 ORX1X=X/AX=X+1YYNN判定判定1判定判定2判定判定2判定判定1A1B=0A=2X1FFTFTFTT判定判定/ /条件覆盖条件覆盖期望结果应该有具体期望结果应该有具体的值,这里用有颜色的值,这里用有颜色的线表示。的线表示。测试数据如下表所示,测试数据如下表所示,满足判定满足判定/ /条件条件覆盖准覆盖准测。测。 判定判定2判定判定1FTFTA1B=0A=2X1FFTFTFTT入口入口返回返回A1 ANDB=0A=2 ORX1X=X/AX=X+1YYNN判定判定1判定判定2ABX期望期望204红线红线111蓝线蓝线多重条件覆盖多重条件覆盖期望结果应该有具体的期望结果应该有具体的值,这里用有颜色的线值,这里用有颜色的线表示。表示。测试数据如下表所示,测试数据如下表所示,满足满足多重条件多重条件覆盖准测。覆盖准测。共共8 8种组合条件:种组合条件:(1)A1,B=0(1)A1,B=0(2)A1,B0(2)A1,B0(3)A1,B=0(3)A1,B=0(4)A1,B0(4)A1,B0(5)A=2,X1(5)A=2,X1(6)A=2,X1(6)A=2,X1(7)A2,X1(7)A2,X1(8)A2,X1(8)A2,X1入口入口返回返回A1 ANDB=0A=2 ORX1X=X/AX=X+1YYNNABX期望期望204(1)(5)红线红线211(2)(6)绿线绿线102(3)(7)绿线绿线111(4)(8)蓝线蓝线注意:测试数注意:测试数据对该情况并据对该情况并未测试到!未测试到!(5 5)路径覆盖测试举例)路径覆盖测试举例结点覆盖:相当于语句覆盖结点覆盖:相当于语句覆盖边覆盖:相当于判定覆盖边覆盖:相当于判定覆盖路径覆盖:每条可能的路径路径覆盖:每条可能的路径至少执行一次。如有循环至至少执行一次。如有循环至少进入一次。少进入一次。路径覆盖测试举例路径覆盖测试举例将流程图转换为程序图。将流程图转换为程序图。确定路径。确定路径。测试数据如下表所示,测试数据如下表所示,满足满足路径路径覆盖准测。覆盖准测。路径路径覆盖准测是相当强的一种覆覆盖准测是相当强的一种覆盖准则。盖准则。ABX期望期望204红线红线112黑线黑线102黄线黄线111蓝线蓝线 路径测试的特征路径测试的特征满足结构测试的最低要求:即满足满足结构测试的最低要求:即满足“完全覆完全覆盖盖”。完全覆盖(白盒测试的最低要求):完全覆盖(白盒测试的最低要求):完全覆盖完全覆盖: :语句覆盖判定覆盖语句覆盖判定覆盖满足路径覆盖即满足完全覆盖满足路径覆盖即满足完全覆盖完全覆盖被认为是白盒测试的最低要求。完全覆盖被认为是白盒测试的最低要求。有利于安排循环路径的测试有利于安排循环路径的测试综合例子综合例子 一个程序(由一个程序(由小到大对数组排序)小到大对数组排序)如右图。要求:如右图。要求:画出程序流程图画出程序流程图将程序流程图转换为程将程序流程图转换为程序图序图计算该程序图的环域复计算该程序图的环域复杂度杂度用白盒法设计测试用例用白盒法设计测试用例使其分别满足使其分别满足语句覆盖准则语句覆盖准则判定覆盖准则判定覆盖准则用边界值分析法设计用用边界值分析法设计用例例用猜测法设计测试用例用猜测法设计测试用例sort(int a ,int n)sort(int a ,int n) int i,j,temp; int i,j,temp; for (i=0;in;i+) for (i=0;in;i+) for (j=0;jn-1-i;j+) for (j=0;jaj+1) if (ajaj+1) temp=aj; temp=aj; aj=aj+1; aj=aj+1; aj+1=temp; aj+1=temp; 解解程序流程图程序流程图程序图程序图环域复杂度环域复杂度V(G)=m-n+2(连通图)连通图) =12-10+2 =4V(G)=m-n+2 =M-N+1 (强连通图)强连通图) =13-10+1V(G)=判定结点数判定结点数1 =3+1=4V(G)即为独立路径数。即为独立路径数。请补冲路径覆盖准则的请补冲路径覆盖准则的测试。测试。入口入口返回返回injaj+1Yi=i+1j=j+1Y解(续)解(续)设计测试用例使其满足设计测试用例使其满足语句、判定覆盖准则语句、判定覆盖准则A=6,4,n=2A=6,2,4,n=3用边界值分析法设计测用边界值分析法设计测试用例试用例A=4,n=1先 给先 给 A 赋 值赋 值 6 个 数 ,个 数 ,A=8,4,6,5,7,1,但令但令n=7先 给先 给 A 赋 值赋 值 6 个 数 ,个 数 ,A=8,4,6,5,7,1,但令但令n=5用猜测法设计测试用例用猜测法设计测试用例A=8,7,6,5,4,3,n=6A=1,2,3,4,5,6,n=6入口入口返回返回injaj+1Yi=i+1j=j+1Y6.5 6.5 软件测试的基本过程软件测试的基本过程单元单元测试测试单元单元测试测试单元单元测试测试被测被测模块模块被测被测模块模块集成集成测试测试设计设计信息信息已测试已测试的模块的模块确认确认测试测试已集成已集成的模块的模块软件软件需求需求系统系统测试测试已确认已确认的软件的软件可交付可交付的软件的软件系统其系统其他元素他元素(1 1)单元测试)单元测试单元测试的目的单元测试的目的在于发现各模块内部可能存在的各种差错,表明模在于发现各模块内部可能存在的各种差错,表明模块与其规范相矛盾。块与其规范相矛盾。单元测试的优点单元测试的优点:便于错误的定位便于错误的定位单元测试需要从程序的内部结构出发设计测试单元测试需要从程序的内部结构出发设计测试用例。用例。为提高效率,单元测试可以并行地独立进行。为提高效率,单元测试可以并行地独立进行。单元测试的内容单元测试的内容 模块模块模块接口测试模块接口测试局部数据结构测试局部数据结构测试重要路径测试重要路径测试错误处理测试错误处理测试边界条件测试边界条件测试I/O I/O 参数值的个数、类参数值的个数、类型、次序、格式是否正型、次序、格式是否正确,确,I/OI/O文件属性、操作文件属性、操作是否正确等。是否正确等。数据说明是否正确、数据说明是否正确、一致,变量及其初一致,变量及其初值定义是否正确等。值定义是否正确等。检查检查“错误处错误处理程序理程序”本身本身的错误。的错误。边界条件常包括循环边边界条件常包括循环边界,最大最小值、控制界,最大最小值、控制流中等于、大于、小于流中等于、大于、小于的比较值等。的比较值等。重要重要路径通常是指完成路径通常是指完成模块功能的主要路径,模块功能的主要路径,一般是控制结构。一般是控制结构。单元测试的单元测试的“测试环境测试环境”考虑到被测模块与其它模块的联系,因此测试考虑到被测模块与其它模块的联系,因此测试时需要使用两类辅助模块(驱动模块、桩模块)时需要使用两类辅助模块(驱动模块、桩模块)来模拟其他模块。来模拟其他模块。驱动模块和驱动模块和桩模块桩模块驱动模块:驱动模块:模拟调用程序功能,用于向被测模块传递模拟调用程序功能,用于向被测模块传递数据,接收、打印从被测模块返回的数据。数据,接收、打印从被测模块返回的数据。桩模块:桩模块:用于模拟那些由被测模块所调用的下属模块用于模拟那些由被测模块所调用的下属模块功能。功能。驱动模块和桩模块的编写会给测试带来额外开销。因驱动模块和桩模块的编写会给测试带来额外开销。因为它们在软件交付时不做为产品的一部分一同交付,为它们在软件交付时不做为产品的一部分一同交付,而它们的编写需要一定的工作量。而它们的编写需要一定的工作量。特别是桩模块,不能只简单地给出特别是桩模块,不能只简单地给出“曾经进入曾经进入”的信的信息。为了能够正确地测试软件,桩模块可能需要模拟息。为了能够正确地测试软件,桩模块可能需要模拟实际子模块的功能,否则被测模块可能失败。实际子模块的功能,否则被测模块可能失败。(2 2)集成测试)集成测试单元测试进行完之后,就可以根据设计规定的软件体单元测试进行完之后,就可以根据设计规定的软件体系结构,将经过单元测试的模块组装成具有良好一致系结构,将经过单元测试的模块组装成具有良好一致性的结构完整的程序。性的结构完整的程序。集成测试的目的集成测试的目的主要针对软件的结构设计,发现模块联接过程中出现的问题主要针对软件的结构设计,发现模块联接过程中出现的问题(即界面问题),以及集成后的模块的功能是否符合预定的功(即界面问题),以及集成后的模块的功能是否符合预定的功能等。能等。测试的主要内容测试的主要内容参数的个数、顺序、名称、传递方式、范围、类型等是否正确参数的个数、顺序、名称、传递方式、范围、类型等是否正确穿越模块接口的数据是否会丢失穿越模块接口的数据是否会丢失; ;各个子功能组合起来,能否达到预期要求的父功能;各个子功能组合起来,能否达到预期要求的父功能;一个模块是否会对另一个模块的功能产生不利的影响;一个模块是否会对另一个模块的功能产生不利的影响;全局数据结构全局数据结构, ,数据库接口是否有问题;数据库接口是否有问题;单个模块的误差积累是否会放大,达到不可接受的程度。单个模块的误差积累是否会放大,达到不可接受的程度。 集成测试的实施集成测试的实施对于单元测试需要考虑的问题:对于单元测试需要考虑的问题:对每个模块独立进行单元测试,然后集成?(非增对每个模块独立进行单元测试,然后集成?(非增量式)量式)把一个待测模块组合到已经测试过的那些模块中?把一个待测模块组合到已经测试过的那些模块中? (增量式)(增量式)增量式集成测试:增量式集成测试:自顶向下测试自顶向下测试由底向上测试由底向上测试混合方式测试:是前面混合方式测试:是前面2 2种方式的结合。种方式的结合。自顶向下测试自顶向下测试将模块按系统体系结构,沿控制层次自顶向下进行集成。将模块按系统体系结构,沿控制层次自顶向下进行集成。由底向上测试由底向上测试从最底层模块开始组装和测试。从最底层模块开始组装和测试。不同集成策略的比较不同集成策略的比较自顶向下集成测试自顶向下集成测试优点优点较早地验证了主要的控制和判断点。如果主要控制有问题,尽早发较早地验证了主要的控制和判断点。如果主要控制有问题,尽早发现它能够减少以后的返工。现它能够减少以后的返工。功能可行性较早得到证实,还能够给开发者和用户带来成功的信心。功能可行性较早得到证实,还能够给开发者和用户带来成功的信心。缺点缺点需编制较多的桩模块,工作量较大,且桩模块很难真实模拟实际模需编制较多的桩模块,工作量较大,且桩模块很难真实模拟实际模块全部功能,部分测试内容只能在换上真实模块后再补充测试。块全部功能,部分测试内容只能在换上真实模块后再补充测试。使用较多的桩模块也增加了设计测试用例的困难。使用较多的桩模块也增加了设计测试用例的困难。由底向上集成测试由底向上集成测试优点优点设计测试用例较容易。设计测试用例较容易。缺点缺点主要的控制和判断点的验证较迟,功能可行性较不能较早得到证实,主要的控制和判断点的验证较迟,功能可行性较不能较早得到证实,存在着返工较大的风险。存在着返工较大的风险。(3 3)确认测试)确认测试 确认测试必须有用户积极参与,或者以用户为主确认测试必须有用户积极参与,或者以用户为主进行。进行。 目的:目的:确认组装完毕的程序是否满足确认组装完毕的程序是否满足SRSSRS的要求的要求 。n 确认测试内容确认测试内容1)1)有效性测试有效性测试 用黑盒测试来验证软件功能与需求是用黑盒测试来验证软件功能与需求是否一致;否一致;2)2)配置复审配置复审 目的是保证软件配置的所有元素(文目的是保证软件配置的所有元素(文档、报告、程序、表格、数据)都已经档、报告、程序、表格、数据)都已经被正确地开发和分类;被正确地开发和分类; Alpha Alpha 测试和测试和BetaBeta测试测试 如果一个软件是为大众开发的如果一个软件是为大众开发的, , 让每个客户都让每个客户都进行正式的验收测试是不现实的。进行正式的验收测试是不现实的。 Alpha Alpha 测试测试: :是开发者在场进行指导的情况下,是开发者在场进行指导的情况下,用户进行的测试。由开发者用户使用中出现的错误用户进行的测试。由开发者用户使用中出现的错误和其它问题。和其它问题。 BetaBeta测试:测试:是用户在自己的场所进行的测试。是用户在自己的场所进行的测试。由用户记录遇到的问题,并定期报告给开发者。由用户记录遇到的问题,并定期报告给开发者。 只有当只有当Alpha Alpha 测试达到一定的可靠程度时,才测试达到一定的可靠程度时,才能开始能开始BetaBeta测试测试(4 4)系统测试)系统测试 系统测试,是将通过确认测试的软件,系统测试,是将通过确认测试的软件,与计算机硬件、外,与计算机硬件、外设、某些支持软件、数据和人员等其它系统元素结设、某些支持软件、数据和人员等其它系统元素结合在一起,合在一起,对计算机系统进行,对计算机系统进行一系列的组装测试和确认测试。一系列的组装测试和确认测试。 系统测试的目的在于系统测试的目的在于。 系统测试的种类系统测试的种类批量测试:让程序处理大量的数据。批量测试:让程序处理大量的数据。强度测试:短时间内处理最多的数据。强度测试:短时间内处理最多的数据。可使用性测试:力图发现使用上的问题或人为因素。可使用性测试:力图发现使用上的问题或人为因素。性能测试:在一定负荷下的响应时间及处理速度。性能测试:在一定负荷下的响应时间及处理速度。存储量测试:程序所需内、外、临时文件的大小。存储量测试:程序所需内、外、临时文件的大小。配置测试:每一类硬件的配置都要测试。配置测试:每一类硬件的配置都要测试。可修改性测试可修改性测试可靠性测试可靠性测试安全性测试安全性测试可恢复性测试可恢复性测试6.6 6.6 软件纠错软件纠错(1 1)程序错误的类型)程序错误的类型语法错误:语法错误:编译编译是发现语法错误的最好工具。是发现语法错误的最好工具。结构性错误:结构性错误:包括:结构异常、结构不全、结构多余等错误。包括:结构异常、结构不全、结构多余等错误。结构性错误可以通过代码评审发现,也可以通过专门工具对代结构性错误可以通过代码评审发现,也可以通过专门工具对代码作码作静态分析静态分析来发现。来发现。而编译是不能发现结构性错误的。而编译是不能发现结构性错误的。功能性错误:程序功能与用户需求不相符合的错误。功能性错误:程序功能与用户需求不相符合的错误。产生功能性错误的原因:产生功能性错误的原因:需求规格说明不清晰;需求规格说明不清晰;或设计时对需求理解有错。或设计时对需求理解有错。 功能性错误主要通过功能性错误主要通过动态测试动态测试来发现。接口错误:来发现。接口错误:(1 1)程序错误的类型(续)程序错误的类型(续)接口错误:接口错误的主要症状有接口错误:接口错误的主要症状有对全局变量的引用不当;对全局变量的引用不当;调用子程序或函数时实际参数的类型、个数、顺序与形式参数调用子程序或函数时实际参数的类型、个数、顺序与形式参数不一致;不一致;模块对全局性数据的说明相互矛盾。模块对全局性数据的说明相互矛盾。接口错误是接口错误是集成测试集成测试所检测的重点(即主要通过集成测试发所检测的重点(即主要通过集成测试发现),也可以通过代码评审发现。现),也可以通过代码评审发现。系统错误:与被测软件程序赖以运行的计算机系统有系统错误:与被测软件程序赖以运行的计算机系统有关的、影响程序的测试与运行的情况。分为:关的、影响程序的测试与运行的情况。分为:系统本身有错的情况;系统本身有错的情况;对系统使用不当的情况。对系统使用不当的情况。(2 2)软件纠错)软件纠错 软件纠错也称为软件调试。软件纠错也称为软件调试。软件纠错与软件测试不同。软件纠错与软件测试不同。软件测试的目的是尽可能多地发现软件中的错误。软件测试的目的是尽可能多地发现软件中的错误。进一步诊断和改正程序中潜在的错误,则是纠错的任务。进一步诊断和改正程序中潜在的错误,则是纠错的任务。软件纠错活动由两部分组成:软件纠错活动由两部分组成: 确定程序中可疑错误的确切性质和位置。确定程序中可疑错误的确切性质和位置。 对程序(设计,编码)进行修改,排除这个错误。对程序(设计,编码)进行修改,排除这个错误。软件纠错的基本方法软件纠错的基本方法插入显示插入显示/ /打印语句,显示程序执行的中间结果、相打印语句,显示程序执行的中间结果、相关变量的内容;关变量的内容;设置断点,以便查看程序运行的轨迹设置断点,以便查看程序运行的轨迹如设置某个断点后,程序并未停下来(即表明该程序段并没有如设置某个断点后,程序并未停下来(即表明该程序段并没有运行);运行);检查断点处的数据状态、变量值等。检查断点处的数据状态、变量值等。掩