1.1 理解软件开发过程与软件测试的关系
任务一:理解软件开发过程
【任务引入】
任何一款软件产品的开发都是一项复杂度不同的任务,程序员一般不可能在承接软件产品的开发任务后就开始编写程序。那么,究竟应该先开始哪些工作呢?经历哪些阶段才能很好地完成一款软件产品的开发任务呢?下面先来看看几个案例。
案例一:达远公司是一家老企业,以前由于业务不景气,在企业管理过程中只有财务部门使用了计算机软件进行账务管理。近几年,达远的经营状况得到了改善,主要增加了许多海外业务。为使企业运行更加规范、高效,并能大力提升企业的市场竞争力,公司管理层决定将企业所有内部业务和对外业务实现计算机网络管理。通过正常招标程序,鸿信软件公司承接了达远公司的企业管理系统开发任务。如果你是鸿信软件公司的项目负责人,该如何开展达远企业管理软件的开发工作呢?
案例二:强实陶瓷有限公司是专门生产与销售陶瓷产品的公司,现由于公司业务发展需要,公司管理层决定建立自己专门的网站,以发布公司的产品信息,并用于进行市场调查、网络销售等业务。公司已经由专人准备了产品信息发布的相关资料,其他功能还在酝酿之中。公司希望10天内把产品宣传部分在网站上发布出去,然后逐步在网站上增加其他功能。如果你所在的软件公司承接了该项业务,你认为该如何组织这个网站的开发工作呢?
案例三:乐飞游戏公司是专门制作手机游戏的软件公司,最近公司的游戏策划人员有了一个很好的新游戏创意,经公司管理层组织相关人员讨论,决定投入部分资金启动该游戏的开发工作,并要求在一年内结束开发工作。公司管理层指定你为项目负责人,你该如何组织这个游戏软件的开发工作呢?
【任务目标】
◆ 了解一般软件产品的开发过程是怎样的。
◆ 为上述案例分别选定合适的开发过程,并根据选定的软件开发过程拟订开发计划。
【任务分析】
我们首先来分析将要完成的软件产品开发任务所面临的各种情况,再根据分析的结果采用合适的、有效的软件开发过程。
案例一分析:达远企业管理软件的范围涉及达远公司所有内部业务和对外业务,相关应用部门包括达远所有业务部门。内部包括财务、人力、采购、生产、仓储、销售、客户服务等,外部包括所有供货商、经销代理商、销售客户等。因此,达远企业管理软件开发规模较大,需要由较多的技术人员组成的开发团队来完成该项开发任务,且开发周期将较长。另外,类似于达远企业管理软件的软件产品在开发过程中一般都面临着下述主要问题。
(1)产品涉及范围广,且各主要模块之间相互依赖(如财务部门的数据与采购、仓储、销售等部门有关,采购部门的数据与生产、销售等部门的数据有关,等等),需要进行认真的总体设计(这里指的是为解决模块之间的相互依赖关系而进行整体设计)。
(2)部分业务功能明确(如财务部门已经有较长时间的使用计算机软件的经验),另一部分业务功能需要在软件产品设计中进行协商与调整(如整个企业内部的工作流程、生产流程将需要依据企业的习惯、同行业的规范等进行调整),新的软件功能将影响企业将来的运行,需要在设计过程中慎重考虑。
(3)由于整个软件产品规模较大,很难在短时间之内完全、准确地获取用户对所有功能模块的具体开发要求,因此需要在开发过程中不断与用户进行沟通,以获取用户对软件开发的新意见。
案例二分析:强实陶瓷有限公司网站的首要功能是用于企业信息发布,开发规模相对较小,但时间要求较紧。由于其他功能没有明确的说明,因此可以先完成网站信息发布功能,在网站交付运行之后再增加其他功能。在后续功能的开发过程中,需要不断与用户进行沟通,以获取用户对新增功能的意见。
案例三分析:乐飞游戏公司的新游戏产品开发主要面临着下述问题。
(1)新游戏的功能没有非常明确的定义,需要在开发过程中不断增加新的创意、改进原有设计。
(2)新游戏是否能有好的应用效果需要市场检验,因此,新游戏的开发及其投资具有一定的风险。
【相关模板】
表1-1 软件产品开发进度计划
【知识点睛】
一、软件开发过程综述
一般软件产品的开发过程都要经历下述几个阶段,如图1-1所示。
图1-1 软件开发过程
(1)产品定义与需求分析:这一阶段的工作重点是确定软件产品的总体目标,明确软件产品的开发范围(即解决软件开发“做什么”的问题)。在这个阶段,开发人员需要以会议、访谈、实地考察等多种形式与用户反复沟通,以获取用户对产品设计的功能、环境、界面、硬件等要求。在了解、分析并明确了用户的需求后,写出“软件产品需求规格说明书”,并与用户一起共同确认所有需求。
(2)概要设计:又称系统设计、体系结构设计。这个阶段的设计解决“软件产品总体上应该如何做”的问题,主要包括软件产品的业务流程设计、软件的组成结构、模块划分、功能分配、接口设计、运行设计、数据结构设计和出错处理设计等。设计的结果编写成“软件产品概要设计说明书”。
(3)详细设计:详细设计解决“软件产品具体如何做”的问题。详细设计阶段采用图形化语言(一般使用UML)或文本描述实现具体模块所涉及到的主要算法、数据结构、类的层次结构及调用关系,说明软件产品各个层次中每一个程序(每个模块或子程序)的设计考虑,以便进行编码和测试。详细设计应当保证软件产品完全实现了用户的需求。详细设计应当尽量详细,以便开发人员能够根据详细设计报告进行编码。详细设计的结果编写成“软件产品详细设计报告”。
(4)编码:在软件产品编码阶段,开发人员根据“软件产品详细设计报告”中对数据结构、算法分析和模块实现等方面的设计要求,开始具体的程序编写工作,分别实现各模块的功能,从而实现整个软件产品的功能、性能、接口、界面等方面的要求。
(5)测试:这个阶段测试软件产品在功能和性能上是否符合“软件产品需求规格说明书”的要求。
(6)交付和部署:这个阶段将完成的软件产品交付给用户,并为用户安装软件产品,培训用户使用软件产品。
二、软件开发过程模型
在实际工作中,由于需求难以一次性界定,设计也总是存在遗漏,使软件产品的开发过程很难完全按照上述步骤进行。在软件产品开发过程中,往往需要在设计阶段继续进行需求调研,在编码阶段继续进行设计修改。由此,许多软件工程专家总结出了一些适合于不同软件产品开发的过程模型,可供我们在开发不同的软件产品时参考选用。
1.快速原型模型
所谓快速原型是快速建立起来的、可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成的功能的一个子集。如图1-2所示,快速原型模型的第一步是快速建立一个能反映用户主要需求的原型系统,让用户在计算机上试用它,通过实践来了解目标系统的概貌。通常,用户试用原型系统之后会提出许多修改意见,开发人员按照用户的意见快速地修改原型系统,然后再次请用户试用……一旦用户认为这个原型系统确实能做他们所需要的工作,开发人员便可据此形成最终的软件产品。
图1-2 快速原型模型
快速原型模型适用于具有下述特点的软件产品开发:
● 规模较小、功能较简单;
● 软件产品安装、培训、操作简单;
● 用户沟通方便;
● 产品开发周期较紧;
● 初始需求不是很明确,需要经常与用户进行沟通以确定需求。
2.瀑布模型
瀑布模型也称为传统的软件开发过程模型,最初由Royce于1970年提出。
如图1-3所示,首先开发人员通过与用户沟通进行需求调研与分析,并与用户一起确认需求。
图1-3 瀑布模型
然后编写需求规格说明书,用于说明软件产品将要“做什么”,这一阶段也要由双方共同确认才能完成。
之后进行软件产品设计,编写产品设计说明书,用于说明软件产品“怎么做”,在开发人员都确认设计结果后,才能按设计说明书开始进行编码。
编码完成后,对产品进行必要的测试,测试无误后,方可交付用户使用。
上述各阶段都必须有完善的设计文档,用于指导下一阶段的工作。
以上主要是对瀑布模型中自上而下的箭头进行了介绍,这也是瀑布模型得名的由来,因为它们像瀑布一样自上而下流动。但实际情况下,可能在下一阶段的工作中才发现上一阶段或更早期阶段的工作出现了疏忽或错误,这时不得不回到前面的阶段进行改正。因此,瀑布模型提供了向上“反馈”的功能,即图1-3中逐级向上的箭头。
瀑布模型要求严格按阶段划分进行工作,每一阶段都必须提供相应的文档,每一阶段的结果都必须经过质量保证人员及其他相关人员检查确认。
瀑布模型适用于具有下述特点的软件产品开发:
● 需求能在初期进行明确界定;
● 软件产品最终完成后才与用户见面;
● 开发人员在每个阶段的工作中都有较丰富的经验,每个阶段不会出现较多错误。
3.增量模型
增量模型也称为渐增模型,如图1-4所示。使用增量模型开发软件时,把软件产品作为一系列的增量构件来设计、编码、集成和测试。每个构件由多个相互作用的模块构成,并且能够完成特定的功能。使用增量模型时,第一轮往往产生一个基本产品,提供最核心的功能,还有一些其他需求(可能已经清楚,也可能并不清楚)并不在基本产品中反映。这时可以提交这一基本产品给用户使用和评价,然后基于用户的评价结果和提出的修改意见,将新的需求补充进去,再着手下一轮的计划和开发。这一过程不断重复,直到完成最终产品为止。
图1-4 增量模型
增量模型和快速原型模型的区别是:增量模型每一轮都得到一个用户可真正使用和操作的完整版本,而快速原型模型每一轮得到的可能是在性能和功能上大大简化的版本。
增量模型适用于具有下述特点的软件产品开发:
● 软件产品规模较大,开发人员不是十分充裕,或者因规模过大而导致一次投入过多人员造成管理困难;
● 产品总体设计思路明确,但开发周期不能满足尽快抢占市场等需要;
● 产品部分模块需求难以及时定义;
● 用户难以一次性投入所有资金进行产品开发,需要进行分阶段投入。
4.螺旋模型
软件开发几乎总要冒一定风险,例如,产品交付给用户之后用户可能不满意,到了预定的交付日期,软件可能还未开发出来,实际的开发成本可能超过预算,产品完成前一些关键的开发人员可能“跳槽”了,产品投入市场之前竞争对手发布了一个功能相近、价格更低的软件等。软件风险是任何软件开发项目中都普遍存在的实际问题,项目越大,软件越复杂,承担该项目所冒的风险也越大。软件风险可能在不同程度上损害软件开发过程和软件产品质量。因此,在软件开发过程中,必须及时识别和分析风险,并且采取适当措施以消除或减少风险带来的危害。
螺旋模型的基本思想是,使用快速原型及其他方法来尽量降低风险。理解这种模型的一个简便方法,是把它看成在每个阶段之前都增加了风险分析过程的快速原型模型,如图1-5所示。图中纵向直线的长度代表当前累计的开发费用,螺旋线的角度值代表开发进度。螺旋线每个周期对应于一个开发阶段。每个阶段开始时(左上象限)的任务是,确定该阶段的目标、为完成这些目标选择方案及设定这些方案的约束条件。接下来的任务是,从风险角度分析上一步的工作结果,努力排除各种潜在的风险,通常用建造快速原型的方法来排除风险。如果风险不能排除,则停止开发工作或大幅度地削减项目规模。如果成功地排除了所有风险,则启动下一个开发步骤(右下象限),在这个步骤的工作过程相当于纯粹的瀑布模型。最后是评价该阶段的工作成果并计划下一个阶段的工作。
图1-5 螺旋模型
螺旋模型适用于具有下述特点的软件产品开发:
● 软件产品需求难以一次性确定,产品规模较大;
● 产品开发存在技术、市场占有等风险;
● 产品采用分阶段的投资,需要在每个阶段进行风险评估后再进行下一步的投资;
【思考与讨论】
(1)常用的软件过程模型有哪些?分别适合于具有什么特点的软件产品开发?
(2)除本节所介绍的几种软件开发过程模型以外,你也许还听说过“极限编程”、“RUP”。请查阅相关资料,并简述“极限编程”、“RUP”的基本思想。
【实训题】
实训1-1:以小组形式讨论本节3个案例,为3个案例选定合适的软件开发过程模型,并参照本节【相关模板】中的软件开发计划模板,按选定的软件开发过程模型为其中一个案例编写开发计划。
任务二:从软件开发过程看软件测试的工作过程
【任务引入】
从任务一中的软件开发过程来看,似乎只有在程序编写完成后才需要进行软件测试工作。那么,当软件产品在其他工作阶段时,软件测试人员就没事可干吗?如果程序编写完成后进行软件测试时,才发现软件的设计有很多的问题,其中有用户需求不明确的问题、详细设计没有完全实现用户需求的问题、程序编写(包括界面制作等)错误的问题等,这些问题也许最终将导致需要重新推翻整个软件产品,这必然是任何企业和技术人员都不愿看到的结果。那么,如何才能保证软件开发过程中的每个环节都尽量保证工作质量呢?
【任务目标】
◆ 理解全程软件测试的思想。
◆ 了解在软件开发各阶段软件测试的工作流程。
【任务分析】
软件产品的质量问题往往涉及很多方面,比如,需求调研过程中用户对需求描述不清楚、遗漏某些功能的需求,详细设计过程中需求发生了变化,但设计人员没有及时对设计进行修改,由于文档表述不清楚造成编码人员对设计产生错误的理解,等等。总之,软件产品在最终进行整体测试时所发现的问题,可能是软件开发过程的任何环节造成的。
软件产品的高质量仅靠设计人员和开发人员的细心、认真、敬业是远远不够的。
在软件开发过程的各个环节加强质量控制,保证各阶段任务能规范、准确地完成,才能保证整个软件开发过程是高质、高效的,这就需要软件测试人员尽早介入软件开发过程中,在软件开发过程的各个阶段发挥作用。
【知识点睛】
一、全程软件测试的思想
软件测试与软件开发是相辅相成、相互依赖的关系。
在保证软件产品质量方面,软件测试人员与软件开发人员是一个整体。
软件产品质量保证是一项复杂的工程,软件测试人员在软件开发的各个环节(从需求分析、概要设计到交付验收)都应该参与其中,并与开发人员一道开展工作。测试过程与开发过程同时开始、同时结束,两者保持同步。测试工作的重点和开发工作的重点可能不太一样:开发工作的重点是通过阶段性的工作完成软件产品的开发,而测试工作的重点就是发现各阶段开发工作过程中存在的问题。
有时,测试工作和开发工作是完全融合在一起的,甚至是由“一个人”完成的,比如,单元测试的部分工作就是这样。
二、软件测试的工作流程
图1-6所示的是软件测试理论中的W测试模型(本书根据实际工作情况进行了改进)。根据该模型图,我们可以了解软件开发全过程中测试工作的内容。
图1-6 软件测试过程与软件开发过程的同步关系
图1-6中加粗的实箭头线表示软件开发的过程,加粗的虚箭头线表示测试工作过程。
从图1-6可知,在产品定义、需求分析阶段,测试人员参与工作,理解软件产品的用户需求,从而可以确定软件产品的验收测试目标,为编写验收测试计划和测试用例做准备。在需求规格说明书编写完成后,测试人员要参与对需求进行评审,以确认需求规格说明书的规范性、准确性等。
在概要设计阶段,测试人员可了解软件产品的总体结构、运行平台要求及硬件环境配置要求,根据软件产品的总体设计编写系统测试计划和测试用例,准备进行测试环境配置,并参与对概要设计说明书进行评审。
在详细设计阶段,测试人员可以了解系统具体是如何实现的,同时设计功能测试、性能测试等测试用例,此时可开发部分自动测试脚本,并参与对详细设计说明书进行评审。
在编码阶段,测试人员与开发人员一起搭建单元测试环境,进行代码审查和单元测试,以尽早发现产品开发中的问题。
随着部分模块编码的完成,测试人员的任务就是进行集成测试。
在系统部署阶段,测试人员的任务就是进行系统测试。
在交付与验收阶段,测试人员负责进行验收测试的多项工作。
同时,测试人员需要及时将测试结果进行汇总统计,并与开发人员进行沟通,以便及时修正发现的问题。
上述软件测试工作流程中提到了很多软件测试的专业概念,这些概念及具体工作内容都将在本书后续部分进行介绍。本书后续内容就是基于该工作流程的顺序进行编排的。
【思考与讨论】
(1)只是在软件产品开发完成后才进行软件测试有什么弊端?
(2)简述全程软件测试的思想。
(3)结合软件开发过程,简述软件测试的工作流程。
【实训题】
实训1-2:结合本节介绍的软件测试工作过程,以小组形式讨论并补充完善实训1-1中所编写的开发计划。
实训1-3:本节内容中简单介绍了软件测试理论中的W测试模型,查阅资料,写一篇“测试模型分析”的报告,要求对3种以上的测试模型进行说明,并对这几种测试模型进行比较。