测试的基础知识—软件测试核心技术(1)

发表于:2020-8-10 12:14

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:51Testing教研团队    来源:51Testing软件测试网原创

  第1章 测试的基础知识
  本章首先介绍软件测试的定义、目的和对象,然后讲述软件的生命周期,接着介绍软件研发的组织架构和流程,并讨论软件中为什么会存在缺陷,最后介绍什么是测试用例和测试执行等。
  1.1 软件测试简介
  下面结合实例介绍软件测试的基本概念,以及软件测试的现状和发展趋势。
  1.1.1 软件错误实例
  实例一:国际日期变更线引起的错误(功能性错误)。
  2007年2月,美军F22战斗机从夏威夷飞往日本,途径日期变更线(东经180°,西经0°)时引发软件缺陷问题(由于软件的边界值漏洞),导致飞机上的全球定位系统失灵,计算机系统崩溃。飞行员无法确定战机的位置,因而返回夏威夷的希卡姆空军基地。
  实例二:售票系统瘫痪(性能错误)。
  在某次大型活动的售票期间,由于购票人数过多,导致网络售票系统出现暂时无法访问的情况。事后分析,系统在启动之后访问量剧增,网站访问量达到每小时800万次,超过设计时要求的100万次;售票系统启动后的第一个小时内从各售票渠道瞬时提交到该系统的门票销售数量达到20万,也超过了该系统每小时销售15万张票的处理能力。
  实例三:Google公司的Gmail故障。
  2009年2月,Google公司的Gmail出现故障,Gmail用户在几小时内不能访问邮箱,该软件故障受到广泛关注。据Google公司称,这次故障是因数据中心之间的负载均衡软件的错误引发的。
  1.1.2 软件测试的基本概念
  从以上软件错误实例可以发现,即使是一些知名公司的系统也会存在错误,因此测试就变得非常重要了。到底什么是软件测试?测试表示为检验产品是否满足需求而进行的一系列活动。而软件测试活动中很重要的任务是发现错误。软件测试的经典定义是在规定条件下对程序进行操作,以发现错误,并对软件质量进行评估。
  既然软件是由文档、数据及程序组成的,那么软件测试就应该是对软件形成过程中的文档、数据及程序进行测试,而不仅仅是对程序进行测试。
  1.1.3 软件测试的现状
  软件开发中经常会出现错误或缺陷,开发人员和测试人员对软件质量重要性的认识逐渐增强,因此,软件测试在软件项目实施过程中的重要性日益突出。但是,实际上,与软件编程相比,软件测试的地位和作用还没有真正受到重视,很多人(甚至是软件项目组的技术人员)对软件测试还存在认识上的误区,这进一步影响了软件测试活动的开展,也影响了软件测试质量的提高。
  ●误区之一:软件开发完成后进行软件测试。
  通常,软件项目要经过几个阶段—计划、需求分析、概要设计、详细设计、软件编码、软件测试和软件发布。因此,如果认为软件测试只是软件编码后的一个过程,这是关于软件测试周期的错误认识。软件测试是一系列的过程,包括软件测试需求分析、测试计划设计、测试用例设计和测试执行。因此,软件测试贯穿于软件项目的整个过程。在软件项目的每一个阶段,针对不同目的和内容,都要进行测试,以保证各个阶段的正确性。软件测试的对象不仅是软件代码,还包括软件需求文档和设计文档。软件开发与软件测试应该是交互进行的,如单元编码需要单元测试,在模块组合阶段需要集成测试。如果等到软件编码结束后才进行测试,那么测试的时间会很短,测试的覆盖面不全,测试效果也将大打折扣。更严重的是,如果此时发现了软件需求分析阶段或概要设计阶段的错误,要修复这类错误,将会耗费大量的时间和人力。
  ●误区之二:软件发布后如果发现质量问题,那么是软件测试人员的错误。
  这种错误的认识将会打击软件测试人员的积极性。软件中的错误可能来自软件项目中的各个过程,软件测试只能确认软件存在错误,不能保证软件没有错误,因为从根本上讲,软件测试不可能发现全部的错误。从软件开发的角度看,高质量的软件不是软件测试人员测试出来的,而是依靠软件生命周期中的各个过程共同实现的。出现软件错误,不能简单地归结为某一个人的责任,有些错误的产生可能不是技术原因,可能来自混乱的项目管理。应该分析软件项目的各个过程,从过程改进方面寻找产生错误的原因和改进的措施。
  ●误区之三:软件测试要求不高,随便找一个人就行。
  很多人认为软件测试就是安装和运行程序以及操作鼠标和键盘的简单工作,这是由于不了解软件测试的具体技术和方法造成的错误看法。随着软件工程学的发展和软件项目管理水平的提高,软件测试已经形成了一个独立的技术学科,并已形成一个具有巨大市场需求的行业。软件测试技术不断更新和完善,新工具、新流程和新方法也在不断发展,测试人员需要不断学习和掌握更多的新知识。具有编程经验的程序员不一定是一名优秀的软件测试工程师。软件测试包括测试技术和管理两个方面,完全掌握这两个方面的内容,需要很多测试实践经验并且不断学习。
  ●误区之四:软件测试是测试人员的事情,与程序员无关。
  开发和测试是相辅相成的,需要软件测试人员、程序员和系统分析师等保持密切的联系,进行更多的交流和协调。另外,单元测试主要应该由程序员完成,根据需要,测试人员可以帮助设计测试用例。为了修复测试中发现的软件错误,往往需要程序员修改编码。通过分析软件错误的类型、数量,找出产生错误的位置和原因,程序员可以在今后的编程中避免同样的错误,积累编程经验,提高编程能力。
  ●误区之五:在项目进度吃紧时少做测试,在时间富裕时多做测试。
  这是不重视软件测试的表现,也是软件项目过程管理混乱的表现,必然会降低软件测试的质量。一个软件项目的顺利实现需要有合理的项目进度计划,其中包括合理的测试计划。对于项目实施过程中的任何问题,都要有风险分析和相应的对策,不要因为担心开发进度的延期而简单地缩短测试时间,减少人力和相关资源的投入。因为缩短测试时间带来的测试不完整性和项目质量下降而引起的潜在风险,往往会导致更大的浪费。解决这种问题的比较好的办法是加强软件过程的计划和控制,包括软件测试计划、测试设计、测试执行、测试度量和测试控制。
  ●误区之六:软件测试是没有前途的工作,只有程序员才是软件高手。
  由于一些软件企业的软件研发过程很不规范,很多软件项目的开发还停留在“作坊式”阶段。项目的成功往往依靠个别全能程序员的能力,他们负责总体设计和程序详细设计,甚至有些人认为软件开发就是编写代码。因此,在这种环境下,软件测试不受重视,软件测试人员的地位和待遇自然就低,甚至软件测试变得可有可无。随着市场对软件质量要求的不断提高,软件测试将变得越来越重要,相应的软件测试人员的地位和待遇也将逐渐提高。在软件开发过程比较规范的企业中,软件测试人员的数量和待遇与程序员没有多大差别,优秀测试人员的待遇甚至比程序员还要高。软件测试将会成为一个具有很大发展前景的行业,测试行业需要更多具有丰富测试技术和管理经验的测试人员,他们同样是软件测试领域的专家。
  1.1.4 软件测试的发展趋势
  随着软件行业的发展,软件产品的质量控制与质量管理正逐渐成为软件企业生存与发展的核心要素。每个大中型信息技术(Information Technology,IT)企业的软件产品在发布前都需要进行大量的质量控制、测试和文档编写工作,这些工作必须依靠拥有娴熟技术的专业软件人才来完成,而软件测试工程师就扮演了这样的一个角色。据业内人士分析,该类职位的需求主要集中在经济发达城市,其中北京和上海的需求量分别占33%和29%。按企业性质来划分,民企需求量最大,占19%;外商独资的欧美企业需求量的排名是第二,占15%。然而,一方面,企业对高质量的软件测试工程师需求量越来越大;另一方面,国内原来对软件测试工程师的重视程度不够,导致许多人不了解软件测试工程师具体从事什么工作。许多IT公司只能在实际工作中利用淘汰的方式对软件测试工程师进行筛选,因此国内可能在短期内将出现软件测试工程师短缺的现象。据悉,许多正在招聘软件测试工程师的企业很少能够在招聘会上顺利招聘到合适的人才。在具体工作过程中,软件测试工程师的工作是利用测试工具按照测试方案和流程对产品进行功能与性能测试,甚至根据需要编写不同的测试用例,设计和维护测试系统,对测试方案可能出现的问题进行分析和评估。对于软件测试工程师而言,必须具有高度的工作责任心和自信心。任何严格的测试必须是一种实事求是的测试,因为它关系到一个产品的质量问题。另外,软件测试工程师是产品发布前的把关人,因此,没有达到专业的技术水准是无法胜任这项工作的。同时,由于测试工作一般由多个软件测试工程师共同完成,并且测试部门一般要与其他部门的人员进行较多的沟通,因此要求软件测试工程师不但要有较强的技术能力,而且要有较强的沟通能力。
  1.2 软件测试的目的和对象
  作为一项独立的工作,针对不同的对象,软件测试在研发中的不同阶段可以有不同的工作目的。
  1.2.1 软件测试的目的
  从历史的观点来看,测试关注的是通过执行软件来获得软件在可用性方面的信心并且证明软件能够正常工作,这引导测试人员把重点放在检测和排除缺陷上。基于这个观点,现代的软件测试同时还认识到许多主要的缺陷主要来自需求和设计方面的遗漏与不正确性。因此,早期的结构化同行评审用于帮助预防编码前的缺陷。图1-1展示了测试目的的演变。
  图1-1  测试目的的演变
  1.证明
  ●获取系统在可接受风险范围内可用的信心。
  ●尝试在非正常情况和条件下的功能与特性。
  ●保证一个工作产品是完整的并且可用或者可集成。
  2.检测
  ●发现系统的缺陷、错误。
  ●定义系统的能力和局限性。
  ●提供组件、工作产品和系统的质量信息。
  3.预防
  ●澄清系统的规格和性能。
  ●为预防或减少可能的错误提供相关信息。
  ●在测试过程中尽早地检测错误。
  ●确认问题和风险,并且提前确认解决这些问题和风险的途径。
  Glenford J. Myers就软件测试的目的提出了以下观点。
  ●测试是程序员执行的过程,目的在于发现错误。
  ●通过一个好的测试用例能发现至今未发现的错误。
  ●一个成功的测试是发现了至今未发现的错误的测试。
  Bill Hetzel认为测试的目的不仅是发现软件缺陷与错误,还包括对软件质量进行度量和评估,以提高软件的质量。
  因此,软件测试的目的是以最少的人力、物力和时间成本找出软件中潜在的各种错误与缺陷,通过修正各种错误和缺陷来提高软件的质量,避免软件发布或使用后由于潜在的错误和缺陷造成商业损失甚至更严重的后果。
  同时,测试是以评价一个程序或系统属性为目标的活动,测试是对软件质量的度量与评估,以验证软件的质量满足用户需求的程度,为用户选择与接受软件提供有力的依据。此外,通过分析错误产生的原因还可以帮助发现当前软件开发过程的缺陷,以便进行软件过程的改进。同时,通过对结果的分析整理,还可以修正软件开发规则,并为软件可靠性分析提供依据。
  1.2.2 软件测试的对象
  根据软件的定义,软件包括程序、数据和文档,所以软件测试并不仅仅是程序测试。软件测试应该贯穿于整个软件的生命周期中。在整个软件的生命周期中,各阶段有不同的测试对象,形成了不同开发阶段中不同类型的测试。需求分析、概要设计、详细设计及编码等各阶段所得到的文档,包括软件需求说明书(Software Requirement Specification,SRS)、概要设计(High Level Design,HLD)说明书、详细设计(Low Level Design,LLD)说明书及源程序,这些都应该成为“软件测试”的对象。
  由于软件分析、设计与开发各阶段是互相衔接的,前一阶段中出现的问题如未及时解决,很自然要影响到下一阶段。从源程序的测试中找到的错误不一定都是在程序编写过程中产生的,如果简单地把程序中的错误全都归罪于开发人员,未免冤枉了他们。据美国一家公司的统计,在查找出的软件错误中,需求分析和软件设计方面的错误占64%,程序编写方面的错误仅占36%。这都说明,对于程序编写而言,它的许多错误是“先天的”。事实上,到程序的测试为止,软件开发工作已历经多个环节,每个环节都有可能发生问题。
  为了保证各个环节的正确性,人们需要进行各种验证和确认(verification & validation)工作。
  ●验证是保证软件正确实现特定功能的一系列活动和过程,目的是保证软件生命周期中每一个阶段的成果满足上一个阶段所设定的目的。
  ●确认是保证软件满足用户需求的一系列的活动和过程,目的是在软件开发完成后保证软件与用户需求相符合。
  验证与确认都属于软件测试,软件测试包括软件分析、设计及程序的验证和确认。

版权声明:51Testing软件测试网获得人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号