华北电力大学软件测试技术调研报告||||专业班级:学生姓名:学号:成绩:教师:李整日期: 2013.5.12软件测试的认识一.软件测试的定义和目的软件测试(Software testing)是软件生存期(Software life cycle)中的一个重要阶段,是软件质量保证的关键步骤。
通俗地讲,软件测试就是在软件投入运行前,对软件需求分析、设计规格说明和编码进行最终复审的活动。
1983年IEEE提出的软件工程术语中给软件测试下的定义是:“使用人工或自动的手段来运行或测定某个软件系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别”。
这个定义明确指出:软件测试的目的是为了检验软件系统是否满足需求。
从用户的角度来看,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,所以软件测试应该是“为了发现错误而执行程序的过程”。
或者说,软件测试应该根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误或缺陷。
二.软件测试的生命周期测试主要依据是被试系统的研制任务书和技术规格书,是对软件整体功能和性能的综合测试与评估。
测试原理是软件测试活动的理论基础,测试方法是测试原理的实际应用和获得测试数据的手段。
基于软件的共性,对于软件的测试要遵循一般软件的测试原理和方法。
同时,针对软件的特性,必须找到合适的测试方法。
测试用例的合理性对于软件的测试与评估具有关键作用,而如何使设计的用例合情、合理并且典型有效并不容易。
所以应该与软件的研制人员以及最终用户一起,有针对性地研究实际操作环境并加以描述,形成合理的测试用例集。
另一方面,软件运行环境的复杂程度对软件评估具有重要作用,所以应产生尽量逼真的运行背景以便于研究。
软件测试的周期如图1所示。
实践证明,尽管人们在开发软件的过程中使用了许多保证软件质量的方法和技术,但开发出的软件中还会隐藏许多错误和缺陷。
这对于规模大、复杂性高的软件更是如此。
所以,严格的软件测试对于保证软件质量具有重要作用。
软件测试在软件生存期中横跨两个阶段。
在软件编码阶段,当编写出一个模块后,通常要对它进行必要的测试(称为单元测试),这时测试与编码属于同一个阶段。
在编码阶段结束后,对软件系统还要进行各种综合测试(集成测试与系统测试),这是一个独立阶段,即软件测试阶段。
在这个测试阶段又有两种性质不同的测试:研制单位内部进行的集成测试和系统测试与用户(或第三方)进行的验收性测试。
在软件测试生命周期内,错误在软件开发的每个阶段都可能被带入。
在软件测试中,某些错误被发现、分类、隔离,最终被纠正。
由于软件不断被修改,所以这个过程是一个反复进行的过程。
三.软件测试的方法和流程软件测试方法主要有黑盒测试方法与白盒测试两中。
黑盒测试又称功能测试、数据驱动测试或基于规格说明的测试,是在完全不考虑程序内部结构和内部特性的情况下,检查输入与输出之间关系是否符合要求。
白盒测试又称结构测试、逻辑驱动测试或基于程序的测试,是在已知程序内部结构的情况下设计测试用例的测试方法。
显然,白箱测试适合在单元测试中运用,而在独立测试阶段多采用黑箱测试方法。
测试用例(Test case)实际上是对软件运行过程中所有可能存在的目标、运动、行动、环境和结果的描述,是对客观世界的一种抽象。
设计测试用例即设计针对特定功能或组合功能的测试方案,并编写成文档。
测试用例应该体现软件工程的思想和原则。
测试用例的选择既要有一般情况,也应有极限情况以及最大和最小的边界值情况。
因为测试的目的是暴露应用软件中隐藏的缺陷,所以在设计选取测试用例和数据时要考虑那些易于发现缺陷的测试用例和数据,结合复杂的运行环境,在所有可能的输入条件和输出条件中确定测试数据,来检查应用软件是否都能产生正确的输出。
软件测试所得到的数据经过处理以后,可以用来作为评估软件系统是否满足用户需求的依据。
软件测试阶段的信息流如图2所示:四、软件测试的误区1、软件测试是技术要求不高的岗位很多人都认为软件测试就是安装和运行程序,点点鼠标,按按键盘的工作。
这是由于不了解软件测试的具体技术和方法造成的。
随之软件工程学的发展和软件项目管理经验的提高,软件测试已经形成了一个独立的技术学科,演变成一个具有巨大市场需求的行业。
软件测试技术不断更新和完善,新工具,新流程,新测试设计方法都在不断更新,需要掌握相关的行业知识、计算机技术、软件项目管理经验等。
所以,具有编程经验的程序员不一定是一名优秀的测试工程师。
好的测试人员,不光要能不懈地执行常规的测试任务,更要有严谨的态度和严密的思维,去覆盖更多的“可能”,发现别人很难找到的bug;利用自己丰富的行业经验,判断需求到系统功能的实现是否合理;站在一定高度对软件框架,设计方法,项目管理等做出合理的建议。
软件测试包括测试技术和管理两个方面,掌握这两个方面的内容,需要很多测试实践经验和不断学习精神。
2、软件开发完成后进行软件测试人们一般认为,软件项目要经过以下几个阶段:需求分析,概要设计,详细设计,软件编码,软件测试,软件发布。
据此,认为软件测试只是软件编码后的一个过程。
这是不了解软件测试周期的错误认识。
软件测试是一个系列过程活动,包括软件测试需求分析,测试计划设计,测试用例设计,执行测试。
因此,软件测试贯穿于软件项目的整个生命过程。
在软件项目的每一个阶段都要进行不同目的和内容的测试活动,以保证各个阶段的正确性。
软件测试的对象不仅仅是软件代码,还包括软件需求文档和设计文档。
软件开发与软件测试应该是交互进行的,例如,单元编码需要单元测试,模块组合阶段需要集成测试。
如果等到软件编码结束后才进行测试,那么,测试的时间将会很短,测试的覆盖面将很不全面,测试的效果也将大打折扣。
更严重的是如果此时发现了软件需求阶段或概要设计阶段的错误,如果要修复该类错误,将会耗费大量的时间和人力。
3、测试是可以穷尽的,找到的缺陷越多,则尚未发现的缺陷就越少事实上,不论采用什么技术和方法,软件中仍然会有错,采用新的语言、先进的开发方式,完善的开发过程,固然可以减少错误的引入,但是不可能完全杜绝软件中的错误,穷尽的测试是不可能的,要找出软件中的所有缺陷也是行不通的,软件产品的“零缺陷”只是一种理想状态。
实际上“足够好”才是测试应遵循的原则。
这种原则就是一种权衡投入和产出比的原则,不充分的策划是不负责任的;过分的测试是一种资源的浪费,同样也是一种不负责任的表现。
不同的系统有着不同的质量要求,对于质量要求严格的系统,可能需要进行长时间的、全面的测试,尽可能的挖掘系统中的缺陷。
然而对于质量要求不是很严格的系统,系统是允许出现错误的,测试的目的是使系统的缺陷适量降到可以接收的范围内。
4、强调测试用例设计得越详细越好、越多越好在确定测试用例设计目标时,我们往往都会强调测试用例“越详细越好”。
希望尽可能设计足够多的设计用例,测试用例的数量越多越好;测试用例尽可能包括测试执行的详细步骤,达到“任何一个人都可以根据测试用例执行测试”,追求测试用例越详细越好。
这种做法和观点的危害就是耗费了很多的测试用例设计时间和资源,可能等到测试用例设计、评审完成后,留给实际执行测试的时间所剩无几了。
因为当前软件公司的项目团队在规划测试阶段,分配给测试的时间和人力资源是有限的,而软件项目的成功要坚持“质量、时间、成本”的最佳平衡,没有足够多的测试执行时间,就无法发现更多的软件缺陷,测试质量更无从谈起了。
五、我国软件测试的现状在我国,软件产业的兴起和发展也就是这短短十几年。
在前面的兴起和发展壮大阶段,一般的软件公司都是重开发轻测试,甚至存在把测试工作都放在用户那里去做的错误思想;追求眼前功能的实现,开发软件追求“短”、“平”、“快”。
不太考虑性能和功能的优化。
软件产业发展到今天,如果还是用以前的思路、办法(公司里绝大部分、甚至全部都是开发人员在做产品,只要能做出来可以用就行),企业的产品肯定没有竞争力,从而导致这样的软件企业生存极其困难。
正是因为这个原因,软件测试以往一直被中小IT企业所忽视,只有一些知名企业才有专门的软件测试人员。
现在,更多的国内企业认识到测试的重要性,但是由于国内测试人才的储备相对较少,并且建立软件测试部门需要很大成本,所以软件测试外包是国内软件企业的最佳选择。
六、自动化测试基于界面的软件自动化测试框架和工具的发展大致经历了三个阶段(有人也据此将测试工具分为三代):1)简单的录制/回放:由工具录制并记录操作的过程和数据形成脚本,通过回放来重复人工操作的过程。
在这种模式下数据和脚本混在一起,几乎一个测试用例对应一个脚本,维护成本很高。
而且即使界面的简单变化也需要重新录制,脚本可重复使用的效率低。
2)数据驱动(data driven)的自动化测试:从数据文件读取输入数据,通过变量的参数化,将测试数据传入测试脚本,不同的数据文件对应不同的测试用例。
在这种模式下数据和脚本分离,脚本的利用率、可维护性大大提高,但受界面变化的影响仍然很大。
3)关键字驱动(keyword driven)的自动化测试:关键字驱动测试是数据驱动测试的一种改进类型,它将测试逻辑按照关键字进行分解,形成数据文件,关键字对应封装的业务逻辑。
主要关键字包括三类:被操作对象(Item)、操作(Operation)和值(value),用面向对象形式可将其表现为Item.Operation(Value)。
关键字驱动的主要思想是:脚本与数据分离、界面元素名与测试内部对象名分离、测试描述与具体实现细节分离。
相应地,软件测试自动化脚本的类型,从低到高的发展层次是:1)线性脚本:通过录制直接产生的线性执行的脚本。
2)结构化的脚本:具有顺序、循环、分支等结构的脚本。
3)共享的脚本:可以被多个测试用例使用,被其它脚本调用的脚本。
4)数据驱动的脚本:数据和流程控制分离的脚本,通过读入数据文件来驱动流程进行的脚本。
5)关键字驱动的脚本:脚本、数据、业务分离,数据和关键字在不同的数据表中,通过关键字来驱动测试业务逻辑。
关键字驱动脚本的特点是它看起来更像描述一个测试事例做什么, 而不是如何做。
目前,大多数测试工具处于数据驱动到关键字驱动之间的阶段,有些工具厂商已经提出了声称支持关键字驱动的版本。
从上面可以看到,自动化测试框架和脚本的发展是和软件工程思想的发展一脉相承的。
软件开发的模式从面向机器、到面向过程、再到面向对象、面向服务,是一个从底层到高层、从具体到抽象、复用的粒度从细到粗的发展过程。
而软件开发中的模块化、层次化、松耦合等思想对自动化测试框架的设计都具有借鉴意义。