1、项目六软件项目测试,软件工程案例教程 清华大学出版社,项目六软件项目测试,任务一 测试的目的 任务二 软件测试方法和步骤 任务三 调试 任务四 测试报告 小结 实验实训,任务一 测试的目的,6.1.1 软件测试 什么是测试?它的目标是什么?GMyerS给出了关于测试的一些规则,这些规则也可 以看作是测试的目标或定义: 1测试是为了发现程序中的错误而执行程序的过程; 2好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案; 3成功的测试是发现了至今为止尚未发现的错误的测试。 从上述规则可以看出,测试的正确定义是“为了发现程序中的错误而执行程序的过程”。这和某些人通常想象的“测试是为了表明程序
2、是正确的”,“成功的测试是没有发现错误的测试”等等是完全相反的。正确认识测试的目标是十分重要的,测试目标决定了测试方案的设计。如果为了表明程序是正确的而进行测试,就会设计一些不易暴露错误的测试方案;相反,如果测试是为了发现程序中的错误,就会力求设计出最能暴露错误的测试方案。,任务二软件测试方法和步骤,6.2.1黑盒测试和白盒测试 黑盒测试 黑盒测试法把程序看成一个黑盒子,完全不考虑程序的内部结构和处理过程。也就是说,黑盒测试是在程序接口进行的测试,它只检查程序功能是否能按照规格说明书的规定正常使用,程序是否能适当地接收输入数据产生正确的输出信息,并且保持外部信息(如,数据库或文件)的完整性,黑
3、盒测试又称为功能测试。,任务二软件测试方法和步骤,(1)等价类划分 等价划分是用黑盒法设计测试方案的一种技术。穷尽的黑盒测试需要使用所有有效的和无效的输人数据来测试程序,通常这是不现实的。因此,只能选取少量最有代表性的输入数据,以期用较小的代价暴露出较多的程序错误。如果把所有可能的输入数据(有效的和无效的)划分成若干个等价类,则可以合理地做出下述假定:每类中的一个典型值在测试中的作用与这一类中所有其他值的作用相同。因此,可以从每个等价类中只取一组数据作为测试数据。这样选取的测试数据最有代表性,最可能发现程序中的错误。,任务二软件测试方法和步骤,使用等价划分法设计测试方案首先需要划分输入数据的等
4、价类,为此需要研究程序的功能说明,从而确定输入数据的有效等价类和无效等价类。在确定输入数据的等价类时常常还需要分析输出数据的等价类,以便根据输出数据的等价类导出对应的输入数据等价类。,任务二软件测试方法和步骤,划分等价类需要经验,下述几条启发式规则可能有助于等价类的划分;如果规定了输入值的范围,则可划分出一个有效的等价类(输入值在此范围内),两个无效的等价类(输入值小于最小值或大于最大值);如果规定了输入数据的个数,则类似地也可以划分出一个有效的等价类和两个无效的等价类;如果规定了输入数据的一组值,而且程序对不同输入值做不同处理,则每个允许的输入值是一个有效的等价类,此外还有一个无效的等价类(
5、任一个不允许的输入值);,任务二软件测试方法和步骤,如果规定了输入数据必须遵循的规则,则可以划分出一个有效的等价类(符合规则)和若干个无效的等价类(从各种不同角度违反规则);如果规定了输入数据为整型,则可以划分出正整数、零和负整数等三个有效类;如果程序的处理对象是表格,则应该使用空表,以及含一项或多项的表。 以上列出的启发式规则只是测试时可能遇到的情况中的很小一部分,实际情况千变万化,根本无法一一列出。为了正确划分等价类,一是要注意积累经验,二是要正确分析被测程序的功能。此外,在划分无效的等价类时还必须考虑编译程序的检错功能,一般说来,不需要设计测试数据用来暴露编译程序肯定能发现的错误,任务二
6、软件测试方法和步骤,划分出等价类以后,根据等价类设计测试方案时主要使用下面两个步骤:设计一个新的测试方案以尽可能多地覆盖尚未被覆盖的有效等价类,复重这一步骤直到所有有效等价类都被覆盖为止;设计一个新的测试方案,使它覆盖一个而且只覆盖一个尚未被覆盖的无效等价类,重复这一步骤直到所有无效等价类都被覆盖为止。 注意,通常程序发现一类错误后就不再检查是否还有其他错误,因此,应该使每个测试方案只覆盖一个无效的等价类。,任务二软件测试方法和步骤,(2)边界值分析 边界值是对等价划分方法的补充。 经验表明,处理边界情况时程序最容易发生错误。例如,许多程序错误出现在下标、纯量、数据结构和循环等等的边界附近。因
7、此,设计使程序运行在边界情况附近的测试方案,暴露出程序错误的可能性更大一些。,任务二软件测试方法和步骤,使用边界值分析方法设计测试方案首先应该确定边界情况,这需要经验和创造性,通常输入等价类和输出等价类的边界,就是应该着重测试的程序边界情况。选取的测试数据应该刚好等于、刚刚小于和刚刚大于边界值。也就是说,按照边界值分析法,应该选取刚好等于、稍小于和稍大于等价类边界值的数据作为测试数据,而不是选取每个等价类内的典型值或任意值作为测试数据。,任务二软件测试方法和步骤,2白盒测试 有选择地执行程序中某些最有代表性的通路是对穷尽测试的唯一可行的替代办法。所谓逻辑覆盖是对一系列测试过程的总称,这组测试过
8、程逐渐进行越来越完整的通路测试。从覆盖源程序语句的详尽程度分析,大致有以下一些不同的覆盖标准: (1)语句覆盖 为了暴露程序中的错误,至少每个语句应该执行一次。语句覆盖的含义是,选择足够多的测试数据,使被测程序中每个语句至少执行一次。 语句覆盖是很弱的逻辑覆盖标准,为了更充分地测试程序,可以采用下述的逻辑覆盖标准。,任务二软件测试方法和步骤,(2)判定覆盖 判定覆盖又叫分支覆盖,它的含义是,不仅每个语何必须至少执行一次,而且每个判定的每种可能的结果都应该至少执行一次,也就是每个判定的每个分支都至少执行一次。 判定覆盖比语句覆盖强,但是对程序逻辑的覆盖程度仍然不高。 (3)条件覆盖 条件覆盖的含
9、义是,不仅每个语句至少执行一次,而且使判定表达式中的每个条件都取到各种可能的结果。 条件覆盖通常比判定覆盖强,因为它使判定表达式中每个条件都取到了两个不同的结果,判定覆盖却只关心整个判定表达式的值。,任务二软件测试方法和步骤,(4)判定条件组合覆盖 既然判定覆盖不一定包含条件覆盖,条件覆盖也不一定包含判定覆盖,自然会提出一种能同时满足这两种覆盖标准的逻辑覆盖,这就是判定/条件覆盖。它的含义是,选取足够多的测试数据,使得判定表达式中的每个条件都取到各种可能的值,而且每个判定表达式也都取到各种可能的结果。 (5)条件组合覆盖 使得每个判断中条件的各种可能组合都至少出现一次。,任务二软件测试方法和步
10、骤,6.2.2信息管理系统测试 1测试用户登陆是否成功: 2测试其他用户是否能够登录: 3测试编辑功能是否成功: 4测试查询功能是否成功: 5用户登出系统的测试: 6测试密码更改:,任务二软件测试方法和步骤,经过以上各项的测试,证明本系统完全可以正常运行,至此测试成功! 在具体的测试中,我们遵循以下原则:由程序设计者之外的人进行测试;测试用例应由两部分组成:输入数据和预期输出结果;应选用不合理的输入数据与非法输入测试;不仅要检验程序是否实现预期功能,还应检查程序是否做了不应该做的工作;集中测试容易出错的程序模块;对程序修改以后,必须重新进行测试。,任务二软件测试方法和步骤,6.2.3 软件测试
11、步骤 从产品角度看,测试计划中的测试项目包括软件结构中的分系统层、子系统层、功能模块、程序模块层中的各类模块,从测试本身看,分为单元测试,组合测试,确认测试等。测试对象是随阶段而异的,最基本、最初的测试是单元测试,后面的组合测试、确认测试都是以被测过的模块作为测试对象的。 1单元测试: 2组合测试 3确认测试 4系统测试 5用户验收测试,任务三 调试,6.3.1软件调试 调试是软件开发过程中最艰巨的脑力劳动。调试开始时,软件工程师面对着错误的征兆,然而在问题的外部现象和内在原因之间往往并没有明显的联系,在组成程序的数以万计的元素(语句,数据结构等等)中,每一个都可能是错误的根源。如何在浩如烟海
12、的程序元素中找出有错误的那个(或几个)元素,这是调试过程中最关键的技术问题。,任务三 调试,现有的调试技术主要有下述三类: 1输出存储器内容这种方法通常以八进制或十六进制的形式印出存储器的内容。如果单纯依靠这种方法进行调试,那么效率可能是很低的,这种方法的主要缺点是: 很难把存储单元和源程序变量对应起来; 输出信息量极大,而且大部分是无用的信息; 输出的是程序的静态图像(程序在某一时刻的状态),然而为了找出故障往往需要研究程序的动态行为(状态随时间变化的情况); 输出的存储器内容常常并不是程序出错时的状态,因此往往不能提供有用的线索; 输出信息的形式不易阅读和解释。,任务三 调试,2打印语句这
13、种方法把程序设计语言提供的标准打印语句插在源程序各个部分,以便输出关键变量的值。它比第一种方法好一些,因为它显示程序的动态行为,而且给出的信息容易和源程序对应起来。这种方法的缺点主要是:可能输出大量需要分析的信息,对于大型程序系统来说情况更是如此;必须修改源程序才能插入打印语句,但是这可能改变了关键的时间关系,从而既可能掩盖错误,也可能引进新的错误。,任务三调试,3自动工具这种方法和第二种方法类似,也能提供有关程序动态行为的信息,但是并不需要修改源程序。它利用程序设计语言的调试功能或者使用专门的软件工具分析程序的动态行为。可供利用的典型语言功能是,输出有关语句执行、子程序调用和更改指定变量的踪
14、迹。用于调试的软件工具的共同功能是设置断点,即当执行到特定的语句或改变特定变量的值时,程序停止执行,程序员可以在终端上观察程序此时的状态。使用这种调试方法也会产生大量无关的信息。,任务三调试,一般说来,在使用上述任何一种技术之前,都应该对错误的征兆进行全面彻底的分析。通过分析得出对故障的推测,然后再使用适当的调试技术检验推测的正确性,也就是说,任何一种调试技术都应该以试探的方式来使用。总之,首先需要进行周密的思考,使用一种调试方法之前必须有比较明确的目的,尽量减少无关信息的数量。,任务四 测试报告,测试报告是把测试的过程和结果写成文档,并对发现的问题和缺陷进行分析,为纠正软件的存在的质量问题提
15、供依据,同时为软件验收和交付打下基础。 摘要 关键字 测试报告 缺陷 正文 测试报告是测试阶段最后的文档产出物,优秀的测试经理应该具备良好的文档编写能力,一份详细的测试报告包含足够的信息,包括产品质量和测试过程的评价,测试报告基于测试中的数据采集以及对最终的测试结果分析。,任务四 测试报告,PART 首页 1页面内容 2格式要求 3版本控制 PART 引言部分 1编写目的 2项目背景 3系统简介 4术语和缩写词 5参考资料,任务四 测试报告,PART 测试概要 1测试用例设计 2测试环境与配置 3测试方法(和工具) PART 测试结果及缺陷分析 1测试执行情况与记录 2覆盖分析 3缺陷的统计与
16、分析 PART 测试结论与建议 1测试结论 2建议,小结,目前软件测试仍然是保证软件可靠性的主要手段。测试阶段的根本任务是发现并改正软件中的错误。软件测试是软件开发过程中最艰巨最繁重的任务,大型软件的测试应该分阶段地进行,通常至少分为单元测试、集成测试和验收测试三个基本阶段。设计测试方案是测试阶段的关键技术问题,基本目标是选用最少量的高效测试数据,做到尽可能完善的测试,从而尽可能多地发现软件中的问题。设计测试方案的实用策略是,用黑盒法(边界值分析,等价划分和错误推测法等等)设计基本的测试方案,再用白盒法补充一些必要的测试方案。,小结,应该认识到,软件测试不仅仅指利用计算机进行的测试,还包括人工
17、进行的测试(例如,代码审查)。两种测试途径各有优缺点,互相补充,缺一不可。测试过程中发现的软件错误必须及时改正,这就是调试的任务。为了改正错误,首先必须确定故障的准确位置,这是调试过程中最困难的任务,需要周密审慎的思考和推理。改正错误常常包括修正原来的设计,必须通盘考虑而不能“头疼医头脚疼医脚”,应该尽量避免在调试过程中引进新的故障。测试和调试是软件测试阶段的两个关系非常密切的过程,它们通常交替进行。,实验实训,1实训目的 培养学生运用所学的理论知识和技能,分析解决计算机的实际应用问题的能力; 培养学生调查研究,查阅技术文献,资料,以及编写软件测试报告的能力; 通过实训,掌握软件项目测试的方法,软件调试,以及软件测试报告的格式; 2实训要求 1实训前做好上机实训的准备,针对实训内容,认真复习与本次实训有关的知识,完成实训内容的预习准备工作; 2能认真独立完成实训内容; 3实训后做好实训总结,根据实训情况完成项目实训总结报告。,实验实训,3实训学时 8学时 4实训项目 运用所学课程知识,结合所学开发语言,对教师信息管理系统测试,写出教师信息管理应用系统的测试报告。 5实训题目 教师信息管理系统测试报告。,