第1篇 自动化测试基础篇

第1章 软件测试基础

软件测试是软件质量保证的重要手段,通过软件测试发现软件缺陷,从而修改缺陷,提高软件的质量水平。本章介绍软件测试的基本知识,包括软件缺陷与软件测试的关系,软件质量与软件测试的关系,以及软件开发与软件测试的关系。本章内容也是软件自动化测试的基础知识。

1.1 软件缺陷与软件测试

在软件测试领域,至今为止,还没有一种有效的缺陷检测机制,可以完全发现所有的缺陷。因为软件缺陷与硬件缺陷存在很多不同之处。

1.1.1 软件缺陷与硬件缺陷的异同

软件缺陷与硬件缺陷一样,会对产品的使用方造成困扰。但是软件缺陷在一般情况下,不会对用户造成直接的人身伤害,所以很多人没有意识到软件缺陷的危害性和严重性。然而,在一些依赖软件进行业务处理的领域,软件缺陷可能造成重大的经济损失,甚至危及人身安全,例如,2007年4月,某个软件缺陷导致某地铁系统的列车火灾,软件未能检测和防止剩余动力在设备中的使用,导致列车过热而起火。

美国标准和技术研究机构(National Institute of Standards and Technology)在2002年公布的一项关于软件缺陷引起的经济损失的报告中的数据表明:由于软件缺陷造成的美国经济损失高达595亿美元。

因此,软件缺陷与硬件缺陷一样,可能会对用户造成重大的损失,人们需要像对待硬件缺陷一样重视软件缺陷。很多硬件缺陷的出错模式是可以预见的,而软件缺陷的可预见性则没有那么强。软件缺陷的一个重要特点是它的隐蔽性,由于软件的复杂度高、状态空间广阔,因此,要覆盖软件所有可能的行为几乎是不可能的。

1.1.2 如何通过软件测试发现软件缺陷

为了解决软件缺陷带来的困扰,人们仍然在不断地寻找有效发现软件错误的方法,手工测试仍然是主要的查找错误的方式,自动化测试能部分地解决覆盖面的问题和测试效率的问题,但是不能从根本上解决问题。

不能单单靠软件测试来保证软件不出错,软件测试仅仅是发现软件缺陷的一种手段而已。在软件测试人员的角色出现之前,是由开发人员来负责缺陷控制的,而开发人员往往停留在“调试”阶段的测试水平,在代码调试通过后,往往不会花太多专门的时间来发现缺陷。而且,开发人员一般不习惯于对自己的代码进行批判性的检查,很多时候,对自己编写的代码过于自信,因此,很多缺陷就留待用户来发现了。

由于软件测试是比较直接的发现软件缺陷的手段,因此也就成为了软件缺陷控制的主要手段。测试人员通过研究软件产品的需求,以及用户的实际业务场景,设计出各种测试用例,通过执行测试用例,判断被测试的应用程序是否满足用户需求。

执行测试用例的过程可以是一个手动的过程,也可以是一个自动化的过程。如果把这些测试用例转换成一个可被自动化测试工具执行的脚本,则成为一个自动化测试用例。

测试用例大体分为两种类型:一种是用于验证软件的功能是正确的;另一种是用于证明软件是错误的。两种类型的测试用例都可以转化成自动化测试脚本,使用自动化的方式执行。

1.2 软件质量与软件测试

软件质量是软件产品的核心价值体现,也是软件企业竞争力的体现,重视软件质量的企业通常能获得更多的收益。软件质量是软件项目管理的重要组成部分,在不同的开发模式中,都会围绕软件质量管理提出相关的做法。

1.2.1 软件质量管理在项目管理中的地位

软件项目的成败是由成本、进度、质量三者共同决定的,缺一不可。无论是哪一种软件工程的模型,都必须充分考虑这3个方面,并且要考虑如何协调这3个方面,使其搭配达到最佳的平衡点。

(1)成本主要考虑项目的开销,包括人员成本、工具成本、设备成本、错误成本等。所谓错误成本是指软件生产过程中由于缺陷错误的产生导致的收回、返工等成本。某些软件还需要考虑市场营销成本等。

(2)进度主要考虑时间上的控制。如何在规定的时间范围内,完成一个令顾客满意的软件产品,是每个项目的首要挑战。

(3)质量主要考虑软件对顾客需求的满足程度。一个低质量的软件,即使生产成本很低,进度控制良好,也不能让顾客接受。因此,质量是软件产品的生命线。

QTP自动化测试实践

1.2.2 软件开发模式与软件测试

