青岛理工大学毕业论文(设计)
第6章 系统测试
一个程序并不可能达到十分完美,难免存在一些错误。如果不能及时将其找出并修改,会造成系统崩溃并造成不必要的损失。通过软件测试,尽可能多的找出系统中的错误,以便于及时修改。
经过前一阶段的设计与开发,本次设计的基于Android平台的音乐播放器基本结束。为了尽早发现软件的错误和漏洞,使软件能够长期、稳定的运行下去,下面将对本系统的主要部分进行软件测试。
测试环境:硬件环境为普通计算机配置,后者为2.3版本以上的Android手机。软件环境为系统软件:Windows XP,工具软件:Eclipse、SQLite和Android手机模拟器。
系统关键测试点:软件环境测试和音乐播放功能测试。
6.1 软件测试的发展史
软件测试的发展历史:20世纪60年代(软件工程建立前),为表明程序正确而进行测试。1972年在北卡罗来纳大学举行了首届软件测试正式会议。1975年John Good Enough和Susan Gerhart在IEEE上发表了《测试数据选择的原理》的文章,软件测试被确定为一种研究方向。1979年,Glenford Myers的《软件测试艺术》,对测试做了定义:测试是为发现错误而执行的一个程序或者系统的过程。20世纪80年代早期,“质量”的号角开始吹响。软件测试定义发生了改变,测试不单纯是一个发现错误的过程,而且包含软件质量评价的内容。制定了各类标准。1983年,Bill Hetzel在《软件测试完全指南》中指出:测试是以评价一个程序或者系统属性为目标的任何一种活动,测试是对软件质量的度量[12]。20世纪90年代,测试工具盛行起来。1996年提出的测试能力成熟度TCMM(Testing Capability Maturity Model)、测试支持度TSM(Testability Support Model)、测试成熟度TMM
37
青岛理工大学毕业论文(设计)
(Testing Maturity Model)[12]。到了2002年,Rick和Stefan在《系统的软件测试》一书中对软件测试做了进一步定义:测试是为了度量和提高被测软件的质量,对测试软件进行工程设计、实施和维护的整个生命过程[13]。
6.2 软件测试的相关背景
相关背景:前段时间,就是在我没有认真了解测试行业之前,可能由于测试在中国的重视程度的问题,我也一直认为测试应该是不重要的,甚至认为有必要有专门的测试职业吗?认为软件主要是开发人员的事,软件的成果也是由开发人员决定的, 当我在参加工作后,真正从学校的学习环境中走上实际运用开发的时候,事实上真的不是那么一回事哦。软件无处不在,然而,软件是人编的——所以不完美。臭名昭著的软件测试案例:
1、迪士尼的狮子王(1994~1995)软件在少数系统中能正常工作,但在大众使用的常见系统中不行。后来证实,迪士尼公司没有对市场上投入实用的各种pc机型进行正确的测试。
2、英特尔奔腾浮点除法软件缺陷(1994)英特尔为自己处理软件缺陷拿出4亿美元支付更换坏芯片的费用。导致付出如此昂贵的代价,其主要原因是发现了软件缺陷没有正确的处理。
3、美国航天局火星极地登陆(1999)该项目使用前有经过测试,两个测试小组双方独立工作都很好,但从未走在一起。
4、爱国者导弹防御系统(1991)一枚导弹在多哈击毙28名美国士兵,症结在于一个软件缺陷:一个很小的系统时钟错误累积起来就可能拖延14小时,造成跟踪系统失去准确度。在多哈袭击战中系统被拖延100小时。
5、千年虫(大约1974)估计世界各地更换或升级该系统程序解决原有2000年错误的费用已经超过数亿美元。
6.3 软件测试概述
38
青岛理工大学毕业论文(设计)
6.3.1 软件测试的定义
软件测试使用人工或者自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别[14]。它是帮助识别开发完成(中间或最终的版本)的计算机软件(整体或部分)的正确度(correctness)完全度(completeness)和质量(quality)的软件过程;是SQA(software quality assurance)的重要子域。
(1)测试并不仅仅是为了找出错误.通过分析错误产生的原因和错误的发生趋势,可以帮助项目管理者发现当前软件开发过程中的缺陷,以便及时改进;
(2)这种分析也能帮助测试人员设计出有针对性的测试方法,改善测试的效率和有效性;
(3)没有发现错误的测试也是有价值的,完整的测试是评定软件质量的一种方法。
6.3.2 软件测试的描述
测试是软件开发过程的重要组成部分, 是用来确认一个程序的品质或性能是否符合开发之前所提出的一些要求。软件测试的目的, 第一是确认软件的质量, 其一方面是确认软件做了你所期望的事情(Do the right thing), 另一方面是确认软件以正确的方式来做了这个事件(Do it right);第二是提供信息, 比如提供给开发人员或程序经理的反馈信息, 为风险评估所准备的信息;第三软件测试不仅是在测试软件产品的本身, 而且还包括软件开发的过程。如果一个软件产品开发完成之后发现了很多问题, 这说明此软件开发过程很可能是有缺陷的。 6.3.3 软件测试的原则
1.应当把\尽早和不断的测试\作为开发者的座右铭。
2.程序员应该避免检查自己的程序, 测试工作应该由独立的专业的软件测试机构来完成。
3.设计测试用例时应该考虑到合法的输入和不合法的输入以及各种边界条
39
青岛理工大学毕业论文(设计)
件, 特殊情况下要制造极端状态和意外状态, 比如网络异常中断、电源断电等情况。
4.一定要注意测试中的错误集中发生现象, 这和程序员的编程水平和习惯有很大的关系。
5.对测试错误结果一定要有一个确认的过程, 一般有A测试出来的错误, 一定要有一个B来确认, 严重的错误可以召开评审会进行讨论和分析。
6.制定严格的测试计划, 并把测试时间安排的尽量宽松, 不要希望在极短的时间内完成一个高水平的测试。
7.回归测试的关联性一定要引起充分的注意, 修改一个错误而引起更多的错误出现的现象并不少见。
8.妥善保存一切测试过程文档, 意义是不言而喻的, 测试的重现性往往要靠测试文档。
6.4 软件测试中的类测试
面向对象软件从宏观上来看是各个类之间的相互作用。在面向对象系统中,系统的基本构造模块是封装了的数据和方法的类和对象,而不再是一个个能完成特定功能的功能模块。每个对象有自己的生存周期,有自己的状态。消息是对象之间相互请求或协作的途径,是外界使用对象方法及获取对象状态的唯一方式。对象的功能是在消息的触发下,由对象所属类中定义的方法与相关对象的合作共同完成,且在不同状态下对消息的响应可能完全不同。对象中的数据和方法是一个有机的整体,测试过程中不能仅仅检查输入数据产生的输出结果是否与预期的吻合,还要考虑对象的状态。模块测试的概念已不适用于对象的测试“类测试将是整个测试过程的一个重要步骤。
6.4.1 基于服务的类测试技术?
基于服务的类测试主要考察封装在类中的一个方法对数据进行的操作,它可以采用传统的白盒测试方法。为克服软件测试的盲目性和局限性,保证测试的质量,
40