第二章 测试过程管理理论
2.1软件开发和软件測试的基本概念
2.1.1软件生命周期
软件生命周期是一种项目管理的行为指导框架,用它来描述软件项目狀模糊概念开始到软件项目终结的这个周期内,在各个阶段所需要开展的各项活动。软件工程采用的软件生命周期方法学,就是从时间角度对软件项目开发和维护的复杂问题进行分解,把软件生成的周期,次划分为若干个子阶段,每个子阶段有相对独立的子任务,然后逐步完成每个子阶段的子任务。
虽然目前有众多的软件开发方法和模型,但从项目管理的角度来说,软件项目主要包括如下的几个阶段:
项目规划阶段
需求分析阶段
系统设计阶段
代码设计阶段
代码实现阶段
系统测试阶段
后期维护阶段
前六个阶段为软件项目的开发阶段,完成这六个阶段的软件项目才能够投放市场得以部署。而后期维护阶段的活动,多是对原由软件产品进行软件缺陷修复和新增特性的小规模开发。本文的研究对象是软件项目管理的各个开发子阶段中,开展的各项软件测试活动。
2.1.2软件侧试的内涵和外延
1973年,软件测试领域的先驱Bill Hetzel博士首先给软件测试一个这样的定义:测试就是建立一种信心,而确认程序能够按照预先的设想而运行。(Establishconfidence that a program does what it is supposed to do.)后来,他又将定义修订为:测试是能够评估一段程序或系统的特性或能力的各种行为活动,并能够通过测试确定程序或系统是否能达到预期的结果。(Any activities aimed at evaluatingan attribute or capability of a program or system and determining that it meets itsrequired results.)这个定义至今仍被引用,软件测试业界把这种方法看作是的软件测试的第一类方法。
第一类测试方法是以需求和设计为本,因此便于定义测试工作的范畴,更有利于部署测试的侧重点和针对性。这一点对于大型软件的测试工作,尤其是在有限的时间和资源情况下显得尤为重要。但如果从人的心理学的角度论证,将“验证软件是工作的”当作测试的目的,则非常不利于测试人员发现软件的缺陷。1979年,Glenford J. Myers提出了他对软件测试的定义:测试是执行一段代码或者系统来发现错误。(The process of executing a program or system withthe intent of finding errors.)这个定义,也常被业界所认可和引用。这被看作是软件测试的第二类方法。
第二类测试方法与需求和设计并没有必然的关联,更强调的是测试人员的主观能动性,用逆向思维的方式,不断思考开发人员的理解误区、不良习惯、程序代码边界、无效数据输入以及系统的各种弱点,试图破坏和摧毁系统,目标就是发现系统中的各种问题。这种方法经常能够发现系统中更多的缺陷。但若测试者以发现缺陷为唯一目标,而很少关注系统对需求的实现,则测试行为往桂会有一定的随意性和盲目性。
1983年,IEEE在软件工程术语中定义的软件测试为:使用人工或自动的手段来运行或测定某个软件系统的过程,其目的在于检验它是否能够满足规定的需求或者弄清楚预期结果与实际结果之间的差别。
笔者更愿意引用Burnstein博士提出的测试成熟度模型(TMM,TestingMaturity Model)中的Phase3来描述软件测试过程:测试的目的并不是要证明什么,而是为了把软件不能正常工作的风险降低到可以接受的程度。
2.1.3通信设备企业软件测试的一般流程
尽管各通信设备企业采用的测试流程不尽相同,但从软件的测试过程和测试阶段来看,软件测试活动可大致分为:单元测试、系统集成测试、系统验证测试和验收测试。而更广义的测试活动,还包括对软件幵发过程中产生的系统需求文档,软件设计文档和源代码的评审活动,也可以叫做文档测试活动。这类活动不仅有助于消除潜在的软件缺陷,而且能够在早期发现而将其负面影响降到最低。
单元测试(UT,Unit Testing)又称模块测试,是对软件基本单元进行的测试。
单元测试的目的就是用来验证某段代码或者某个模块的行为是否与软件开发人员期望的一致,是一种正向的验证软件设计的测试,是典型的第一类软件测试方法。而且与后面的测试过程相比,单元测试的创建的测试环境简单,代码缺陷定位代价小,回归测试也容易,所以测试成本大约是集成测试的二分之一,系统测试的三分之一。单元测试一般由开发人员承担,采用白盒测试的测试方法,可按实际情况进行自测或者互测。
系统集成测试(SIT,System Integration Testing)是介于单元测试和系统验证测试之间的过渡阶段,开发人员将经过单元测试的代码编译成一个系统软件版本,系统集成测试时将其加载在通信设备的硬件上,以验证集成组装后的软件版本中各个模块及其接口是否存在问题,以及集成后的配合硬件工作的整体功能表现。
系统集成测试多由独立于开发的测试人员负责,采用黑盒测试的方法。系统集成测试时,一般按照硬件板卡和软件系统功能划分测试范围,组织测试团队和成员分别开展各自的测试活动。通信产品的系统集成测试更强调软硬件之间的集成,而纯软件产品则仅关注软件模块之间的集成。
系统验证测试(SVT,System Verification Testing)的测试项目,则是更接近于在真实的网络环境中,通信设备用户的日常操作实践和软件的自动控制行为。它是将已经集成好的软件系统,作为整个通信设备系统的一个元素,与通信设备硬件、某些支持软件、数据和使用者等其他系统元素结合在一起,在更复杂的测试环境下,对整个通信设备系统及相关的网络拓扑进行一系列综合性的黑盒测试活动,以确定其能够满足用户对整个系统的各方面的需求。除一般性的功能验证测试外,还包括:性能测试,容量测试,压力测试,容错测试等。鉴于系统验证测试需要的测试系统比较巨大,只能由几个或甚至更多的测试人员共享,而在同一系统上同时开展的多项测试会进一步增加系统出现故障的概率。