《编码与测试》PPT课件.ppt_第1页
《编码与测试》PPT课件.ppt_第2页
《编码与测试》PPT课件.ppt_第3页
《编码与测试》PPT课件.ppt_第4页
《编码与测试》PPT课件.ppt_第5页
已阅读5页,还剩174页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,第6章 编码与测试,6.1 编码 6.1.1 程序设计语言 6.1.2 程序设计风格及程序效率 6.1.3 编程工具及环境 6.2 测试 6.2.2 白盒测试技术(重难点) 6.2.3 黑盒测试技术(重难点) 6.3 小结,2,6.1.1 程序设计语言,一、程序设计语言的分类,3,二、程序设计语言的选择,程序设计语言的选择将影响人们思考、解决问题的方式, 影响软件的可靠件、可读性和可维护性。,完善、独立的编译系统:易于发现编码错误、便于程序调试和维护,降低成本。,模块化、良好的控制结构和数据结构:降低编码难度,提高程序可理解性、可测试性、可维护性,减少开发成本和周期。,4,二、程序设计语言的选择,5,一般语言的项目应用领域,6,6.1.2 程序设计风格及程序效率,在选择了合适的程序设计语言和保证程序正确的前提下,根据详细设计结果编写程序时还应注意使用某些编程技巧,力求使程序具有良好的风格和较高的效率。,7,一、程序设计风格/编码风格,程序设计风格/编码风格:是指在不影响程序正确性和效率的前提下,一个人编制程序时所表现出来的特点、习惯、逻辑思路等。,具有良好编码风格的程序主要表现为:,可读性好、易测试、易维护,8,良好程序设计风格包括:,1.源程序文档化在程序中加入说明性注释。 注释 不是可有可无。 一些正规的程序文本中,注释行的数量占到整个源程序的1/31/2,甚至更多。,程序中的注释按用途分两类: 序言性注释:一般位于模块首部。 功能性注释:位于源程序模块内部,对某些代码进行说明。,9,序言性注释,10,功能性注释,功能性注释嵌在源程序体 中,用以描述其后的语句或程序段做什么工作,或是执行了下面的语句会怎么样。 例如,以下注释不好: /* ADD AMOUNT TO TOTAL */ TOTAL = AMOUNTTOTAL 好的注释如下:注明把月销售额计入年度总额,便使读者理解了下面语句的意图: /* ADD MONTHLY-SALES TO ANNUAL-TOTAL */ TOTAL = AMOUNTTOTAL,11,2. 标识符的命名及说明,编程时,使用标识符定义模块名、变量名、常量名、函数名、程序名、过程名、数据区名、缓冲区名等。 (1)标识符命名注意的问题; (2)标识符类型说明要注意的问题。,12,(1)标识符命名要注意的问题,名字应有一定实际意义: 例如,表示次数用Times,表示总量用Total,表示平均值的用Average,表示总和用Sum等。 标识符名字一般不超过8个字符。 不同标识符的名字不能过分相似:例如Student和Students,很容易混淆。,13,(2)标识符类型说明要注意的问题,按某种顺序对各种类型的变量进行集中说明。 使用一个说明语句对同一类型的多个变量进行说明时,应按照变量名的字母顺序(az)对其进行排列。,14,在C+程序中数据说明次序 常量说明 简单变量类型说明 数组说明 公用数据块说明 所有的文件说明 类型说明中还可进一步要求。按如下顺序排列: 整型量说明 实型量说明 字符量说明 逻辑量说明,15,说明语句中变量安排有序,当多个变量名在一个说明语句中说明时,应当对这些变量按字母的顺序排列。带标号的全程数据也应当按字母的顺序排列。 例如: integer size, length, width, cost, price 以下顺序比较清楚: integer cost, length, price , size, width,16,3. 语句的构造及书写,构造语句时注意问题: 语句书写要简单、直接。 对于复杂的表达式,要使用括号使其清晰。 在条件表达式中,尽量不使用逻辑非运算。 尽量不使用强制转移语句GOTO。 不要书写太复杂的条件,嵌套重数不宜过多。 尽量使用编译系统提供的标准函数。 对于程序中需要重复出现的代码段,应将其定义成独立模块(函数或过程)实现。,17,3. 语句的构造及书写,书写语句格式要注意问题: 最好一行只写一个语句。 采用分层缩进格式使程序层次清晰。 不同模块代码间插入空行进行分隔。 在程序中注释段的周围加上边框。 对于程序中需要重复出现的代码段,应将其定义成独立模块(函数或过程)实现。,18,例如:恰当地利用空格,自然的程序段之间可用空行隔开; 例如 ,将表达式: (A17)ANDNOT(B49)ORC 写成 :(A17) AND NOT (B49) OR C,19,给注释段加边框,20,使用缩进,IF() THEN IF() THEN ELSE ENDIF ELSE ENDIF,21,4. 输入和输出,设计输入时要注意: 输入方式要简单,尽量减少用户的输入量。 交互式输入数据时应有必要的提示信息。 程序应对输入数据的合法性进行检查。 对于可能产生严重后果的输入操作,要求用户进行“确认”。 输入一批数据时,应以特殊标记作为数据输入结束的标志,而不要用户记忆输入个数。 根据系统特点和用户习惯设计出令用户满意的输入方式。,22,4. 输入和输出,设计输出时要注意: 输出数据的格式应清晰、美观。如对大量数据采用表格的形式输出,可以使用户一目了然。 输出数据时要加上必要的提示信息。例如,表格的输出一定要带有表头,用以说明表格中各项数据的含义。,23,二、程序效率,程序效率:指程序的运行速度和程序占用的存储空间。主要涉及处理时间和存储器容量两个方面。 软件的“高效率”:指用尽可能短的时间和尽可能少的存储空间,实现程序要求的所有功能。是程序设计追求的主要目标之一。 一个程序效率的高低取决于多个方面,主要包括需求分析阶段模型的生成、设计阶段算法的选择和编码阶段语句的实现。,24,1)用于提高运行速度的指导原则,简化算术表达式和逻辑表达式。 尽可能多采用执行时间短的算术运算。 尽量避免使用多维数组、指针、复杂数据类型。 尽量采用整型算术表达式和布尔表达式。 尽量减少循环体,特别是内循环中语句个数。 尽量使同一表达式中的数据类型保持统一。 应当对所有的输入和输出安排适当的缓冲区,以减少频繁通信所带来的额外开销。,25,2)用于优化存储空间的指导原则,对于变动频繁的数据最好采用动态存储。 采用存储单元共享等节约空间的技术。 选用具有紧缩存储器特性的编译程序,在必要时甚至可采用汇编语言。 采用结构化程序设计,将程序划分为大小合适的模块。一个模块或若干个关系密切的模块的大小最好与操作系统页面的容量相匹配,以减少页面调度的次数,提高存储效率。,26,6.1.3 编码工具及环境,经常使用一些编码工具: 选用合适的编译工具,可以大大方便编程,提高效率。 编译器提供者通常会提供程序的支持环境,也就是编写程序所使用的集成开发环境(IDE)。PSE(程序设计支持环境)完成程序编辑、编译、调试、配置管理、项目管理等一组任务。 例如:微软Visual Studio.NET集成开发环境。,27,6.2 测试,6.2.1 软件测试的基本概念 6.2.2 白盒测试技术(重难点) 6.2.3 黑盒测试技术(重难点) 6.2.4 软件测试阶段 6.2.5 面向对象软件测试 6.2.6 软件测试工具 6.2.7 软件测试文档,28,软件测试,软件测试: 是为了发现错误而执行程序的过程。 发现错误是为了更正错误,最终得到一个高质量的软件系统。,29,6.2.1 软件测试的基本概念,一、软件测试的发展历史及趋势 二、有关软件测试的基本术语 三、软件测试的重要性 四、软件测试的分类 五、软件测试的基本原则,30,一、软件测试的发展历史及趋势,软件测试的发展历史分为三个阶段: 20世纪60年代以前,软件规模很小、复杂程度低,软件开发的过程随意。 20世纪70年代,提出软件工程概念。软件测试仅限于基本功能验证和Bug搜寻。 20世纪80年代以后,软件趋向大型化。软件测试有了行业标准(IEEE/ANSI),成为一个专业,需要运用专门的方法和手段,由专门人才和专家来承担。,31,二、软件测试的基本术语,1.软件测试: 为了发现错误而执行程序的过程。测试目的 确认程序做了它应该做的事情。 确认程序正确实现了要求的功能。 以评价程序或系统的属性、功能为目的的活动。 对软件质量的度量。 验证系统满足要求,或确认实际结果与预期结果之间的差别。将重点放在预期结果上。,用户满意程度,强调评估软件质量,32,软件测试的标准定义:,1983年IEEE (国际电子电气工程师协会)提出的软件测试的定义,比较全面反映了软件测试的重点与难点。 软件测试是使用人工或自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或是弄清预期结果与实际结果之间的差别。,33,2. 软件缺陷,关于软件缺陷的标准定义如下: 从产品内部看,是软件产品开发或维护过程中所存在的错误、毛病等各种问题; 从外部看,是系统所需实现的某种功能的失效或违背。,34,软件缺陷的具体表现,五条规则作为软件缺陷的具体表现: 软件未达到需求规格说明书中指明的功能。 软件出现了需求规格说明书中指明不会出现的错误。 软件功能超出需求规格说明书中指明的范围。 软件未达到需求规格说明书中虽未指出但应达到的目标。 软件测试员认为软件难以理解、不易使用、运行速度缓慢,或者最终用户认为不好。,35,3. 测试用例,简单来讲:是指执行条件和预期结果的集合; 完整来讲:是针对要测试的内容所确定的一组输入信息,是为达到最佳的测试效果或高效地揭露隐藏的错误而精心设计的少量测试数据。 IEEE Standard 610(1990)给出的定义为:是一组测试输入、执行条件和预期结果的集合,目的是要满足一个特定的目标,比如执行一条特定的程序路径或检验是否符合一个特定需求。,测试用例设计的难点:如何通过少量测试数据来有效揭示软件缺陷。,36,三、软件测试的重要性,软件测试工作量通常占软件开发总工作量的40%以上; 软件测试费用占软件开发总费用的近1/2; 对于一些与人的生命安全相关的软件,如飞行控制、核反应堆监控软件等,其测试费用可能相当于软件工程其他步骤总成本的35倍。,37,软件测试重要性的具体体现:,软件测试的重要性具体体现在以下几个方面: 1)寻找软件错误,以便进行修正; 2)从开发方角度,向用户证明软件符合要求,是可用的(测试 ); 3)从用户角度,验证软件是否符合用户的真实需求(测试); 4)指导软件开发过程,修正软件开发规则; 5)提供软件的相关特征,提供测试数据即结果对软件质量进行细化和量化,为软件可靠性分析提供依据。,38,四、软件测试的分类,按照是否需要查看代码分: 黑盒测试,白盒测试 按是否需要执行被测软件分: 静态测试,动态测试 按测试阶段分: 单元测试,集成测试,确认测试,系统测试,验收测试 按测试时是否需要人工干预分: 手工测试,自动测试 其他测试类型: 冒烟测试,随机测试,回归测试,基线测试,39,静态测试方法,对软件进行分析、检查和审阅,不实际运行被测试软件。 对需求规格说明书、软件设计说明书、源程序做检查和审阅,包括: 是否符合标准和规范; 通过结构分析、流图分析、符号执行指出软件缺陷。 约可找出3070%的逻辑设计错误。,40,动态测试方法,是指通过运行程序发现错误。 动态测试的两个基本要素: 被测试程序 测试数据(测试用例) 黑盒测试、白盒测试都是动态测试。,41,单元测试:又称模块测试,是指对软件中的最小可测试单元进行测试。 集成测试:又称组装测试,是在单元测试的基础上,按照设计要求,将通过单元测试的单元组装成系统或子系统而进行的有序的测试。 确认测试:又称有效性测试,将经过集成测试后的单元模块组装成为完整的软件系统,消除了接口的错误。,42,系统测试:为了验证系统是否达到其原始目标,而对集成的硬件和软件系统进行的测试,是在真实或模拟系统运行的环境下,检查完整的程序系统是否能和系统正确配置、连接,并满足用户需求。 验收测试:又称接受测试,是一种正式的测试,以用户测试为主,或有测试人员等质量保证人员共同参与的测试。,43,手工测试:完全由人工完成测试工作,包括测试计划的制订,测试用例的设计和执行,以及测试结果的检查和分析等。传统的测试工作都是由人工来完成的。 自动测试:各种测试活动的管理和实施,都是使用自动化测试工具或自动化测试脚本来进行的测试,包括测试脚本的开发与执行等,以某种自动测试工具来验证测试需求。这类测试在执行过程中一般不需要人工干预,通常在功能测试、回归测试和性能测试中使用较广泛。,44,五、软件测试的基本原则,(1)尽早地并不断地进行软件测试。 (2)程序员或程序设计机构应避免测试自己设计的程序。 (3)测试用例中不仅要有输入数据,还要有与之对应的预期结果。 (4)测试用例的设计不仅要有合法的输入数据,还要有非法的输入数据。 (5)在对程序修改之后要进行回归测试。,45,五、软件测试的基本原则,(6)程序中尚未发现的错误的数量通常已发现的错误的数量成正比。 (7)妥善保留测试计划、全部测试用例、出错统计和最终分析报告,并把它们作为软件的组成部分之一,为维护提供方便。 (8)应当对每一个测试结果做全面检查。 (9)严格执行测试计划,排除测试的随意性。,46,6.2.2 白盒测试,又称结构测试或逻辑驱动测试,是一种透明的测试技术。它以程序内部逻辑结构为基础来设计测试用例。其原则是: 保证程序中的所有独立路径至少执行一次; 保证所有判定的每一个分支至少执行一次; 保证每个判定表达式中每个条件的所有可能结果至少执行一次; 保证每个循环都在边界条件和一般条件至少各执行一次; 验证所有内部数据结构的有效性。,47,6.2.2 白盒测试,又称结构测试或逻辑驱动测试,是一种透明的测试技术。它以程序内部逻辑结构为基础来设计测试用例。其原则是:,保证程序中的所有独立路径至少执行一次; 保证所有判定的每一个分支至少执行一次; 保证每个判定表达式中每个条件的所有可能结果至少执行一次; 保证每个循环都在边界条件和一般条件至少各执行一次; 验证所有内部数据结构的有效性。,48,典型白盒测试技术,逻辑覆盖:以程序内部的逻辑结构为基础设计测试用例的技术。 逻辑覆盖:是对一系列测试过程的总称。这组测试过程逐渐进行越来越完整的通路测试。 覆盖:测试数据执行源程序的过程。,基本路径 循环覆盖,49,一、逻辑覆盖测试技术,由弱到强的几种逻辑覆盖技术如下: (1) 语句覆盖 (2)判定覆盖 (3)条件覆盖 (4)判定/条件覆盖 (5)条件组合覆盖 (6) 路径覆盖,50,逻辑覆盖测试的5种标准 :,51,逻辑覆盖语句覆盖,语句覆盖:选择足够多的测试数据,使被测程序中每个语句至少执行一次。 语句覆盖缺点: 对程序的逻辑覆盖很少; 只关心判定表达式的值; 没有分别测试判定表达式中每个条件取不同值时的情况。 语句覆盖是最弱的逻辑覆盖标准。,52,语句覆盖举例,共有4条执行路径: sabd,sacbed,sacbd, sabed。,所有语句至少执行一次的路径为sacbed。,设计测试用例的输入数据如下: A=2,B=0,X=4 即达到了语句覆盖。,A=1,B=0,X=4 是否语句覆盖?,53,逻辑覆盖判定覆盖,判定覆盖/分支覆盖:每个判定的真假分支至少执行一次(至少2组测试数据)。 判定覆盖缺点: 判定覆盖比语句覆盖强,但是对程序逻辑的覆盖程度仍然不高,只覆盖了程序全部路径的一半,还差sacbed,sabd没有覆盖。,54,判定覆盖举例,设计测试数据如下:,A=3,B=0,X=3 覆盖路径 sacbd。 A=2,B=1,X=1 覆盖路径 sabed。,两组测试用例可覆盖所有判定的真假分支。,55,逻辑覆盖条件覆盖,条件覆盖:每个语句至少执行一次,每个判定的每个条件的可能取值至少执行一次。 条件覆盖特点: 条件覆盖通常比判定覆盖强,它使判定表达式中每个条件都取到了两个不同的结果; 不一定包含判定覆盖。,56,条件覆盖举例,a点判定的各种条件: A1,A1;B=0,B0,b点判定的各种条件: A=2,A2;X1, X1,测试数据如下: A=2, B=0, X=4 满足A1,B=0,A=2,X1条件, 覆盖路径sacbed。,此题中条件覆盖也符合判定覆盖。 条件覆盖不一定都符合判定覆盖。,A=1, B=1, X=1,满足A1,B0,A2,X1条件,覆盖路径sabd。,57,条件覆盖不满足判定覆盖,测试数据如下: A=2, B=0, X=1 满足A1,B=0,A=2,X1条件, 覆盖路径sacbed。 A=1, B=1, X=2,满足A1,B0,A2,X1条件,覆盖路径sabed。,是条件覆盖,不是判定覆盖,bd路径没有执行。,58,逻辑覆盖判定/条件覆盖,判定覆盖不一定包含条件覆盖,条件覆盖也不一定包含判定覆盖。 判定/条件覆盖:选取足够多的测试数据,使得判定表达式中每个条件都取到各种可能的值,而且每个判定表达式也取到各种可能的结果。 有时判定/条件覆盖并不比条件覆盖更强。,59,判定/条件覆盖举例,既是条件覆盖, 也是判定覆盖。,a点判定的各种条件: A1,A1;B=0,B0,b点判定的各种条件: A=2,A2;X1, X1,测试数据如下: A=2, B=0, X=4, sacbed A=1, B=1, X=1, sabd。,60,逻辑覆盖条件组合覆盖,含义:每个判定表达式中条件的各种可能组合都至少出现一次。 优点: 满足条件组合覆盖,一定满足判定覆盖、条件覆盖和判定/条件覆盖标准。 是最强的逻辑覆盖标准。 缺点:不一定能使程序中每条路径都执行到。,61,条件组合覆盖举例,共有8种可能组合: A1,B=0 A1,B0 A1,B=0 A1,B0 A= 2,X1 A= 2,X1 A2,X1 A2,X1,62,条件组合覆盖举例,4 组测试数据如下: A=2,B=0,X=4 (路径是:sacbed) A=2,B=1,X=1 (路径是:sabed ) A=1,B=0,X=2 (路径是:sabed) A=1,B=1,X=1 (路径是:sabd ),但没有执行路径sacbd,思考: 能否设计出覆盖全部路径的条件组合覆盖? 为什么?,63,逻辑覆盖路径覆盖,选取足够多测试数据,使程序的每条可能路径都至少执行一次(如果程序图中有环,则要求每个环至少经过一次)。 图7.5程序有4条可执行通路: sacbed,sacbd,sabed,sabd. 为做到路径覆盖,通常需要4组测试数据。,64,路径覆盖 举例,4 组测试数据如下: A=2, B=0, X=4, sacbed A=1, B=1, X=1, sabd A=1, B=1, X=2, sabed A=3, B=0, X=3, sacbd 4条路径全部执行。,是否满足 条件组合覆盖?,有4条可执行通路: sacbed, sacbd, sabed, sabd,65,练习题,设计测试用例: 语句覆盖 判定覆盖 条件覆盖 判定/条件覆盖 条件组合覆盖 路径覆盖,66,X2,A,B,结束,开始,F,T,X1 OR Y=3,F,T,设计测试用例: 语句覆盖 判定覆盖 路径覆盖,67,二、基本路径测试,是一种白盒测试技术: 可以保证程序中的每条语句至少执行一次; 每个条件在执行时都将分别取真假两种值。 设计测试用例的步骤如下: 1. 根据过程设计结果画出相应的流图; 2. 计算流图的环形复杂度; 3. 确定线性 独立路径 的基本集合; 4. 设计可强制执行基本集合中每条路径的测试用例。,68,Int pathtest(int a, int b, int c, int x) 1 /声明循环变量 2 int i; 3 /根据变量a,b的取值对x进行赋值 4 if(a1) 14 15 16 Else,17 x=x-c; 18 19 printf“a=%d,b=%d,c=%d, x=%dn”,a,b,c,x; 20 return x; ,课本P185示例,69,步骤一:画程序流图,程序流图的特点: 不包含注释; 不包含数据变量 的声明语句; 所有连续的串行语句压缩为一个节点。 本例的程序流图如下所示:,70,二、计算环形复杂度,环形复杂度为:4,71,步骤三:确定基本路径集合,确定主路经。该路径从程序入口节点开始,到出口节点结束,经过尽可能多的判定节点(包括循环节点)。为后续转向做准备。 不断转向。以主路径为基础,每遇到一个判定节点做一次转向。 得出的基本路径集合如下所示:,72,基本路径集合,Path1:4,5,7,8-9,11,15,19-20 (经过所有判定节点) Path2: 4,7,8-9,11,15,19-20 (在判定节点4处转向) Path3: 4,5,7,16-17-18, 19-20 (在判定节点7处转向) Path4:4,5,7,8-9,11,12-13-14, 15,19-20 (在判定节点11处转向),73,四、剔除不可行路径,补充其他重要路径,补充执行概率高的路径; 补充可能包含严重缺陷的路径,例如涉及空间的分配; 补充涉及复杂算法的路径,这关系到程序最终的正确性。,本例补充循环执行算法的路径: Path5:4,5,7,8-9,11,12-13-14, 11, 12-13-14, 15,19-20,74,五、根据路径集合设计测试用例,75,例子:,1: i=1; total.input = total.valid = 0; sum = 0; 2: Do While valuei -999 3: and total.input=minmum 6: and valuei0 11: then avarage = sum / total.valid; 12: else avarage = -999; 13: endif End avarage,76,1.画出相应的流图 2.计算环形复杂度,环形复杂度为 6,77,3.确定线性独立路径的基本集合,路径1:1-2-10-11-13 路径2:1-2-10-12-13 路径3:1-2-3-10-11-13 路径4:1-2-3-4-5-8-9-2- 路径5:1-2-3-4-5-6-8-9-2- 路径6:1-2-3-4-5-6-7-8-9-2-,独立路径: 至少包含一条定义该路径之前不曾用过的边。,2,3,5,6,10是判定结点。,78,基本路径测试 例2,79,确定基本路径集, 并设计测试用例,环形复杂度为4。 一组独立的路径是: 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,80,三、循环结构测试,对最多为n次的单循环结构测试方法: (1)跳过循环,即一次也不执行。 (2)仅循环1次。 (3)循环2次。 (4)循环m次,mn。 (5)分别循环n-l次、n次、n+1次。,81,三、循环结构测试,对嵌套循环的测试方法: (1)从最内层循环开始测试,此时外层循环都取最小值,对内层进行单循环的测试。 (2)向外退一层进行测试,此时其内层循环取一些典型值,其外层循环仍取最小值。 (3)继续向外层扩展,直至测试完成。,82,白盒测试技术 小结,理解白盒测试的原理。 掌握逻辑覆盖(语句覆盖,判定覆盖,条件覆盖,判定/条件覆盖,条件组合覆盖,路径覆盖)的原理,并能设计测试用例。 理解基本路径测试步骤。,83,6.2.3 黑盒测试技术,黑盒测试主要发现如下错误: 功能不正确或遗漏功能; 界面错误; 数据结构错误或外部数据库访问错误; 性能错误; 初始化和终止错误。,84,常用黑盒测试方法,一、 等价类划分 二、边界值分析 三、因果图法 四、错误推断法,85,一、 等价类划分,基本思想: 把所有可能的输入数据(包括有效或无效的),划分成若干数据类(等价类),然后从每个数据类中选取少数有代表性的数据做为测试用例。 这种方法完全不考虑程序的内部结构,只依据程序的规格说明来设计测试用例。,86,等价类划分设计测试用例的步骤,步骤1:划分等价类(列出等价类表),等价类是指输入数据的子集合。在该子集合中,各输入数据对于发现程序中的错误都是等效的。 根据程序功能说明,确定有效和无效的等价类。,步骤2:根据等价类设计测试用例。,包括有效等价类和无效等价类的设计。,87,步骤1:划分等价类,等价类分为:,有效等价类:对于程序的规格说明来说是合理的、有意义的输入数据构成的集合。,在设计测试用例时,要同时考虑有效等价类和无效等价类的设计!,无效等价类:对于程序的规格说明来说是不合理的、无意义的输入数据构成的集合。,88,等价类划分原则(1),原则1:若规定了取值范围,或输入值的个数,则可确立一个有效等价类和两个无效等价类。,例如,程序对输入条件要求是: “输入数可以从 1 到 999 ” 则,有效等价类是: 两个无效等价类是: 在数轴上表示如下:,1输入数999,输入数1 或 输入数999,89,等价类划分原则(2),原则2:如果规定了输入数据的一组值,而且程序要对每种输入数据分别处理,则可为每种输入值确立一个有效等价类,此外针对这组值确立一个无效等价类,它是所有不允许的输入值的集合。,例:教师上岗方案中规定对教授、副教授、讲师和助教分别计算分数,做相应的处理。因此可以确定4个有效等价类为教授、副教授、讲师和助教,一个无效等价类,它是所有不符合以上身分的人员的输人值的集合。,90,等价类划分原则(3),原则3:若规定了输入值的集合,或者是规定了“必须如何”的条件,则可确立一个有效等价类和一个无效等价类。,例:C语言对变量标识符规定必须“以字母开头”,则所有以字母打头的构成有效等价类,而不以字母打头的归于无效等价类。,91,等价类划分原则(4),原则4:如果规定输入数据为整型, 则可划分出正整数、零和负整数三个有效类,其他数据为无效类。 原则5:如果程序处理对象是表格,则应使用空表、含一项和多项的表。 原则6:如果确知,已划分的等价类中各元素在程序中的处理方式不同,则应将此等价类进一步划分成更小的等价类。,92,步骤2:确立测试用例,在确立了等价类之后,建立等价类表,列出所有划分出的等价类。,93,测试用例的选择原则,原则1:为每一个等价类规定一个唯一编号; 原则2:设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止; 原则3:设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖为止。,94,等价类划分设计测试用例(例1),某档案管理系统,要求用户输入年月表示的日期。 系统规定日期由年、月的6位数字字符组成,前4位代表年,后2位代表月。 设日期限制在2003年1月至2008年12月,即系统只能对该段时期内的报表进行处理。如果用户输入的日期不在此范围内,则显示输入错误。 现用等价类划分法设计测试用例,来测试程序的“日期检查功能”。,95,划分等价类并编号,96,为有效等价类设计测试用例,6位数字字符 在20032008之间 在112之间,注意: 一个测试用例尽可能多覆盖有效等价类。,97,为每个不合理等价类设计测试用例,每个测试用例仅覆盖1个无效等价类,测试用例不能重复,98,练习题,对用户输入的分数进行评级,其中90到100为A,80-89为B,70-79为C,60-69为D,60以下为E。输入分数要求必须是正整数或0。 (1)写出等价类划分列表。 (2)为有效等价类设计测试用例。 (3)为无效等价类设计测试用例。,99,等价类划分法设计测试用例(例2),某一8位微机,其十六进制常数定义为: 以0x或0X开头的数是十六进制整数,其值的范围是-7f 7f(表示十六进制的大小写字母不区别),如0X13, 0X6A,-0X3c。,100,划分等价类并编号,101,为合理等价类设计测试用例,1. 0x或0X开头的12位数字串 2. 以-0x打头的12位数字串 3. -7f 7f之间,102,为每个不合理等价类设计测试用例,103,等价类划分法设计测试用例(例3),某考试系统“输入学生成绩”子模块设计测试用例,分三个专业,准考证号第一位为专业代号: 1-行政专业, 2-法律专业, 3-财经专业 行政专业准考证号码为:110001111215 法律专业准考证号码为:210001212006 财经专业准考证号码为:310001314015,104,准考证号码的等价类划分,有效等价类: (1) 110001 111215 (2) 210001 212006 (3) 310001 314015 无效等价类: (4) - 110000 (5) 111216 210000 (6) 212007 31000 (7) 314016 + ,105,106,二、边界值分析,边界是指,对于输入和输出等价类而言,稍高和稍低于其边界值的一些特定情况。 经验得知,大量错误发生在输入或输出范围的边界上,而不是在输入范围的内部。 边界值分析方法思想:确定边界之后,选取正好等于、刚刚大于或刚刚小于边界的值做为测试数据,而不是选取等价类中典型值或任意值做为测试数据。 通常和等价类划分技术联合使用,是对等价类划分方法的补充。,输入 条件,报表日 期的类 型及长 度,1个数字字符 5个数字字符 7个数字字符 有1个非数字字符 全部是非数字字符 6个数字字符,显示出错 显示出错 显示出错 显示出错 显示出错 输入有效,日期 范围,月份 范围,“报表日期( 6位数字字符)”边界值分析法测试用例,测试用例说明,测试数据,期望结果,选取理由,5 20035 2003005 2003.5 MAY- 200305,月份为1月 月份为12月 月份12,200301 200312 200300 200313,200301 200812 200300 200813,输入有效 输入有效 显示出错 显示出错,输入有效 输入有效 显示出错 显示出错,在有效范围 边界上选取 数据,仅有1个合法字符 比有效长度少1 比有效长度多1 只有1个非法字符 6个非法字符 类型及长度均有效,最小日期 最大日期 刚好小于最小日期 刚好大于最大日期,最小月份 最大月份 刚好小于最小月份 刚好大于最大月份,108,边界值分析,例如,有一段用C编写的小程序: int A10; int i; for ( i = 1; i = 10; i+ ) Ai = -1; 因为C语言中数组下标从 0 开始,而本程序中从 1 开始赋值,如果以后用户不了解,可能从 0 开始使用,就会出错。所以边界值可能查出更多的问题来。,109,选取测试用例的原则1,边界值分析方法选取测试用例的原则: (1)如果输入条件规定了值的范围 a,b,则应取a,b,以及紧挨a和b的左边和右边的值作为测试输入数据。 例如,某数据的取值范围为0,100,测试数据可取-1、0、1、99、100、101共6个数据作为测试用例。,110,选取测试用例的原则2,边界值分析方法选取测试用例的原则: (2) 如果输入条件规定了值的个数,则应取最大个数、最小个数、比最大个数多1,比最小个数少1的数作为测试输入数据。 例如,某输入文件有 1255 个记录,则可取0个、1个、2个、254个、255个、256 个记录作为作为测试用例。,111,选取测试用例的原则3,边界值分析方法选取测试用例的原则: (3)根据规格说明和每个输出条件,使用原则(1)。 例如,研究生录取分数范围84150,测试数据可取83、84、85、149、150、151。,112,选取测试用例的原则4,边界值分析方法选取测试用例的原则: (4)根据规格说明和每个输出条件,使用原则(2)。 例如,研究生录取人数1034人,测试数据可取9、10、11、33、34、35。,113,三、因果图法,因果图法主要检查各种输入条件的组合。 因果图的测试用例设计步骤如下: (1)分析规格说明中的输入作为因,输出作为果。 (2)依据因果的处理语义画出因果图。 (3)标出因果图的约束条件。 (4)将因果图转换为因果图所对应的判定表。 (5)根据判定表设计测试用例。,114,因果图中的基本符号,恒等,非,或,与,异约束,或约束,唯一约束,要求约束,强制约束,115,(a)恒等:原因与结果之间是一对一关系。若原因出现,结果一定出现;若原因不出现,结果也不出现。 (b)非:原因与结果之间是一种否定关系。若原因出现,结果一定不出现;若原因不出现,结果一定出现。 (c)或:几个原因中有一个出现,则结果出现。只有当这几个原因都不出现时,结果才不出现。,116,(d)与:若几个原因都出现,结果才出现。若几个原因中一个不出现,结果就不出现。 (e)异约束:表示a、b两个原因不会同时成立,两个中最多有一个可能成立。 (f)或约束:表示a、b两个原因中至少有一个必须成立。,117,(g)唯一约束:表示a和b两个原因中必须有一个,且仅有一个成立。 (h)要求约束:表示当a出现时,b必须也出现,不可能a出现b不出现。 (i)强制约束:表示当a出现时,b必须不能出现;而当a不出现时,b的值不定。,118,【例6.3】,某规格说明:“第一列字符必须是A或者B,第二列字符必须是一个数字,第一、二两列都满足时修改文件,第一列不正确时给出信息L,第二列不正确时给出信息M。”请用因果图法设计测试用例。,119,120,121,四、错误推测法,基本思想:列举程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例。 依靠经验和直觉推测程序中可能存在的各种错误,从而有针对性地编写检查这些错误的测试用例。 例如,一定要考虑建立处理下列等价类: 缺省值,空白,空值,零值,无输入条件 在已经找到软件缺陷的地方再找找。,122,错误推测法常见经验方法如下:,(1)零作为测试数据往往容易发现程序中的错误。 (2)分析规格说明书中的漏洞,编写测试数据。 (3)根据尚未发现的软件错误与已发现软件错误成正比的统计规律,进一步测试时需重点测试已发现错误的程序段。 (4)等价类划分与边界值分析容易忽略组合的测试数据,因此可采用判定表列出测试数据。 (5)与人工代码审查相结合,两个模块中共享的变量已被修改的,可用来做测试用例。因为对一个模块测试出错,同样会引起另一模块的错误。,123,例如,测试一个对线性表(比如数组)进行排序的程序,可推测出以下几项需要特别测试的情况: (1)输入的线性表为空表。 (2)表中只含有一个元素。 (3)输入表中的所有元素已排好序。 (4)输入表已按逆序排好。 (5)输入表中部分或全部元素相同。,124,6.2.4 软件测试阶段,从宏观的角度讲,软件测试阶段一般可以划分为单元测试、集成测试、系统测试和验收测试等几个主要测试阶段。 每一个测试阶段都应包含制定测试计划、设计测试用例、测试实施和测试结果的收集评估等。,125,一、单元测试(模块测试),测试对象:经过软件设计并编码的一个个程序模块。 主要依据:程序源代码和详细设计文档。 测试目的:发现并纠正程序模块内部的错误。 测试方法:白盒测试为主,黑盒测试为辅,多个模块并行进行。,126,单元测试的任务,单元测试的任务主要包括: 模块接口 测试; 模块局部数据结构的测试; 模块中所有独立路径的测试; 模块中各条错误处理路径的测试; 模块边界条件的测试等。,127,模块接口测试,测试项目: 调用本模块的输人参数是否正确; 本模块调用子模块时,输人给子模块的参数是否正确; 输出给标准函数的参数是否正确; 全局变量的定义和用法在各模块中是否一致; 与外部设备的输入输出是否正确。,128,局部数据结构测试,测试项目: 不正确或不一致的数据类型说明 使用尚未赋值或尚未初始化的变量 错误的初始值或错误的缺省值 变量名拼写错或书写错 不一致的数据类型 全局数据对模块的影响,129,路径测试/执行通路,关键:测试用例要适当。 例如:A=3,B=4,C=5; A=4,B=5,C=3; ,130,错误处理测试,着重测试以下可能发生的错误: 出错的描述是否难以理解 出错的描述是否能够对错误定位 显示的错误与实际的错误是否相符 对错误条件的处理正确与否 在对错误进行处理之前,错误条件是否已经引起系统干预等,131,边界条件测试,重点检查刚好等于、大于或小于边界值的数据: 第 n 个数据元素; 第 i 次循环; 对运行时间有要求的模块,还要专门进行关键路径测试,以确定最坏情况下和平均意义下影响模块运行时间的因素。,132,单元测试的步骤,单元测试通常在编码阶段进行。常用计算机测试,即通过运行模块发现问题。 两个重要概念: 驱动程序:相当于被测试模块的“主程序”,接收测试数据,把这些数据传送给被测试的模块,并且输出相关结果。 存根程序:代替被测试模块所调用的子模块。不需要具有子模块所有功能,但不允许什么事情也不做。,133,单元测试举例:,例如,一个被测软件的结构图如图6.5所示,对模块A进行单元测试。其单元测试环境如图6.6所示。,134,其中,驱动模块模拟调用模块M,桩模块l、2、3分别模拟被调用模块C、D、E。,模块M,模块C,模块D,模块E,135,二、集成测试/组装测试/综合测试,单元测试后,将模块组装成系统,发现并排除模块在连接中可能出现的问题。 需要考虑: 模块连接时通过模块接口的数据是否会丢失; 一个模块对另一个模块是否会产生不利影响; 各子功能组合起来能否实现主功能; 全局数据结构是否有问题; 单个模块的误差累积起来,是否会放大至不能接受的程度。,136,集成测试的两种方式,非增量集成 方式(整体拼装): 首先对每个模块分别进行模块测试,然后再把所有模块一次性组装在一起进行测试,最终得到要求的软件系统。 增量集成 方式: 先对模块进行单元测试,然后将测试后的模块逐步组装成较大的系统;在组装的过程中边连接边测试,以发现连接过程中产生的问题;最后组装成为要求的软件系统。,137,非增量集成测试,138,增量集成方式的两种类型,自顶向下集成的渐增方式 自底向上集成的渐增方式 混合渐增测试,139,(1)自顶向下集成方式,将模块按系统程序结构,沿控制层次自顶向下进行组装。 不需要驱动模块,需要存根模块。 可有两种方法: 深度优先 宽度优先,140,141,宽度优先集成,加入F,全部集成,142,深度优先集成,143,自顶向下测试的步骤:,1)对主模块进行测试,用存根模块代替下层模块; 2)根据选定的结合策略,每次用一个实际模块代替一个桩(存根)模块; 3)在结合进一个模块的同时进行测试; 4)为保证加入的模块没有引进新的错误,可能需要进行回归测试。,144,自顶向下测试优缺点,优点: 1)能在早期验证主要的控制和判断点。 2)选用按深度方向组装的方式,可以首先实现和验证一个完整的软件功能。 缺点:可能遇到逻辑次序上的问题。,145,(2)自底向上的集成测试,从程序结构最底层的模块开始组装和测试。不需要存根程序,需要驱动模块。组合策略: 1)把低层模块组合成实现某个特定的软件子功能的模块群; 2)为每个模块群开发一个驱动模块,协调测试数据的输入和输出结果; 3)对每个模块群进行测试; 4)去掉驱动模块,用较高层模块将几个模块群组成更大的模块群; 重复上述的24步骤,这到整个程序构造完毕。,146,自底向上集成,147,自底向上集成 示例,148,自底向上组装测试优缺点,优点: 先测试下层模块,可较早地暴露系统中重要模块的错误; 有较低层次的数据流能够向上流动; 容易设计测试用例; 不用建立存根模块,驱动模块的编写更容易。 缺点: 不能在早期显示出软件结构的整体轮廓,很有可能得到令人惊讶的结果!,149,(3)混合测试策略,混合法测试: 较上层模块使用的自顶向下方法。 较下层模块使用的自底向上方法。 特点: 大大减少开发驱动模块和桩模块的数量; 兼有两种方法的优点,是最好的折衷方法。 也称为三明治集成方法。,150,混合法测试 举例,151,自底向上集成,Ma,152,重点测试,集成测试过程中应该对关键模块进行重点测试。关键模块是指具有如下一个或多个特征的模块: 对应多条需求; 具有高层控制功能; 复杂、易出错; 有特殊性能要求。 对关键模块,应尽早测试,并应进行反复的回归测试。,153,回归测试,思考:采用“增量集成测试”时,当新的模块结合进来之后,是否需要对程序进行再次测试?,回归测试定义:指集成测试中,重新执行已经做过测试的某个子集,以保证上述这些变化没有带来非预期的副作用。,154,三、确认测试,又称有效性测试,目的是:验证软件的功能、性能及其它特性 是否 与用户的要求一致。 确认测试的基础:软件需求规格说明书。 确认测试的主要工作: 测试软件的有效性软件的功能性能是否满足用户要求。 软件配置审查所有文档是否齐全、文档质量是否符合要求,文档与程序是否一致。 主要参与人员:以用户为主。,155,1)确认测试标准,一般采用黑盒测试方法。 测试结果: 与预期的结果相符,用户可以接受软件产品。 与预期的结果不符,与用户协商,寻求一个妥善的解决方法。,156,2)软件配置复审,是确认测试的另一个重要内容。 软件配置包括:软件需求规格说明、软件设计规格说明、源代码等。 目的: 保证软件配置的所有成分都齐全,质量都符合要求,且具有软件维护所需要的细节。 确认测试应交付的文档有: 确认测试分析报告 最终的用户手册和操作手册 项目开发总结报告,157,3)测试 和 测试,如果软件是面向大众公开出售的盒装产品,让每个用户进行验收测试是不现实的。 一般使用测试和测试两种方法。,158,a测试,软件开发公司组织内部人员模拟各类用户对即将面市软件产品(称为版本)进行测试,试图发现错误并修正。 测试的关键在于尽可能逼真地模拟实际运行环境和用户对软件产品的操作,并尽最大努力涵盖所有可能的用户操作方式。 经过测试调整的软件产品称为版本。,159,测试,软件开发公司组织各方面的典型用户在日常工作中实际使用版本,并要求用户报告异常情况,提出批评意见,然后软件开发公司再对版本进行改错和完善。,160,四、系统测试,系统测试:将通过确认测试的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其他系统元素结合在一起,在实际运行(使用)环境下,对计算机系统进行一系列的组装测试和确认测试。 系统测试实质上由一系列不同测试组成,其主要目的是充分运行系统,验证系统各个部件是否都能正常工作并完成所分配的功能。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论