软件测试的由来与发展Word格式.docx
《软件测试的由来与发展Word格式.docx》由会员分享,可在线阅读,更多相关《软件测试的由来与发展Word格式.docx(22页珍藏版)》请在冰豆网上搜索。
所以要坚持软件开发各阶段的,把错误克服在早期,从而减少成本,提高软件质量。
3.对测试用例要有正确的态度:
第一,测试用例应当由测试输入数据和预期输出结果这两部分组成;
第二,在设计测试用例时,不仅要考虑合理的输入条件,更要注意不合理的输入条件。
因为软件投入实际运行中,往往不遵守正常的使用方法,却进行了一些甚至大量的意外输入导致软件一时半时不能做出适当的反应,就很容易产生一系列的问题,轻则输出错误的结果,重则瘫痪失效!
因此常用一些不合理的输入条件来发现更多的鲜为人知的。
软件测试视频
4.人以群分,物以类聚,软件测试也不例外,一定要充分注意软件测试中的群集现象,也可以认为是“80-20原则”。
不要以为发现几个错误并且解决这些问题之后,就不需要测试了。
反而这里是错误群集的地方,对这段程序要重点测试,以提高测试投资的效益。
5.严格执行,排除测试的随意性,以避免发生或者重复无效的工作。
6.应当对每一个测试结果进行全面检查。
一定要全面地、仔细地检查测试结果,但常常被人们忽略,导致许多错误被遗漏。
7.妥善保存测试用例、测试计划、测试报告和最终分析报告,以备回归测试及维护之用。
在遵守以上原则的基础上进行软件测试,可以以最少的时间和人力找出软件中的各种缺陷,从而达到保证软件质量的目的。
心理学
人类行为具有高度目标性,确立一个正确的目标有着重要的心理学影响。
软件测试的心理学问题就是如何摆正测试的两个目标的关系,使得测试活动更加富有成效。
1.程序测试的过程具有破坏性
每当测试一个程序时,人们总希望为程序增加一些价值。
利用测试来增加程序的价值,是指通过测试,找出并修改尽可能多的程序缺陷,从而提高程序的可靠性或质量。
因此,不要只是为了证明程序能够正确运行而去。
相反,应该一开始就假设程序中隐藏着错误(这种假设几乎对所有的程序都成立),然后测试程序,发现尽可能多的错误。
事实上,如果把测试目标定位于要证明程序中没有缺陷,那么就会在潜意识中倾向于实现这个目标。
也就是说,测试人员会倾向于挑选那些使程序失效的可能性较小的测试数据。
另一方面,如果把测试目标定位于要证明程序中存在缺陷,那么就会选择一些容易发现程序缺陷的测试数据。
而后一种态度会比前者给程序增加更多的价值。
软件测试技术
因此,大多数测试专业人员都赞同Myers对测试的:
“测试是为发现错误而执行程序的错误。
”这个定义意味着程序测试的过程是具有破坏性的,甚至是一个“施虐”过程。
开发人员可能不愿意这么做,因为人们总是倾向于建设而不是破坏。
这个定义还暗示了对于一个特定的程序,应该如何设计测试用例(测试数据)、哪些人应该而哪些人又不应该执行测试。
事实上,如果在测试某个时发现了可以纠正的缺陷,或者测试最终确定在没有其他缺陷,则应将这次合理设计并得到有效执行的测试称作是“成功的”。
而所谓“不成功的”测试,仅指未能适当地对程序进行检查,未能找出程序中潜藏缺陷的测试。
因为软件中不可能没有缺陷,没有找出它们,当然测试是“不成功的”。
“软件测试就是证明软件不存在错误的过程”。
对几乎所有的程序而言,甚至是非常小的程序,这个目标实际上是无法达到的。
因为即使程序完全实现预期要求,仍可能包含有缺陷。
也就是说,如果程序不按要求工作,它显然有缺陷,但如果程序做了不要它做的事,它也有缺陷。
心理学研究告诉我们,当人们在干一件已经知道是不合适的或不可能做到的事时,往往他们的表现就相当糟糕。
把程序测试定义为在程序中找出错误的过程,就使测试成了可以做到的任务,从而克服了心理上存在的问题。
虽然这看起来像是个微妙的文字游戏,但对成功地进行软件测试有很大的影响。
总之,软件测试更适宜被视为试图发现程序中错误(假设其存在)的破坏性的过程。
一个成功的测试,通过诱发程序发生错误,可以在这个方向上促进软件质量的改进。
当然最终人们还是要通过软件测试来建立某种程度的:
软件做了其应该做的,而没有做其不应该做的。
2.程序员应避免测试自己的程序
软件测试书籍
由开发人员来测试自己的是一件很不妥当的事情。
开发和测试生来就是不同的活动。
开发是创造或者建立某种事物的行为,如一个功能模块或整个系统。
而测试的重要目的是证实一个模块或者一个系统工作不正常。
这两个活动之间有着本质的矛盾。
一个人不太可能把两个截然对立的角色都扮演地很好,因此应当限制开发人员在测试中的参与,给他们比较合适的任务是进行最底层的测试——单元测试。
当一个程序员完成了设计与编写程序的建设性工作后,要一夜之间突然改变他的观点,设法对程序形成一个完全否定的态度,那是非常困难的。
所以,大部分程序员都由于不能使自己进入必要的精神状态(不是抱着要揭露出自己程序中错误的态度),就不能有效的测试自己的程序。
除了这个心理学问题之外,还有一个重要的问题:
程序中可能包含由于程序员对问题的叙述或说明的误解而产生了错误。
如果是这种情况,当程序员测试自己的程序时,往往还会带着同样的误解致使问题难以发现。
3.程序设计组织不应测试自己的程序
在宏观意义上,一个程序设计组织或一个工程项目是个有生命的有机体,它同样有心理学问题。
在大多数情况下,人们都以“在给定日期内,以一定代价完成程序编制任务的能力”来衡量程序设计组织和项目管理人员的。
这样做的理由是时间和成本指标便于衡量,而程序的质量很难度量。
要程序设计组织在测试自己的程序时持客观态度是很困难的,因为如果用正确的定义看待测试,就不大可能按预定计划完成测试,也不大可能把耗费的代价限制在要求的范围以内。
软件生产的三个最重要的因素是:
质量、进度和费用。
由于费用和进度的限制,要开发一种高质量、快速交付和低成本的软件产品并不容易。
也就是说要同时达到三个目标是困难的。
因此在软件产品的开发中要权衡它们之间的关系,是软件的能满足用户的要求,这意味着软件产品的特性的度量和预计是必要的。
软件测试由独立测试机构承担有很多好处。
独立测试是指软件测试工作由在经济上和管理上独立于开发机构的组织进行。
独立测试可以避免软件开发者测试自己开发的软件,由于心理学上的问题,软件开发者难以客观、有效的测试自己的软件,要找出那些因为对问题的误解而产生的错误就更加困难。
独立测试还可以避免软件开发机构测试自己的软件,软件产品的开发过程受到时间、成本和质量三者的制约,在软件开发的过程中,当时间、成本和质量三者发生矛盾时,质量最容易被忽视,如果测试组织与开发组织来自相同的机构,测试过程就会面临来自于开发组织同一来源的管理方面的压力,使测试过程受到干扰。
采用独立测试方式,无论在技术上还是管理上,对提高软件测试的有效性都具有重要意义。
客观性——对软件测试和软件中的错误抱着客观的态度,这种客观的态度可以解决测试中的心理学问题,既能以揭露软件中错误的态度工作,也能不受发现的错误的影响。
经济上的独立性使测试有更充分的条件按测试要求去完成。
专业性——独立测试作为一种专业工作,在长期的工作过程中势必能够积累大量实践经验,形成自己的专业知识。
同时软件测试也是技术含量很高的工作,需要有专业队伍加以研究,并进行。
专业化分工是提高测试水平、保证测试质量、充分发挥测试效应的必然途径。
权威性——由于专业优势,独立测试工作形成的测试结果更具信服力,而测试结果常常和对软件的质量评价联系在一起,专业化的独立测试机构的评价,更客观、公正和具有权威性。
资源有保证——独立测试机构的主要任务是进行独立测试工作,这使得测试工作在经费、人力和计划方面更有保证,不会因为开发的压力减少对测试的投入,降低测试的有效性可以避免开发单位侧重软件开发而对测试工作产生不利的影响。
内容
软件测试主要工作内容是验证(verification)和确认(validation),下面分别给出其概念:
验证(verification)是保证软件正确地实现了一些特定功能的一系列活动,即保证软件做了你所期望的事情。
(Dotherightthing)
1.确定中的一个给定阶段的产品是否达到前阶段确立的需求的过程;
2.程序正确性的形式证明,即采用形式理论证明程序符合设计规约规定的过程;
3.评市、审查、测试、检查、审计等各类活动,或对某些项处理、服务或文件等是否和规定的需求相一致进行判断和提出报告。
确认(validation)是一系列的活动和过程,目的是想证实在一个给定的外部环境中软件的逻辑正确性。
即保证软件以正确的方式来做了这个事件(Doitright)
1.静态确认,不在上实际执行程序,通过人工或来证明软件的正确性;
2.动态确认,通过执行程序做分析,测试程序的动态行为,以证实软件是否存在问题。
软件测试的不仅仅是程序测试,软件测试应该包括整个软件开发期间各个阶段所产生的文档,如需求规格说明、文档、详细设计文档,当然软件测试的主要对象还是。
分类
从是否关心软件内部结构和具体实现的角度划分
A.
B.
C.
从是否执行程序的角度
B.。
从软件开发的过程按阶段划分有
D.
E.
*测试过程按4个进行,即单元测试、集成测试、确认测试和系统测试及发版测试。
*开始是单元测试,集中对用实现的每一个进行测试,检查各个是否正确地实现了规定的功能。
*集成测试把已测试过的模块组装起来,主要对与设计相关的的构造进行测试。
*确认测试则是要检查已实现的软件是否满足了需求规格说明中确定了的各种需求,以及是否完全、正确。
*系统测试把已经经过确认的软件纳入实际运行环境中,与其它系统成份组合在一起进行测试。
单元测试(UnitTesting)
*单元测试又称模块测试,是针对的最小单位─程序模块,进行正确性检验的测试工作。
其目的在于发现各模块内部可能存在的各种差错。
*单元测试需要从程序的内部结构出发设计测试用例。
多个模块可以平行地独立进行单元测试。
1.单元测试的内容
*在单元测试时,测试者需要依据和源程序清单,了解该模块的I/O条件和模块的,主要采用白盒测试的测试用例,辅之以黑盒测试的测试用例,使之对任何合理的输入和不合理的输入,都能鉴别和响应。
(1)模块接口测试
*在单元测试的开始,应对通过被测模块的数据流进行测试。
测试项目包括:
–调用本模块的输入参数是否正确;
–本模块调用子模块时输入给子模块的参数是否正确;
–全局量的定义在各模块中是否一致;
*在做内外存交换时要考虑:
–文件属性是否正确;
–OPEN与CLOSE语句是否正确;
–容量与记录长度是否匹配;
–在进行读写操作之前是否打开了文件;
–在结束文件处理时是否关闭了文件;
–正文书写/输入错误,
–I/O错误是否检查并做了处理。
(2)局部测试
*不正确或不一致的数据类型说明
*使用尚未赋值或尚未的变量
*错误的初始值或错误的缺省值
*变量名拼写错或书写错
*不一致的数据类型
*全局数据对模块的影响
(3)路径测试
*选择适当的测试用例,对模块中重要的执行路径进行测试。
*应当设计测试用例查找由于错误的计算、不正确的比较或不正常的控制流而导致的错误。
*对基本执行路径和循环进行测试可以发现大量的路径错误。
(4)错误处理测试
*出错的描述是否难以理解
*出错的描述是否能够对错误定位
*显示的错误与实际的错误是否相符
*对错误条件的处理正确与否
*在对错误进行处理之前,错误条件是否已经引起系统的干预等
(5)边界测试
*注意数据流、控制流中刚好等于、大于或小于确定的比较值时出错的可能性。
对这些地方要仔细地选择测试用例,认真加以测试。
*如果对模块运行时间有要求的话,还要专门进行关键路径测试,以确定最坏情况下和平均意义下影响模块运行时间的因素。
2.单元测试的步骤
*模块并不是一个独立的程序,在考虑测试模块时,同时要考虑它和外界的联系,用一些辅助模块去模拟与被测模块相联系的其它模块。
–驱动模块(driver)
–桩模块(stub)──存根模块
*如果一个模块要完成多种功能,可以将这个模块看成由几个小程序组成。
必须对其中的每个小程序先进行单元测试要做的工作,对关键模块还要做性能测试。
*对支持某些标准规程的程序,更要着手进行互联测试。
有人把这种情况特别称为模块测试,以区别单元测试。
集成测试(IntegratedTesting)
*集成测试(集成测试、联合测试)
*通常,在单元测试的基础上,需要将所有模块按照设计要求组装成为系统。
这时需要考虑的问题是:
–在把各个模块连接起来的时候,穿越模块接口的数据是否会丢失;
–一个模块的功能是否会对另一个模块的功能产生不利的影响;
–各个子功能组合起来,能否达到预期要求的父功能;
–全局数据结构是否有问题;
–单个模块的误差累积起来,是否会放大,从而达到不能接受的程度。
在单元测试的同时可进行集成测试,
发现并排除在模块连接中可能出现
的问题,最终构成要求的。
*子系统的集成测试特别称为部件测试,它所做的工作是要找出集成后的子系统与系统需求规格说明之间的不一致。
*通常,把模块集成成为系统的方式有两种
–一次性集成方式
–增殖式集成方式
1.一次性集成方式(bigbang)
*它是一种非增殖式组装方式。
也叫做整体拼装。
*使用这种方式,首先对每个模块分别进行模块测试,然后再把所有模块组装在一起进行测试,最终得到要求的软件系统。
2.增殖式集成方式
*这种集成方式又称渐增式集成
*首先对一个个模块进行模块测试,然后将这些模块逐步组装成较大的系统
*在集成的过程中边连接边测试,以发现连接过程中产生的问题
*通过增殖逐步组装成为要求的软件系统。
(1)自顶向下的增殖方式
*这种集成方式将模块按系统程序结构,沿控制层次自顶向下进行组装。
*自顶向下的增殖方式在测试过程中较早地验证了主要的控制和判断点。
*选用按深度方向组装的方式,可以首先实现和验证一个完整的软件功能。
(2)自底向上的增殖方式
*这种集成的方式是从程序模块结构的最底层的模块开始集成和测试。
*因为模块是自底向上进行组装,对于一个给定层次的模块,它的子模块(包括子模块的所有下属模块)已经组装并测试完成,所以不再需要桩模块。
在模块的测试过程中需要从子模块得到的信息可以直接运行子模块得到。
*自顶向下增殖的方式和自底向上增殖的方式各有优缺点。
*一般来讲,一种方式的优点是另一种方式的缺点。
(3)混合增殖式测试
*衍变的自顶向下的增殖测试
–首先对输入/输出模块和引入新算法模块进行测试;
–再自底向上组装成为功能相当完整且相对独立的子系统;
–然后由主模块开始自顶向下进行增殖测试。
*自底向上-自顶向下的增殖测试
–首先对含读操作的子系统自底向上直至根结点模块进行组装和测试;
–然后对含写操作的子系统做自顶向下的组装与测试。
*回归测试
–这种方式采取自顶向下的方式测试被修改的模块及其子模块;
–然后将这一部分视为子系统,再自底向上测试。
关键模块问题
*在时,应当确定关键模块,对这些关键模块及早进行测试。
*关键模块的特征:
①满足某些;
②在程序的模块结构中位于较高的层次(高层控制模块);
③较复杂、较易发生错误;
④有明确定义的性能要求。
确认测试(ValidationTesting)
*确认测试又称有效性测试。
任务是验证软件的功能和性能及其它特性是否与用户的要求一致。
*对软件的功能和性能要求在软件需求规格中已经明确规定。
它包含的信息就是软件确认测试的基础。
1.进行有效性测试(黑盒测试)
*有效性测试是在模拟的环境(可能就是开发的环境)下,运用黑盒测试的方法,验证被测软件是否满足需求规格说明书列出的需求。
*首先制定测试计划,规定要做测试的种类。
还需要制定一组测试步骤,描述具体的测试用例。
*通过实施预定的测试计划和测试步骤,确定
–软件的特性是否与需求相符;
–所有的文档都是正确且便于使用;
–同时,对其它软件需求,例如可移植性、兼容性、出错自动恢复、可维护性等,也都要进行测试
*在全部软件测试的测试用例运行完后,所有的测试结果可以分为两类:
–测试结果与预期的结果相符。
这说明软件的这部分功能或性能特征与需求规格说明书相符合,从而这部分程序被接受。
–测试结果与预期的结果不符。
这说明软件的这部分功能或性能特征与需求规格说明不一致,因此要为它提交一份问题报告。
2.软件配置复查
n软件配置复查的目的是保证
u软件配置的所有成分都齐全;
u各方面的质量都符合要求;
u具有维护阶段所必需的细节;
u而且已经编排好分类的目录。
n应当严格遵守用户手册和操作手册中规定的使用步骤,以便检查这些文档的完整性和正确性。
验收测试(AcceptanceTesting)
*在通过了系统的有效性测试及软件配置审查之后,就应开始系统的验收测试。
*验收测试是以用户为主的测试。
软件开发人员和QA(质量保证)人员也应参加。
*由用户参加设计测试用例,使用生产中的实际数据进行测试。
*在测试过程中,除了考虑软件的功能和性能外,还应对软件的可移植性、、可维护性、错误的恢复功能等进行确认。
*确认测试应交付的文档有:
–确认测试分析报告
–最终的用户手册和操作手册
–项目开发总结报告。
系统测试(SystemTesting)
*系统测试,是将通过确认测试的软件,作为整个基于的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其它系统元素结合在一起,在实际运行环境下,对计算机系统进行一系列的组装测试和确认测试。
*系统测试的目的在于通过与系统的需求定义作比较,发现软件与系统的定义不符合或与之矛盾的地方。
软件测试模型
软件测试若使用经典的V模型阶段可以分为
单元测试
集成测试
系统测试
V模型是最具有代表意义的测试模型。
是软件开发的变种,它反映了测试活动与分析和设计的关系。
从左到右,描述了基本的开发过程和测试行为,非常明确地标明了测试过程中存在的不同级别,并且清楚地描述了这些测试阶段和开发过程期间各阶段的对应关系。
左边依次下降的是开发过程各阶段,与此相对应的是右边依次上升的部分,即各测试过程的各个阶段。
用户需求验收测试
和系统设计确认测试和系统测试
概要设计集成测试
详细设计单元测试
V模型问题:
1.测试是开发之后的一个阶段。
2.测试的对象就是程序本身。
3.实际应用中容易导致需求阶段的错误一直到最后系统测试阶段才被发现。
4.整个软件产品的过程质量保证完全依赖于开发人员的能力和对工作的责任心,而且上一步的结果必须是充分和正确的,如果任何一个环节出了问题,则必将严重的影响整个工程的质量和预期进度
W模型
W由Evolutif公司公司提出,相对于V模型,W模型增加了软件各开发阶段中应同步进行的验证和确认活动。
W模型由两个V字型模型组成,分别代表测试与开发过程,图中明确表示出了测试与开发的并行关系。
W模型强调:
测试伴随着整个软件开发周期,而且测试的对象不仅仅是程序,需求、设计等同样要测试,也就是说,测试与开发是同步进行的。
W模型有利于尽早地全面的发现问题。
例如,需求分析完成后,测试人员就应该参与到对需求的验证和确认活动中,以尽早地找出缺陷所在。
同时,对需求的测试也有利于及时了解项目难度和测试风险,及早制定应对措施,这将显著减少总体测试时间,加快项目进度。
但W模型也存在局限性。
在W模型中,需求、设计、编码等活动被视为串行的,同时,测试和开发活动也保持着一种线性的前后关系,上一阶段完全结束,才可