第七章GIS软件工程的实施与测试第一节概述第二节程序编制第三节软件测试第四节测试用例的设计第五节软件调试第六节软件试运行第一节概述GIS软件实施指系统设计报告通过审核后,把系统设计转换为可实际运行的物理系统的工作,主要包括系统实施准备、程序编制等主要内容。一实施阶段的准备工作1硬件准备2软件准备3开发人员准备4数据准备二硬软件引进硬软件引进工作的实施步骤为:配置方案制订→购置(或开发)→安装调试→试运行。硬软件引进工作实施中应注意的问题:(1)GIS基础软件对硬件和操作系统都有一定的要求,选购时要考虑这一因素;(2)不提倡自己开发GIS基础软件,最好在选用国内外先进软件的基础上进行二次开发(3)较大的GIS应有中心机房(4)网络规模应与系统规模匹配,设备效果好(5)安装、调试、试运行中的问题应及时解决三软件工程对编程的技术要求1有关编码的基本原则(1)简明清楚(2)避免及少用全局变量,不要使用过多的程序嵌套结构(3)编程时先达到正确性,然后考虑执行速度(4)充分的注释、合适的编程语言(5)不同的编程语言具有共性2编程与软件开发方法编程语言的选择依赖于开发的方法,如果要用快速原型模型来开发,要求能快速实现原型的构建,宜采用第四代编程语言(4GL);如果是面向对象方法,宜用面向对象的语言编程,如C++,Java等。3编码与软件环境良好的编程环境不但能有效提高生产率,同时能减少错误,有效提高软件质量。目前很多可视化的软件开发环境,如VB、VC等。第二节程序编制一程序编制的基本要求好程序的基本要求是:能够正常工作、调试代价低、易于维护、易于修改、设计不复杂、效率高等。GIS软件还具有以下要求1尽量使用GIS基础软件的编程资源GIS开发有两种方式,其一是直接编程,其二是利用GIS基础平台提供的资源库进行开发。2注意系统配置要求GIS涉及大量数据,对硬件要求高,在编程中应采用效率高的连接方式,提高系统效率。3良好的程序设计风格4程序容错性强GIS系统运行过程中可能面临许多不规范甚至非法操作,忽视程序容错性,容易导致系统瘫痪。5采用版本控制管理程序编码版本控制是指将系统转化为若干个具有一定顺序的部分(版本),首先实现系统的轮廓和框架,在此基础上不断添加新的功能,最后达到系统物理模型所要求的全部功能。是一种自顶向下的开发方法,将系统功能划分到多个相对独立版本之中,为系统程序的开发组织、质量控制和测试等减小了难度。二程序语言的特征及选择1编程语言的特征(1)心理特征编程语言的心理特征是指影响程序员心理的语言性能,这类特征是作为程序设计的结果而出现的,表现形式如下1)歧义性如X=X1/X2*X32)简洁性3)局部性和顺序性4)传统性(2)工程特征1)可移植性2)开发工具的可利用性3)软件的可重用性4)可维护性(3)技术特征将软件设计转化为程序代码时,转化的质量往往受语言性能的影响,可能会影响到设计方法。编程语言的技术特征对软件的测试与维护也有一定的影响,支持结构化构造的语言有利于减少程序的复杂性,使程序易测试、易维护。2编程语言的选择选择编程语言可以从以下几个方面考虑(1)科学工程计算,需要大量的标准库函数,可选择Fortran、C语言等;(2)数据处理与数据库应用,可选用的语言有Cobol、SQL、4GL等;(3)实时处理,要求有较高的性能,可选用的语言有汇编语言、Ada等;(4)系统软件,可选用汇编语言、C等;(5)人工智能,如要完成知识库系统、专家系统、决策支持系统等任务,可选用的语言有Lisp、Prolog等。三程序设计风格程序设计风格是指一个人编制程序时所表现出来的特点、习惯以及逻辑思路等。与编程风格有关的因素有以下几个方面1源程序文档化(1)标识符按意取名如row_of_screen(2)程序应加注释序言性注释,包括说明每个模块的用途、功能、接口以及数据描述和开发历史等;功能性注释,嵌入在源程序内部,用来说明程序段或语句的功能以及数据的状态。2数据说明基本原则(1)说明顺序应规范,使数据的属性易于查找,如按照常量说明、类型说明、局部变量说明等。(2)一个语句说明多个变量时,各变量名按字典序排列。(3)复杂的数据结构要加注释说明实现时的特点。3语句构造基本原则为简单直接,避免复杂的判定条件,避免多重的循环嵌套,不要一行写多个语句。4输入和输出编写输入和输出程序时的原则(1)输入操作步骤和输入格式尽量简单(2)应检查输入数据的合法性、有效性,报告必要的输入状态信息及错误信息(3)输入一批数据时使用数据或文件结束标志(4)交互式输入时,提供可用的选择和边界值(5)在程序设计语言有严格的格式要求时,应保持输入格式的一致性(6)输出数据表格化、图形化5效率效率是指处理机时间和存储空间的使用,对效率的要求:(1)效率是一个性能要求,目标在需求分析阶段给出;(2)追求效率但不损害程序的可读性和可靠性;(3)根本途径在于选择良好的设计方法和良好的数据结构与算法,而不是对程序语句进行调整。第三节软件测试软件测试是指用人工或自动的方法执行和评价各个模块的过程。其目的在于验证模块是否满足规定的要求。软件测试在软件生存期中横跨两个阶段:单元测试:通常在编写出每一个模块之后对其所做的测试,编码与单元测试属于软件生存期中的同一个阶段;独立测试:在结束编码和单元测试后对软件系统进行的综合测试,是软件生存期的一个独立阶段,即测试阶段。一软件测试的要求1软件测试的目的从用户角度出发,希望通过软件测试暴露软件中的错误和缺陷,以考虑是否可以接受该产品;从软件开发者角度出发,希望测试成为表明软件产品中不存在错误的过程,验证软件已正确实现了用户的要求。软件测试阶段的基本任务是根据软件开发各阶段的文档资料和程序的内部结构,利用一些测试用例,找出软件中潜在的错误和缺陷。2软件测试的原则(1)尽早和不断进行软件测试(2)测试用例应包括数据输入与输出两个部分(3)程序员应避免检查自己的程序(4)设计用例应包括合理的和不合理的输入条件(5)充分注意测试中的群集现象(6)严格执行测试计划,排除测试的随意性(7)应当对每一个测试结果做全面检查(8)妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护提供方便二软件测试的过程1软件测试过程中的信息测试结果分析可靠性分析排错软件配置测试配置测试工具预期结果测试结果出错率数据错误改正的软件预测的可靠性测试信息流测试过程需要三类输入(1)软件配置:包括软件需求规格说明书、软件设计规格说明、源代码等(2)测试配置:包括测试计划、测试用例、测试驱动程序等(3)测试工具:如测试数据自动生成程序、静态分析程序、动态分析程序、测试结果分析程序等测试之后,要对所有测试结果进行分析,即将实测的结果与预期的结果进行比较。如果发现数据出错,需要排错,同时修改相关文档,再次测试,直到通过测试。2软件测试的步骤及与各阶段的关系单元测试单元测试单元测试集成测试确认测试系统测试模块模块模块设计信息软件需求其他系统元素已集成软件确认软件可交付软件软件测试的步骤需求分析编码详细设计总体设计单元测试集成测试确认测试修改修改修改修改通过通过通过软件设计与软件开发过程的关系三单元测试1测试的内容单元测试主要针对模块的5个基本特征进行。(1)模块接口主要检查数据能否正确地通过模块。检查的主要内容是参数的个数、属性及对应关系是否一致。(2)局部数据结构主要检查:说明不正确或不一致,初始化或缺省值错误,变量名错误,数据类型错误等。此外,还应注意全局数据与模块的相互影响。(3)重要的执行路径重要模块要进行基本路径测试,仔细选择测试路径是单元测试的一项基本任务。(4)错误处理主要测试程序对错误处理的能力,检查是否存在以下问题:不能正确处理外部输入或内部处理错误,对发生的错误不能正确描述或描述内容难以理解等。(5)边界条件程序最容易在边界上出错,如选择条件和循环条件的边界,复杂数据结构的边界等应进行测试。2测试方法由于被测试的模块往往不是独立的程序,它处于整个软件结构的某一层上,被其他模块调用或调用其他模块,其本身不能单独运行,因此在单元测试时,需要为被测试模块设计驱动模块和桩模块。驱动模块的作用是用来模拟被测模块的上级调用模块,功能比真正的上级模块简单,它只完成接受测试数据,以上级模块调用被测模块的格式驱动被测模块,接受被测试模块的测试结果并输出。桩模块用来代替被测试模块所调用的模块,其作用是返回被测试模块所需的信息。驱动模块和桩模块带来额外的开销,但是与被测试模块有联系的那些模块尚未编写好或未测试情况下,设计驱动模块和桩模块是必要的。MADBCE测试用例驱动模块测试结果B桩模块1桩模块2(模拟M)软件结构图模块B的测试环境四集成测试1集成测试的目的集成测试是指在单元测试的基础上,将所有模块按照设计要求组装成一个完整的系统而进行的测试,也称为组装测试或联合测试。集成测试的原因:(1)单元测试使用的驱动模块和桩模块,与他们所代替的模块并不完全等效;(2)各个模块组装起来,穿越模块接口的数据可能会丢失;(3)一个模块的功能可能会对另一个模块的功能产生不利影响;(4)各个模块的功能组合起来可能达不到预期要求的功能;(5)单个模块可以接受的误差,组装起来可能累积和放大到不能接受的程度;(6)全局数据可能出现问题。必需进行集成测试,用于发现模块组装中可能出现的问题,最终构成符合要求的软件系统。集成测试的重点在于检查模块之间接口的有关问题,发现公共数据与全局变量引起的模块间干扰相互作用。2集成测试的方法主要有非渐增式和渐增式测试两种方法。(1)非渐增式测试该测试是首先对每个模块分别进行单元测试,然后再把所有的模块按设计要求组装在一起进行。(2)渐进式测试该测试是逐个把未经测试的模块组装到已经测试过的模块上去,进行集成测试。每加入一个新模块就进行一次集成测试,重复此过程直到程序组装完成。二者的区别◇非渐增式方法把单元测试和集成测试分成两个不同的阶段,而渐增式测试把单元测试与集成测试合在一起,同时完成。◇非渐增式需要更大的工作量,因为每个模块都需要驱动模块合桩模块,而渐增式利用已测试过的模块作为驱动模块或桩模块。◇渐增式可以较早发现接口之间的错误,非渐增式最后组装时才发现。◇渐增式有利于排错,因为发生错误的往往与最近加入的模块有关,而非渐增式发现接口错误要推迟到最后,很难判断是那一部分接口出错。◇渐增式比较彻底,已测试的模块和新的模块组装在一起再测试。◇渐增式占用的时间较多,但非渐增式需要更多的驱动模块和模块,也占用一定时间。◇非渐增式开始可并行测试所有模块,能充分利用人力,对测试大型软件很有意义。一般情况下采用渐增式测试较好,也可以采用两种方法结合起来。3渐增式测试的组装模块的方法(1)自顶向下结合该方法不需要编写驱动模块,只需要编写桩模块。其步骤是从顶层模块开始,沿被测试程序的软件结构图的控制路径逐步向下测试,从而把各个模块都结合起来,有两种组合策略。深度优先策略:先从软件结构中选择一条主控路径,把该路径上的模块一个一个结合起来进行测试,以便完成一个特定的子功能,接着再结合其他需要优先考虑的路径进行。主控路径一般选择系统的关键路径或输入、输出路径。MADBCEMSSSMASSSSMADSSSMADSSE上图是一个自顶向下以深度优先策略组装模块的例子,其中S模块表示桩模块。宽度优先策略:逐层结合直接下属的所有模块,例如对于上图中的例子,结合顺序为M、A、B、C、D、E。MADBSEMADBCE自顶向下测试的优点能较早发现高层模块接口、控制等方面的问题,初期的概貌可以较早看到程序的主功能,增强开发信心。缺点桩模块不可能提供完整的信息,因此许多测试推迟到用实际模块代替桩木块之后;设计较多的桩模块,测试开销大;早期不能并行工作,不能充分利用人力。(2)自底向上结合仅需编写驱动模块,不需编写桩模块,步骤为(i)把低层模块组合成实现一个个特定子功能的族(如下图所示);(ii)为每一个族编写一个驱动模块,以协调测试用例的输入和测试结果的输出(如下图所示,其中d1模块为驱动模块);MABCd1d2