1.26k likes | 1.41k Views
14.1 软件测试的基础知识 14.2 软件测试技术 14.2.1 白盒测试 1. 逻辑覆盖 教学目的:了解软件测试的基本知识。掌握逻辑覆盖测 试技术。 教学重点:软件测试的步骤和常见错误类型、逻辑覆 盖。 教学难点:软件测试的步骤、逻辑覆盖。 教 具:多媒体教室、电子教案 作 业:. 第 14 章 软件测试. 软件测试是对软件规格说明、软件设计和编码的最全面也是最后的审查。
E N D
14.1 软件测试的基础知识 14.2 软件测试技术14.2.1 白盒测试 1. 逻辑覆盖 教学目的:了解软件测试的基本知识。掌握逻辑覆盖测 试技术。 教学重点:软件测试的步骤和常见错误类型、逻辑覆 盖。 教学难点:软件测试的步骤、逻辑覆盖。 教 具:多媒体教室、电子教案 作 业: 第14章 软件测试
软件测试是对软件规格说明、软件设计和编码的最全面也是最后的审查。软件测试是对软件规格说明、软件设计和编码的最全面也是最后的审查。 通过软件测试,可以发现软件中绝大部分潜伏的错误,从而可以大大提高软件产品的正确性、可靠性,进而可显著提高产品质量。 统计表明,软件测试工作往往占软件开发总工作量的40%以上。甚至3~5倍以上。 第14章 软件测试
本章将介绍: 软件测试的基本知识; 软件测试的常用方法和技术; 软件测试的过程; 软件的调试与排错技术; 软件测试的工具。 第14章 软件测试
14.1 软件测试的基本知识 14.2 软件测试技术 14.3 软件测试过程 14.4 调试 14.5 测试工具 第14章 软件测试
软件测试是执行程序发现并排除程序中潜伏的错误的过程。软件测试是执行程序发现并排除程序中潜伏的错误的过程。 软件测试是软件投入运行前,对软件需求分析、设计、实现的强有力的最终审查。 14.1 软件测试的基本知识
测试用例——为了进行有效的测试而设计的输入数据和预期的输出结果数据。测试用例——为了进行有效的测试而设计的输入数据和预期的输出结果数据。 Myers在其软件测试著作中对软件测试的目标提出以下观点: ①软件测试是为了发现错误而运行程序的过程; ②一个好的测试用例能够发现至今尚未发现的 错误; ③一个成功的测试是发现了至今尚未发现的错 误的测试。 14.1.1 软件测试的目标与原则
①应尽早和不断地进行软件“测试”,即将这种“测试”贯穿于软件开发的各个阶段,坚持各个阶段的技术评审,以便尽早地发现和预防错误。①应尽早和不断地进行软件“测试”,即将这种“测试”贯穿于软件开发的各个阶段,坚持各个阶段的技术评审,以便尽早地发现和预防错误。 ②测试用例中,不仅要选择合理的输入数据,还要选择不合理的输入数据。 ③在开发各阶段应事先分别制定出相应的测试计划,在测试开始后应严格执行,防止随意性。 ④对发现错误较多的程序模块,应进行重点测试。Pareto指出,测试发现错误的80%集中在20%的模块中。发现错误较多的模块质量较差,需重点测试,并要测试是否引入了新的错误。 测试原则
⑤避免程序员测试自己的程序。 测试用例的设计应有第三方参与。对于大型软件的测试,一般的做法是:设计者与测试者共同完成单元测试任务,而综合测试由专门的测试机构负责,有时其中也可以有设计者参加 ⑥用穷举测试是不现实的,一般通过设计测试用例,充分覆盖所有条件或所有语句即可。 ⑦长期妥善保存测试计划、测试用例、出错统计和有关的分析报告。 测试原则
图14-1-1 测试步骤 14.1.2 软件测试的步骤 部件 代码 单元测试 系统 功能需求 用户需求 规格说明 其他 软件需求 用户 环境 设计 规格说明 部件 代码 单元测试 安装测试 集成测试 功能测试 性能测试 验收测试 … 功能 系统 集成后 的模块 被接受 的系统 验证, 生效的 软件 测试后 的模块 部件 代码 单元测试 在使用中的系统
在本书中,从软件工程的角度: 将单元测试与详细设计对应起来,即在详细设计阶段就应制定出单元测试计划; 而集成测试又称为综合测试,可以把概要设计和集成测试对应起来,在概要设计阶段就可以制定集成测试计划; 将功能测试、性能(行为)测试、验收测试统称为验收测试(也称确认测试),与软件系统需求分析阶段对应起来,在需求分析阶段就应制定出验收准则和验收测试计划,验收测试应提交经用户确认的软件产品; 最后,将软件、硬件等要素构成一个完整的基于计算机的系统,再进行系统测试,使系统测试与系统定义相对应,即在系统定义阶段就应制定系统测试计划。 14.1.2 软件测试的步骤
图14-1-2 软件工程的开发与测试的关系 14.1.2 软件测试的步骤 系统工程 需求分析 概要设计 设计、编码 单元测试 集成测试 验收测试 系统测试
图14-1-3 测试阶段的信息流 14.1.3 测试阶段的信息流 正确的程序 软件配置 排错 错误 测试结果 测试 评价 可靠性预测 可靠性 模型 测试配置 错误统计 预期结果
测试的输入流有软件配置和测试配置。 软件配置由需求规格说明、设计说明、源代码等组成; 测试配置包括测试计划、测试用例(其中包括预期的结果)、测试工具等组成。 14.1.3 测试阶段的信息流
经常发现严重的错误并需要修改软件,则软件的质量和可靠性一定不高,需要进一步测试;经常发现严重的错误并需要修改软件,则软件的质量和可靠性一定不高,需要进一步测试; 如果测试所发现的错误不多且易于改正,软件功能看起来也较完善,则需考虑两种可能: 1)软件质量和可靠性确实令人满意; 2)测试不全面,很可能还潜伏着严重错误; 如果测试过程没有发现任何错误,则很有可能是测试配置不合理。 测试结果评价
1.静态测试 静态测试是采用人工检测和计算机辅助静态分析的方法对程序进行检测。 人工检测是指靠人工走查程序或评审软件。这种走查与评审主要针对编码的质量和软件开发各个阶段的文档,特别是总体设计和详细设计阶段的错误。能发现30%~70%的逻辑设计和编码错误。 计算机辅助静态分析是指利用静态分析软件工具对程序进行静态分析,主要检测变量是否用错、参数是否匹配、循环嵌套是否有错、是否有死循环和永远执行不到的死代码等等。同时,它还可对程序的特性进行分析。 14.1.4 软件测试的常用方法
2.动态测试 动态测试是指事先设计好一组测试用例,然后通过运行程序来发现错误。 动态测试有两种测试方法: 黑盒测试; 白盒测试。 14.1.4 软件测试的常用方法
黑盒测试,又称为功能测试——把被测的程序模块看成一个黑匣子,即完全不考虑程序的内部结构和处理过程,测试仅在程序的接口上进行。 白盒测试——把被测的程序看成一个透明的白匣子,即完全了解程序的内部结构和详细的处理过程,测试是在程序的内部结构上进行。即要求针对每一条逻辑路径都要设计测试用例,检查每一个分支和每一次循环的情况。 14.1.4 软件测试的常用方法
穷举测试是不现实的。如上图,设循环体应执行30次,循环体中有4个独立的分支,则最多有4 30 ≈ 10 18个逻辑路径,假设每运行一个测试用例平均花费1毫秒,则需花费3千多万年。一般选用少量最有效的测试用例,以便覆盖每一个条件、每一个路径和每一个语句,从而以最少的代价发现尽可能多的错误。 开始 结束
按照错误的影响和造成的后果进行分类,可分为:较小错误,中等错误,较严重错误,严重错误,非常严重的错误,最严重的错误。按照错误的影响和造成的后果进行分类,可分为:较小错误,中等错误,较严重错误,严重错误,非常严重的错误,最严重的错误。 按照软件生存周期各个阶段分类,可分为:问题定义错误、需求分析规格说明错误、设计错误、编码错误等等。 这里重点介绍一种按照错误的性质和范围进行分类的方法,可以将错误分为如下几类: 14.1.5 软件测试中常见的错误类型
1.功能错误 ①需求规格说明错误。主要是指其中有错误、多余或遗漏的功能,有二义性或自相矛盾。 ②设计实现错误。设计或实现的功能不是规格说明或用户所要求的功能。 按照错误的性质和范围进行分类
2.系统错误 ①外部接口错误。如与打印机的接口错误。 ②内部接口错误。指各程序模块间的联系存在错误。如输入/输出、数据保护、子程序访问等。 ③硬件结构错误。如错误地理解I/O指令、中断处理、设备启动和初始化等而引起的错误。 ④软件结构错误。由于软件结构不合理或不清晰所引起的错误。往往在系统满载时才能发现。 ⑤操作系统错误。该类错误是由于不了解操作系统而引起的,操作系统本身也有错误。 ⑥控制与顺序错误。包括事件的时间顺序不正确、等待一个不可能发生的事件等等。 ⑦资源管理错误。既资源使用不当。资源死锁等。 按照错误的性质和范围进行分类
3.加工错误(算法错误) ①计算与操作错误。指计算、函数求值和一般操作过程中的错误。 ②初始化错误。如忘记了初始化工作区、数据区,错误地对循环变量赋初值,不正确的初始化等等。 ③局部控制和次序错误。如遗漏路径、不可达到的代码段、循环嵌套或终止条件不正确、死循环等等。 ④逻辑错误。如多分支、判断条件不正确等。 按照错误的性质和范围进行分类
4.数据错误 ①动态数据错误。 ②静态数据错误。静态数据指直接或间接地出现在程序或数据库中的数据,其内容和格式都是固定的。因此在内容或格式上都可能存在错误。 ③数据内容错误。是指由于内容被破坏或被错误地解释而造成的错误。 ④数据结构错误。包括数据结构说明错误和数据结构使用错误。 ⑤数据属性错误。数据属性是指数据内容的含义或语义,如整数、字符等。数据属性错误是指对数据属性的错误解释和错误使用而导致的错误。 按照错误的性质和范围进行分类
5.代码错误 代码错误主要包括语法错误、键入错误、对语句的理解错误等。 例如,Myers(1976)指出,美国第一个去金星的太空任务的失败是由于在一个Fortran do循环中缺少一个逗号。 按照错误的性质和范围进行分类
白盒测试的原则是: ①保证程序中每一独立的路径至少执行一次; ②保证所有判定的每一个分支至少执行一次; ③保证每个判定表达式中每个条件的所有可能结果至少出现一次; ④保证每一循环都在边界条件和一般条件至少各执行一次; ⑤验证所有内部数据结构的有效性。 14.2 软件测试技术14.2.1 白盒测试
1.逻辑覆盖 逻辑覆盖是指设计测试用例对程序的内部分支逻辑结构进行部分或全部覆盖的技术。 1)语句覆盖 2)判定覆盖 3)条件覆盖 4)判定/条件覆盖 5)条件组合覆盖 6)路径覆盖 几种典型的白盒测试技术 逻辑覆盖
令x=2,y=0,z=4作为测试数据,程序执行路径为abcde,使语句段1和2各执行一次,实现了语句覆盖。它不能检测所有判定条件的错误。比如,错把z>1写成了z<1,则上述测试用例就无法检测出来了。令x=2,y=0,z=4作为测试数据,程序执行路径为abcde,使语句段1和2各执行一次,实现了语句覆盖。它不能检测所有判定条件的错误。比如,错把z>1写成了z<1,则上述测试用例就无法检测出来了。 1)语句覆盖 —使程序中的每个语句至少执行一次 开始 a T b (x>1) AND (y=0) 语句段1 F c T d 语句段2 (x=2) OR (z>1) F e 结束
判定覆盖是指设计足够多的测试用例,使每个判定的每种可能结果都至少出现一次,也就是使每个判定的每个分支都至少执行一次。判定覆盖是指设计足够多的测试用例,使每个判定的每种可能结果都至少出现一次,也就是使每个判定的每个分支都至少执行一次。 2)判定覆盖——分支覆盖
可以设计如下两组数据以满足判定覆盖: x=3,y=0,z=1(通过路径abce); x=2,y=1,z=2(通过路径acde)。 判定覆盖必然满足语句覆盖。覆盖程度仍然不高。比如,错把z>1写成了z<1,则上述测试用例仍无法检测出来。因为它只覆盖了全部路径的一半。判定覆盖可以推广到多分支情况。 开始 a T b (x>1) AND (y=0) 语句段1 F c T d 语句段2 (x=2) OR (z>1) F e 结束
条件覆盖是指设计足够的测试用例,使每个判定表达式中的每个条件的每种可能值都至少出现一次。条件覆盖是指设计足够的测试用例,使每个判定表达式中的每个条件的每种可能值都至少出现一次。 如图,共有4个条件:x > 1,y = 0,x = 2,z > 1。 条件覆盖要求设计测试用例,覆盖第一个判定表达式的x >1,y = 0,x ≤ 1,y≠0等各种结果,并覆盖第二个判定表达式的x = 2,z > 1,x ≠ 2,z ≤ 1等各种结果。 3)条件覆盖 开始 a T b (x>1) AND (y=0) 语句段1 F c T d (x=2) OR (z>1) 语句段2 F e 结束
设计如下两组测试用例,可以满足条件覆盖的标准: x=2,y=0,z=3 (覆盖x>1,y=0,x=2,z>1,通过路径abcde); x=1,y=1,z=1 (覆盖x≤1,y≠0,x≠2,z≤1,通过路径ace)。 3)条件覆盖 开始 a T b (x>1) AND (y=0) 语句段1 F c T d (x=2) OR (z>1) 语句段2 F e 结束
但是,如果设计如下一组测试用例: x=1,y=0,z=3 (覆盖x≤1,y=0,x≠2,z>1,通过路径acde); x=2,y=1,z=1 (覆盖x>1,y≠0,x=2,z≤1,通过路径ace)。 虽满足条件覆盖,但不满足语句覆盖和判定覆盖。 3)条件覆盖 开始 a T b (x>1) AND (y=0) 语句段1 F c T d (x=2) OR (z>1) 语句段2 F e 结束
它是指设计足够的测试用例,使得判定表达式中的每个条件都取到所有可能的值(即满足条件覆盖),并使每个判定表达式也都取到所有可能的判定结果(即满足判定覆盖)。它是指设计足够的测试用例,使得判定表达式中的每个条件都取到所有可能的值(即满足条件覆盖),并使每个判定表达式也都取到所有可能的判定结果(即满足判定覆盖)。 4)判定/条件覆盖
x=2,y=0,z=3 (覆盖x>1,y=0,x=2,z>1,通过路径abcde); x=1,y=1,z=1 (覆盖x≤1,y≠0,x≠2,z≤1,通过路径ace)。 4)判定/条件覆盖 开始 a T b (x>1) AND (y=0) 语句段1 F c T d (x=2) OR (z>1) 语句段2 F e 结束
条件组合覆盖是指设计足够的测试用例,使得每个判定表达式中条件的各种可能值的组合都至少出现一次。这是一种较强的逻辑覆盖。条件组合覆盖是指设计足够的测试用例,使得每个判定表达式中条件的各种可能值的组合都至少出现一次。这是一种较强的逻辑覆盖。 5)条件组合覆盖
如图,两个判定表达式中含有4个条件,共有8种组合: ①x>1,y=0; ②x>1,y≠0; ③x≤1,y=0; ④x≤1,y≠0; ⑤x=2,z>1; ⑥x=2,z≤1; ⑦x≠2,z>1;⑧x≠2,z≤1。 开始 a T b (x>1) AND (y=0) 语句段1 F c T d (x=2) OR (z>1) 语句段2 F e 结束
x=2,y=0,z=3; 覆盖条件组合①和⑤,通过路径abcde; x=2,y=1,z=1; 覆盖条件组合②和⑥,通过路径acde; x=0,y=0,z=3; 覆盖条件组合③和⑦,通过路径acde; x=1,y=1,z=1; 覆盖条件组合④和⑧,通过路径ace。但未通过路径abce。 开始 a T b (x>1) AND (y=0) 语句段1 F c T d (x=2) OR (z>1) 语句段2 F e 结束
路径覆盖是指设计足够的测试用例,以覆盖被测程序中所有可能的路径。路径覆盖是指设计足够的测试用例,以覆盖被测程序中所有可能的路径。 如图,共有4条路径,设计以下4组测试用例,就可以覆盖这4条路径: x=2,y=0,z=3;覆盖路径abcde x=2,y=1,z=1;覆盖路径acde x=1,y=1,z=1;覆盖路径ace x=3,y=0,z=1;覆盖路径abce 6)路径覆盖 开始 a T b (x>1) AND (y=0) 语句段1 F c T d (x=2) OR (z>1) 语句段2 F e 结束 没有覆盖条件组合③和⑦ ③x≤1,y=0 ⑦x≠2,z>1
在实际测试时,为了达到充分测试的目的,一般以条件组合覆盖为主设计测试用例,然后再补充部分测试用例,以便实现路径覆盖。在实际测试时,为了达到充分测试的目的,一般以条件组合覆盖为主设计测试用例,然后再补充部分测试用例,以便实现路径覆盖。 实际测试
14.2.1 白盒测试 14.2.2 黑盒测试 教学目的:掌握白盒、黑盒测试的概念和测试方 法步骤。 教学重点:基本路径测试、黑盒测试技术 教学难点:基本路径测试。 教 具:多媒体教室、电子教案 作 业: 14.2 软件测试技术
其主要思想是根据软件详细设计的过程性描述或源代码中的控制流程求出程序的环形复杂性度量,然后用此度量确定程序的基本路径集合,并由此导出一组测试用例来覆盖该集合中的每一个独立的路径,从而可以保证每个语句至少执行一次。其主要思想是根据软件详细设计的过程性描述或源代码中的控制流程求出程序的环形复杂性度量,然后用此度量确定程序的基本路径集合,并由此导出一组测试用例来覆盖该集合中的每一个独立的路径,从而可以保证每个语句至少执行一次。 14.2.1 白盒测试2.基本路径测试
【例14.1】试用基本路径测试法对如下的PDL描述或如图14-2-2所示的程序流程图设计测试用例。该例子描述了最多输入50个值(以–1作为输入结束标志),计算其中有效的学生分数的个数、总分数和平均值。【例14.1】试用基本路径测试法对如下的PDL描述或如图14-2-2所示的程序流程图设计测试用例。该例子描述了最多输入50个值(以–1作为输入结束标志),计算其中有效的学生分数的个数、总分数和平均值。 2.基本路径测试
PROCEDURE average INTERFACE RETURNS average,sum,n1;*n1为有效成绩的个数。* INTERFACE ACCEPTS score; TYPE score[1,50] IS SCALAR ARRAY; TYPE average,n1,n2,sum IS SCALAR;*n2为输入值的个数。* TYPE i IS INTEGER; i = 1;n1=n2=0;sum=0; DO WHILE (score[ i ]<> – 1)AND(n2<50) n2 加 1; IF (score[ i ]>=0)AND(score[ i ]<=100) THEN n1 加 1; sum = sum + score[ i ]; END IF; i 加 1; END DO; IF n1> 0 THEN average = sum/n1; ELSE average = – 1; END IF; END average
图14-2-2 过程average的程序流程图 开始 1 i =1,n1=n2=0,sum=0 2和3 F Score[ i ]<>-1 AND n2<50 4 T n2=n2+1 5和6 F Score[ i ]>0 AND score[i]<100 7 T n1=n1+1,sum=sum+score[i] 8 i = i +1 9 F T n1>0 11 10 average= – 1 average=sum/n1 12 返回
解:可按如下步骤设计测试用例: 步骤1:根据详细设计或代码导出过程average的流图。 【例14.1】 1 2 R4 9 3 4 R5 11 10 R3 5 12 6 R1 R6 R2 7 8
步骤2:据流图确定环形复杂性度量V(G): 1)V(G)=E – N +2 = 16 – 12 + 2 = 6 ; 其中E为流图中的边数,N为结点数; 2)V(G)= 6 (个区域); 3)V(G)= P + 1 = 5 + 1 = 6 ; 其中P为谓词结点的个数。在流图中,结点2、3、5、6、9是谓词结点。 【例14.1】
步骤3:确定基本路径集合(即独立路径集合)。一条独立路径是指,和其他的独立路径相比,至少引入一个新处理语句或一个新判断的程序通路。V(G)值正好等于该程序的独立路径的条数。于是可确定6条独立的路径:步骤3:确定基本路径集合(即独立路径集合)。一条独立路径是指,和其他的独立路径相比,至少引入一个新处理语句或一个新判断的程序通路。V(G)值正好等于该程序的独立路径的条数。于是可确定6条独立的路径: 路径1:1—2—…—2—9—10—12 路径2:1—2—9—11—12 路径3:1—2—3—9—10—12 路径4:1—2—3—4—5—8—2… 路径5:1—2—3—4—5—6—8—2… 路径6:1—2—3—4—5—6—7—8—2… 【例14.1】
步骤4:为每一条独立路径各设计一组测试用例,以便强迫程序沿着该路径至少执行一次。步骤4:为每一条独立路径各设计一组测试用例,以便强迫程序沿着该路径至少执行一次。 1)路径1的测试用例: score[k]=有效分数值,当k < i ; score[ i ]= – 1 , 2≤i≤50; 期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。 2)路径2的测试用例: score[ 1 ]= – 1 ; 期望的结果:average = – 1 ,其他量保持初值。 【例14.1】
3)路径3的测试用例: 输入多于50个有效分数,即试图处理51个分数,要求前51个为有效分数; 期望结果:n1=50、且算出正确的总分和平均分。 4)路径4的测试用例: score[ i ]=有效分数, 当i<50; score[ k ]<0 , k< i ; 期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。 【例14.1】
5)路径5的测试用例: score[ i ]=有效分数, 当i<50; score[ k ]>100 , k< i ; 期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。 6)路径6的测试用例: score[ i ]=有效分数, 当i<50; 期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。 【例14.1】