第10章实现与测试 本章导读 信息系统开发经过需求分析和设计之后,需要编程实现和测试。代码实现是按照系统详 细设计的要求,在选定的开发平台下,使用指定的开发工具和开发语言,遵循特定的程序设 计方法,所进行的代码编写工作。测试是为了保证系统质量所从事的发现模型和程序错误的 工作。有静态测试和动态测试两种主要测试方法。测试工作包括模型测试、单元测试、集成 测试、系统测试和验收测试等工作。经过测试的信息系统就可以移交给用户使用 主要知识点 系统实现 ■测试 过渡与评价
10.1编程与实现 前面两章详细介绍了信息系统体系结构设计和详细设计,其中详细设计包括业务对象模 型设计、功能逻辑设计、数据库设计和界面设计等工作。信息系统体系结构设计和详绀设计 是系统实现的基础,设计模型以及设计文档是软件代码实现的主要参考文档。 系统实现包括代码实现、单元测试、系统集成等工作,单元测试放在测试节介绍,本 节主要介绍代码实现和系统集成两项工作。 10.1.1代码实现 代码实现是按照系统详缃设计的要求,在选定的开发平台下,使用指定的开发工具和开 发语言,遵循特定的程序设计方法,所进行的代码编写工作。代码实现将依据前面的设计方 案,并对设计文档中确定的每一个函数、方法、过程,以及类、包、界面进行编程实现。 1.代码实现的策略 在详细设计阶段,对系统的业务对象,对象的属性、方法和操作,数据库表结构,界面 的布局等细节都作了详细设计。在编程之初,对设计的类、构件、子系统需要确定开发策略, 有以下几种开发策略: 自顶向下开发策略; 自底向上开发策略 ●基于业务对象的用例实现开发策略 1)自顶向下开发策略 在结构化方法的程序设计中就开始釆用自顶向下策略。按照这种策略来编写程序,从顶 层模玦编起,然后逐步向下层模块延伸,直到最后编写最底层模块的程序。面向对象程序设 计也可以禾取自顶向下的开发策略。按照这种策略,应该先从主界面开始编写界面层程序, 然后编写业务层程序和数据层程序。自顶向下开发策略的优点是无需为测试程序专门构造测 试环境和测试驱动程序,由于程序是从主畀面开始编写起,后面编写的程序在前面已经编写 好的程序基础上运行。这种方法的缺点是在编程初期,不能组织多个程序员同时编写多个程 序模块,因为主界面和下层界面的程序还没有编写好时,其他程序没有办法测试。但这只是 编程初期岀现的现象,在主界面和几个下层界面程序调试之后,多个功能块的编程工作就可 以同时展开 2)自底向上开发策略 自底向上的开发策略与自顶向下的策略正好相反,先从数据层开始编程,逐步向业务层 和畀面层过渡。这种策略的优点是多个程序员在开发初期就可以同时投入编程工作,能够提 高编程效率。但其缺点是需要编写大量驱动程序来测试所编写的底层模坎,给开发和测试带 来很重的负担。 3)基于业务对象的用例实现开发策略
基于业务对象的用例实现开发策略是在CS和BS模式下,采用面向对象方法开发的一 种经典的编程策略。这种策略的基本开发步骤是,第一,根据业务对象模型建立数据库。把 设计模型中业务对象模型定义的所有业务对象转变成为数据库中的数据表,并在选择的数据 库管理系统中建立起这些物理数据表。第二,编写并测试业务对象程序。编写业务对象模型 中的业务对象程序,每一个业务对象都应该作为独立的类进行编写。对所编写的业务对象程 序认真进行测试,保证没有错误。第三,编写并测试用例实现程序。在设计阶段的功能逻辑 设计中,对需求模型中的每一个用例进行了详细设计。功能逻辑设计确定了为了完成一个用 例的功能,应该参与的界面类、控制类和实体类,并用类图描述了这些类相互之间的关系 用顺序图描述了为实现该用例的功能,这些类中的对象相互之间是如何协调完成用例功能的 因为整个系统的实体类程序在第二步已经编写完成了,在此只需要利用集成开发环境构建该 用例涉及的界面,编写并测试控制类程序。第四,集成测试。集成本用例涉及的实体类、控 制类和界面类程序,并进行集成测试。后面将介绍基于这种策略所进行的系统实现工作。 图10.1软件开发时间安排 3
图10.2软件开发安排的甘特图 2.代码实现的组织与计划 程序开发阶段为了保证工期,提高开发效率,需要投入大量程序员同时开展开发工作。 这样就需要对参与的程序员进行有效组织。可以把程序员组成开发小组,由开发小组承担编 程工作。小组组成有平等协作制、组长负责制和技能互补制三种形式。在平等协作制的小组 中,各成员具有大体相同的技术和经验,具有相似的专业背景,他们在组内是平等的,区别 仅仅是承担了不同的编程工作。组长负责制的小组中由小组长负责全组的管理协调和技术 作,组长具有全组工作的决策权和控制权。技能互补制的小组中各个成员的技术水平和知识 背景具有互补作用,每一个成员都有其他成员所不具有的技术专长,相互工作是互相补充, 相得益彰。 不管采用何种人员组织方式,作为开发的管理人员,需要对项目开发的进度,有一个详 细的安排计划,并要求开发人员在没有特殊变动的情况下严格按照计划执行,只有这样,才 能够保证开发工作按时完成。图10.1和图10.2是一个利用 Microsoft Office Project2003编制 的工作计划示例。在实际开发时,代码开发计划应该制定地更为细致,一个类、一个界面, 甚至一个方法和函数的实现都应该纳入工作计划之中 代码实现 代码实现是把详细设计方案转变成为实际软件产品的过程,主要完成数据库实现,业务 功能实现和界面实现。在确定了实现策略,制定了详细的开发计划之后,就可以开始系统的 代码实现工作。下面按照基于业务对象的用例实现开发策略所规定的开发步骤,介绍代码实 现的基本工作
1)根据业务对象模型建立数据库 数据库在信息系统中处于重要位置,合理、可行的数据库设计方案对信息系统具有至关 重要的作用。一般软件系统的数据库设计方法已经十分成熟,需要绎过概念设计、逻辑设计 和物埋设计等步骤,最后在选定的数据库管理系统上建立符合设计的物理数据库。UML出 现之后,随着基于面向对象方法建模工具的成熟,数据库设计工作已经被大大简化。通过建 模工具可以自动生成与业务对象模型对应的数据库 图917是书务系统的业务对象模型,利用 Rational rose2003建模工具可以根据该模型 生成书务系统的数据库,图10.3是转变后得到的数据模型图,这个数据模型图是业务对象模 型和数据库之间的种中间形态,它描述了根据业务对象模型要转换得到的数据库,各个数 据表的结构以及各表之间的关联关系。例如,“T图书”,T出版社和“T图书类别”分别 是业务对象模型中”图书”,“出版社”和“图书类别”三个类要建立的三个数据表。“T图书” 和T出版社之间存在一对多的关联关系,因此,在“T图书”中增加了“出版社编号”作 为外键与T出版社进行关联。 图103书务系统的业务对象模型转化成的数据模型图 由数据模型可以生成物理数据库。图10.4是利用 Rational rose2003在图10.3的数据模 型基础上,生成的物理数据库的数据表清单,以及“T图书”,“T图书类别”,“T出版社” 三个数据表的结构
图104书务系统数据表清单 图10.5“T图书”的数据表结构 图106“T图书类别”的数据表结构 6
图107“T出版社”的数据表结构 由业务对象模型转换为数据库的具体方法可以参考 Rational rose的相关资料。如果利用 其他的工具,需要使用相应的方法生成数据库。信息系统的大量业务操作都要访问数据库, 数据库结构不应轻易变动。数据库结构中的属性名、类型、长度、关联和约束的任何一个发 生变动,都会影响到多个业务功能。所以在数据库变动之前,应该对数据库的变动进行认真 评估。尤其在已经开始编写代码之后,改变数据库结构应慎之又慎。 2)实体类的实现 实体类是组成系统的基本要素。在详细设计阶段,对实体类的属性、操作和关系都做了 详细的设计,确定了属性的全部内容,包括属性名、可视性、范围、类型、初始值等:并明 确了操作的算法、流程和处理的数据。 在使用面向对象语言的开发过程中,实体类的实现,也就是编写类的程序。 Rational rose 2003支持java、C艹+、VB等语言的双向工程,可以将设计完整的实体类直接通过正向工程 转变成为设定语言的代码框架。图10.8中的代码是将图917中的“图书”类生成的ja部 分代码框架。 //Source file: D:\Java\\book java public class book private String bouk\ private String ISB\ private String name private String author private Date publ ishdate private Integer printOrder private Double price public book Type thebook'Type public publ ishing Company thepubl i shingCopany
public book O) s Access method for the book \o property. return the current value of the book No * Sets the value of the book\o property. param aBook No the new va lue of the book \o proper blic void setBouk \o (java. l ang String abook \o book\o= aBook \o /s* Access method for the I SB\ property. ereturn the current value of the ISBN property java. lang String get I SHVO i return ISBV: I Sets the value of the ISB\ property. param al SBV the new value of the ISEN property public void setISH\(java. lang String al SB) Access method for the name property. ereturn the current value of the name propert I ang. S Sets the value of the name property. param aName the new value of the name propert public void set\ae(java. lang String ava iname= a\ame x Access ethod for the author property. Return the current value of the author property tblic java. l ang String getAuthor O I return authur 图10.8图书类的java代码框架
从图10.8的代码框架可以看出,Rose会自动把实体类的属性完全转变成了对应的代码, 并为每一个操作生成了代码框架,程序员只需要根据设计文档,编写实现各操作的程序代码 利用建模工具可以大大减少程序员手工编程的工作量。实体类的编程工作其实仅羢是编写实 体类中各个操作的程序代码。在设计模型和设计文档中,已经明确定义了每一个实体类操作 的输入输出,以及它要完成的功能和程序逻辑,程序员根据设计文档,在代码框架的基础上, 完成实体类操作的程序编写 由建模工具生成了所有实体类和控制类的代码框架,能够保证代码框架与设计模型的 致性和完整性,同时也可以保证在没有编写代码之前就可以根据需求文档、设计文档和代码 框架编写代码的测试用例,提前展开测试工作。 3)控制类的实现 控制类是对一个用例功能进行有效管理的中心控制单元,一个系统的业务逻辑全部由控 制类中的操作来实现。控制类一般没有属性,仅有操作。在详细设计阶段,进行了详绀的功 能逻辑设计,每—个功能逻辑的实现均需要控制类进行集中管理。在建立的功能逻辑模型中, 详细设计了控制类的操作。借用 Rational rose可以生成控制类的代码框架,并在生成的代码 框架中自动引入了相关联的包和类。图109是在售书管理中,生成的控制类“售书管理器” 的java程序代码框架。 //Source file: D: \Java\\sellBookMgr, java /*定义销售图书管理器类: sellbookMgr*/ public class sel lBookMgr /*定义构造函数*/ public sellBookMgrO /*获取图书信息*/ public Void getBook Info(book book return nu /*获取销售数量*/ public Integer getbookNum(int number) return nu /*产生待售图书* public boolean createWaitingSellbookO I return true:
//Source file: D: \\Java\\sel lBookMgr, java /*会员处理* public Void memberDealO i return null /a @roseuid 4544BC7AO1IC public double discount O return /*售出图书* public boolean sellbook( i return true public Void printSellNotes O I return null 图10.9售书管理器的java代码框架 4)界面类的实现 畀面是人机交互的主要途径。其主要功能是接收用户输入,激发界面事件请求,并向用 户展现处理结果。目前界面主要有CS模式的 Windows窗体形式,以及BS模式的Web网 页两种形式。在详细设计阶段,已经对界面结构、布局风格、对话,以及各种类型的界面进 行了详细设计。借用集成开发环境,已经不需要程序员手工编写界面类程序,而是采用集成 开发环境提供的界面生成工具,可以很方便地生成系统所需要的界面类。 界面类不承担任何业务处理工作,系统中所有的业务处理和事务处理完全由控制类或实 体类完成。界面类仅承担接收用户输入的数据,并对接收的数据进行合法性检査,把有效数 据提交给系统中的控制类或实体类来处理。界面类也需要接收用户的操作请求,启动相应的 功能操作,并将操作处理的结果向通过界面展现给用户。信息系统通过界面向用户展现系统 的功能和效用,因此美观、友好,并容易使用的界面对系统至关重要。 5)组件与分包 分包是把多个类以及程序要素归放在一个程序组织单元中的工作。在NET中,可以将 在功能上相关的几个Cass归放在一个命名空间( namespace)中,在java环境中,将不同的 Cas放在相应的包( package)中,命名空间和包就是程序的组织单元。分包得到的程序组 10