程序流程图和NS图的优点在于:首先,它强制设计人员按结构程序设计方法进行思考和描述其方案,由此得到的程序必定是结构化的;其次,图像直观,容易理解设计意图,为编程、复查、测试、维护带来方便;最后,简单易学。NS图的基本结构如图143所示。
这些控制结构都有一个重要特征,就是只有一个入口和一个出口。用这种单入口和单出口的基本结构单元,容易做到在一种结构中嵌套其他结构,从而实现任何复杂的处理过程和算法,并且使程序的线索既清晰又有条理。这样,各种结构中的处理均可以由任何结构,甚至其他模块来代替,从而可实现程序过程的结构化构造及自顶向下的逐步细化。
然而,总的趋势是越来越多的人不再使用程序流程图方法实现程序过程的结构化构造。
程序流程图法的主要缺点如下。
①程序流程图本质上不是逐步求精的好工具,它诱使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构。
②程序流程图中用箭头代表控制流,因此程序员不受任何约束,可以完全不顾结构程序设计的精神,随意转移控制。
③程序流程图不易表示数据结构。
④程序流程图不易表示层次结构。
由于上述缺点的存在,使得结构化程序设计侧重于逻辑过程设计,与人的思维方式存在不协调。该方法突出了实现功能的操作方法(模块),而被操作的数据(变量)处于实现功能的从属地位,即程序模块和数据结构是松散地耦合在一起的,因此当应用程序比较复杂时,容易出错,难以维护。
2.面向对象程序设计方法
面向对象(ObjectOriented,OO)方法是一种非常实用的软件开发方法,是软件开发的一种主要方法。面向对象方法以客观世界中的对象为中心,其分析和设计思想符合人们的思维方式,分析和设计的结果与客观世界的实际比较接近,容易被人们接受。在面向对象方法中,分析和设计的界线并不明显,它们采用相同的符号表示,能方便地从分析阶段平滑过渡到设计阶段。此外,在现实生活中,用户的需求经常会发生变化,但客观世界的对象及对象间的关系相对比较稳定,因此用面向对象方法分析和设计的结果也相对比较稳定。
1)面向对象的基本概念
面向对象的方法可采用下面的等式来表现。
面向对象=对象(Object)+分类(Classification)+继承(Inheritance)+通过消息的通信(CommunicationWithMessages)
可以说,采用这4个概念开发的软件系统就是面向对象的。
2)面向对象的程序设计概述
面向对象程序设计方法提出了一个全新的概念:类(Class)。类把数据(数据成员)和处理这些数据的函数(成员函数)封装在一起。用类来声明的变量称为对象。在对象中,只有该对象的成员函数可以存取对象的数据成员,这样可以有效地保护和隐藏数据。
在程序设计中必须先定义类,然后建立对象。类是对一组性质相同的对象的程序描述,它由概括该组对象共同性质的数据和函数组成。类是一种用户自定义的数据类型。和其他数,,———。:
类时直接声明;另一种是在声明类之后再在需要声明对象的地方单独声明。对象被声明后就可以使用。通过对象可以使用类中公有类型的数据和函数,其使用方式为对象名·数据成员或对象名·成员函数
继承是面向对象语言提供的一个重要机制,它支持层次分类的观点。继承使得程序员可以在一个较通用类的基础上很快地建立起一个新类,而不必从头设计每个类。在类的继承关系中,被继承的类称为基类,继承的类称为派生类。
程序语言可以建立具有相同成员函数名的对象的等级结构,这些函数在概念上是相似的,但对各自的类来说,其实现不同。因此,对象在接收到同一函数调用时引起的行为不同,这一功能被称为多态性。例如,C++语言支持两种多态性:编译多态性和运行多态性。
编译多态性通过使用重载函数获得,运行多态性通过使用继承和虚函数获得。
目前有许多可视化的程序设计语言均支持面向对象的设计方法,通过对程序提供可视化控件———已封装的类的调用,设置控件的属性,并对其消息事件进行功能代码设计,大大加快了软件的开发过程。
3)面向对象的程序设计优势
①符合人们习惯的思维方法。由于对象对应于现实世界中的实体,因而可以很自然地按照现实世界中处理实体的方法来处理对象,而且软件开发者可以很方便地与问题提出者进行沟通和交流。
②易于软件的维护和功能的增减。对象的封装性及对象之间的松散耦合性,都给软件的修改和维护带来了方便。
③可重用性好。重复使用一个类(类是对象的定义,对象是类的实例化),可以比较方便地构造软件系统,再加上继承的方式,极大地提高了软件开发的效率。
④与可视化技术相结合,改善了工作界面。随着基于图形界面操作系统的流行,面向对象的程序设计方法也将深入人心。它与可视化技术相结合,已经使人机界面进入GUI时代。目前常用的面向对象的程序设计语言有:BorlandC++,VisualC++,Java及VisualBasic,Delphi等。虽然风格各异,但都具有共同的概念和编程模式。
14.3系统测试
系统测试是管理信息系统的开发周期中一个十分重要的活动。尽管在系统开发周期的各个阶段均采取了严格的技术审查,但依然难免遗留差错。如果没有在投入运行前的系统测试阶段被发现并纠正,问题迟早会在运行中暴露出来,到那时要纠正错误将要会付出更大的代价。
系统测试是指在计算机上以各种可能的数据和操作条件对程序进行测试,找出可能存在的问题并加以修改,使之完全符合设计要求。在软件的开发过程中,系统测试占用的时间、花费的人力和成本占软件开发的很大比例。统计表明,调试工作所占的工作量也比较大,大约占整个软件开发工作量的40%~50%。对于一些特别重要的大型系统,测试的工作量和,。
14.3.1测试概述
1.系统测试的目标
系统测试的目的在于发现程序的错误。G.J.Myes在《软件测试技巧》一书中对测试提出了以下规则,不妨可看作软件测试的目标或定义。
①测试是为了发现程序中的错误而执行程序的过程。
②好的测试方案使测试很可能发现尚未发现的错误。
③成功的测试是发现了尚未发现的错误的测试。
总之,测试的目标就是希望以最少的人力和时间发现潜在的各种错误和缺陷。从上述目标可以归纳出测试的定义,即“为了发现错误而执行程序的过程”。通俗地说,测试是根据各阶段的需求、设计等文档或程序的内部结构,精心设计测试用例(即输入数据和预期的输出结果),并利用这些测试用例来运行程序,以便发现错误的过程。信息系统测试应包括软件测试、硬件测试和网络测试。硬件测试、网络测试可以根据具体的性能指标来进行,而信息系统的开发工作主要集中在软件上,所以所说的测试更多的是指软件测试。
2.系统测试的原则
①最好不要由设计、编写某个软件的部门来测试该软件系统。但在发现错误之后,要找出错误的根源并纠正它时,则应由程序的编写者来进行。
②测试用例既要有输入数据,又要有对应的预期结果,比较输出结果与预期的结果,就可断定程序中是否有错误。
③不仅要输入合理的输入数据,还应选用不合理的输入数据作为测试用例,这样才可测试出程序的排错能力。
④除了检查程序是否做了应做的工作,还应检查程序是否做了它不应做的工作。程序做了不应做的工作仍然是一个大错。
⑤应长期保存所有的测试用例,直至该程序被废弃。测试用例对以后的使用有参考价值。当程序改错或改进后,可以比较原来能正确运行的部分现在是否有错。若出错,则说明修改不当。
14.3.2测试分类
在开发大型应用系统的漫长过程中,面对着错综复杂的问题,人的主观认识不可能完全符合客观现实,与工程密切相关的各类人员之间的通信和配合也不可能完美无缺,因此力求在系统开发的每个阶段和完成后都能通过严格的审查,尽可能早地发现并纠正错误。按照系统测试规模和内容的不同,可将测试分成以下几种类型。
(1)系统平台测试
系统平台测试分为硬件平台测试和网络平台测试两部分。信息系统开发人员所要进行的硬件平台测试主要是针对安装了操作系统的计算机的测试,通过特定的软件测试计算机的性能表现。网络测试主要包括电缆测试、传输信道测试和网络测试。电缆测试主要包括电缆的:,、
是否正确、接地是否良好、电缆走向如何等;认证测试是测试已经安装完毕的电缆的电气参数(如衰减等)是否符合有关的标准。传输信道测试主要是测试传输信息的频谱带宽、传输速率、误码率等参数。网络测试包括网络的规程、性能检测、安装调试、维护、故障诊断等。
(2)应用软件测试
应用软件测试是指由测试人员努力设计出一系列测试方案,其目的却是为了“破坏”已经建造好的软件系统———竭力证明程序中有错误而不能按照预定要求正确工作,从而将设计阶段中所有隐患完全暴露出来。暴露问题并不是软件测试的最终目的,发现问题是为了解决问题。测试阶段的根本目标是尽可能多地发现并排除软件中潜藏的错误,最终把一个高质量的软件系统交给用户使用。
(3)系统单元测试和集成测试
单元测试是集中测试软件设计的最小单元———模块。一般认为单元测试和编码属于系统开发的同一阶段,即在编写出源程序代码并通过编译程序的语法检查后就开始接受程度不同的检查测试了。首先改正所有语法错误;然后,用详细设计描述操作指南,对重要的执行通路进行测试,以便发现模块内部的错误;也可以对多个模块同时进行测试。
模块并不是一个独立的程序,往往是多模块联合测试,所以在所有的单元测试之后,还需要进行集成测试。集成测试是通过测试发现和接口有关的问题来构造程序结构的系统化技术。它的目标是把通过了单元测试的模块拿来,构造一个在设计中所描述的程序结构。在这个过程中不仅应该发现设计和编码的错误,还应该验证系统确实能提供需求说明书中指定的功能,而且系统的动态特性也符合预定要求。
14.3.3测试方法和测试过程
1.系统测试的方法
对系统进行测试的主要方法如图144所示。人工测试指的是采用人工方式进行测试,目的是通过对程序静态结构的检查,找出编译时不能发现的错误。经验表明,组织良好的人工测试可以发现程序中30%~70%的编码错误和逻辑设计错误。机器测试是把事先设计好的测试用例作用于被测程序,比较测试结果和预期结果是否一致,如果不一致,则说明被测程序可能存在错误。人工测试有一定的局限性,但机器测试只能发现错误的症状,不能对问题进行定位;人工测试一旦发现错误,就能确定问题的位置、是什么错误等,而且能一次发现多处错误。因此,应根据实际情况来选择测试方法。
144
1)人工测试
人工测试又称为代码复审,即通过阅读程序,查找错误。其内容包括:检查代码和设计是否一致、检查代码逻辑表达是否正确和完整、检查代码结构是否合理等。人工测试主要有3种方法。
(1)个人复查
个人复查指程序员本人对程序进行检查,发现程序中的错误。由于心理上和思维上的惯性,程序员一般不太容易发现自己的错误。此方法主要针对小规模程序,效率不高。
(2)走查
通常由3~5人组成测试小组,测试人员应该是没有参加该项目开发的有经验的程序开发人员。测试人员先阅读相关的软件资料和源程序,然后将一批有代表性的测试数据沿程序的逻辑走一遍,监视程序的执行情况,发现程序中的错误。
(3)会审
测试人员的构成与走查类似,要求测试人员认真审查有关的资料(如系统分析说明书、系统设计说明书、程序设计说明书、源程序等),找出问题,并在会审时逐个审查、提问,由编程人员逐句讲解程序,测试人员讨论可能出现的错误。实践证明,编程人员在讲解、讨论的过程中能发现自己以前没有发现的错误,使问题暴露。例如,在对某个小问题讨论修改方法时,可能会发现涉及模块间接口等问题,从而提高软件质量。会审后要将发现的错误登记、分析、归类,一份交给程序员,另一份妥善保管,以便再次组织会审时使用。
2)机器测试
机器测试是指在计算机上直接用测试用例运行被测程序,发现程序错误。机器测试主要分为黑盒测试和白盒测试两种。
(1)黑盒测试