在不同的软件开发模式中,软件测试的地位和作用略有不同,例如,在传统的瀑布开发模型中,软件测试作为一个独立的阶段出现,在进入软件测试阶段之前,应该完成编码,并且提供完善的需求、设计和开发文档。

而在迭代模型中,则不会有一段独立的测试时间和阶段,测试必须跟随开发的迭代而迭代。因此,回归测试的重要性就不言而喻了。

而在敏捷开发模式中,软件测试与软件开发的界限变得模糊,由于敏捷开发所推崇的测试驱动,使得开发人员开始习惯于单元测试,在开发的过程中不断测试,只有当测试完成后才能宣告开发结束,因此软件测试与开发过程能很紧密地耦合在一起。

提示

不管是哪一种开发模式,软件测试是不可能消失的,而且软件测试作为保证软件质量的重要手段,应该得到所有项目成员的重视和参与。

1.2.3 软件开发模式与自动化测试

采用不同的项目开发模型对自动化测试有不同的影响。

(1)瀑布模型:瀑布模型在需求定义方面做得很好,这对自动化测试是有益的,包括可以尽早选择合适的自动化测试策略,让自动化测试可以高层次、整体地进行计划。

(2)RUP:RUP强调的迭代开发让自动化测试可以应用在开发周期的很大一部分时间中。但是,也意味着频繁的变更,自动化测试需要与开发策略紧密结合,关注早期构建、迭代的速度、风险、覆盖目标等。

(3)敏捷:敏捷方法打破了传统的自动化测试方法。第一个破坏点集中在自动化的可接受性测试。这种测试所使用的工具超越了传统的自动化测试工具的范围,并且,很难被其他类型的自动化重用。细粒度的迭代让每次自动化测试难以集中目标和定义标准。

1.2.4 软件测试能保证软件质量吗

虽然软件测试是目前为止发现缺陷的最有效手段,但是软件测试能保证质量吗?软件测试可以在开发过程中发现大部分的软件缺陷,但是,单靠软件测试是不能保证软件质量的,尤其是在软件测试的时间没办法充分保证、测试资源无法有效提供的情况下,测试人员只能尽量在允许的时间范围内发现尽可能多的问题。

除了软件测试,还应该通过软件配置管理、进度控制等项目管理手段来确保软件研发的顺利、有序开展,结合软件需求控制、需求分析、设计评审、代码审查等多种形式来保证软件质量。

1.3 软件开发与软件测试

软件开发是软件测试的基础,而软件测试则是软件开发的质量保证手段,软件开发人员是软件质量的最终创造者,软件测试人员应该成为软件开发人员的最好帮手。

1.3.1 软件开发与软件测试的对立统一

软件开发与软件测试是一个对立面,因为软件开发是一种创造性的活动,而软件测试则是一种破坏性的活动。软件开发人员在努力地实现各种软件功能,而测试人员则在努力地寻找里面的缺陷。

软件的质量不能靠开发人员来保证,因为出于“保护”心理,开发人员不忍心对自己辛苦创造出来的产品进行批判;软件的质量也不能靠测试人员来保证,因为测试人员不能确保发现所有缺陷,并且即使发现了缺陷,最终还是要靠开发人员来修正。

软件的质量应该由开发人员和测试人员来一起保证,软件开发人员应该寻求测试人员的帮助,利用测试人员的“批判性”、“破坏性”思维,以及对缺陷的“敏感度”来帮助自己发现程序的错误,从而修正错误,提高产品质量。

而测试人员则应该把自己的工作当成是一种服务,努力发现关于软件质量的方方面面的信息,把这些信息准确、客观、公正地提供给项目组中的所有人。

1.3.2 测试人员需要的开发技术

对于测试人员而言,编程技能未必是必不可缺的技能,但是如果能掌握基本的编程技巧,则会对测试有很大的帮助。大部分的自动化测试工具,需要测试人员具备一定的编码能力和语言知识。对于黑盒测试、手工测试者而言,具备一定的编程能力也会有好处。至少,在与开发人员沟通一个Bug的时候,能理解开发人员的话,开发人员也会感觉测试人员是明白和理解其代码的人,而不会被认为是生硬的、不可理喻的、专门挑刺的人。

测试人员的编程技巧与开发人员的编程技巧,所需要的范围和方面是不一样的。开发人员要更专业一些,他们需要懂得处理很多专门的软件开发和设计上的问题,需要深入了解很多语言的特性,如组件编程、面向对象、可重用性、可扩展性、设计模式、高效率、性能等等。而测试人员则更偏向于快速地应用编程知识解决测试方面的问题,不需要追求精致的语言应用,不需要追求完美的可重用性,甚至有些时候不追求性能和效率。但是,需要快速地解决实际的问题。