第二章 软件工程基础第二章 软件工程基础
1.软件定义
软件 (Software)是计算机系统中与硬件相互依存的另一部分,它是包括程序、数据及其相关文档的完整集合。
其中,程序是为实现设计的功能和性能要求而编写的指令序列;数据是使指令能够正常操纵信息的数据结构;文档是与程序开发、维护和使用有关的图文资料。
2.1 软件工程的概念一、软件定义与软件特点第二章 软件工程基础
2.软件特点
(1) 软件是一种逻辑实体,具有抽象性。
(2) 软件的生产与硬件不同,没有明显的制造过程。
(3) 软件产品在使用过程中不会出现磨损、老化问题。
(4) 软件的开发、运行对计算机系统具有依赖性,
受计算机系统的限制,可能导致软件移植的问题。
(5) 软件复杂性高,成本昂贵。
(6) 软件开发涉及诸多的社会因素。
2.1 软件工程的概念一、软件定义与软件特点第二章 软件工程基础
软件危机主要表现在:
① 软件需求的增长得不到满足。
② 软件开发成本和进度无法控制。
③ 软件质量难以保证。
④ 软件不可维护或维护程度非常低。
⑤ 软件的成本不断提高。
⑥ 软件开发生产率的提高赶不上硬件的发展和应用需求的增长
2.1 软件工程的概念二、软件工程与软件危机第二章 软件工程基础
所谓软件工程是应用于计算机软件的定义、开发和维护的一整套方法、工具、文档、实践标准和工序。
软件工程包括 3个要素,即方法、工具和过程。
方法是完成软件工程项目的技术手段;工具支持软件的开发、管理、文档生成;过程支持软件开发的各个环节的控制、管理。
2.1 软件工程的概念二、软件工程与软件危机第二章 软件工程基础
1.软件工程过程 (Software Engineering Process)
IS09000定义:软件工程过程是把输入转化为输出的一组彼此相关的资源和活动。
两方面内涵:
其一,软件工程过程是指为获得软件产品,在软件工具支持下由软件工程师完成的一系列软件工程活动,
包含软件规格说明、软件开发、软件确认、软件演进 4
种基本活动。
其二,从软件开发的观点看,软件工程过程是使用适当的资源 (包括人员、硬软件工具、时间等 ),为开发软件进行的一组开发活动,在过程结束时将输入 (用户要求 )转化为输出 (软件产品 )。
2.1 软件工程的概念三、软件工程过程与软件生命周期第二章 软件工程基础
2.软件生命周期 (Software Life Cycle)
将软件产品从提出、实现、使用维护到停止使用退役的过程称为软件生命周期。即,软件生存周期是指一个软件从提出开发要求开始到该软件退役的整个时期。
一般包括可行性研究与需求分析、设计、实现、
测试、交付使用以及维护等活动,
2.1 软件工程的概念三、软件工程过程与软件生命周期第二章 软件工程基础
1.软件工程的目标在给定成本、进度的前提下,开发出具有有效性、可靠性、可理解性、可维护性、可重用性、可适应性、可移植性、可追踪性和可互操作性且满足用户需求的产品。
2.软件工程的原则在软件开发过程中,必须遵循软件工程的基本原则。这些原则适用于所有的软件项目。这些基本原则包括抽象、信息隐蔽、模块化、局部化、确定性、一致性、完备性和可验证性。
2.1 软件工程的概念四、软件工程的目标与原则第二章 软件工程基础
软件开发工具的完善和发展将促进软件开发方法的进步和完善,促进软件开发的高速度和高质量。
软件开发环境或称软件工程环境是全面支持软件开发全过程的软件工具集合。这些软件工具按照 —定的方法或模式组合起来,支持软件生命周期内的各个阶段和各项任务的完成。
2.1 软件工程的概念五、软件开发工具与软件开发环境第二章 软件工程基础
1.需求分析
任务是发现需求、求精、建模和定义需求的过程。
(1)需求分析的定义
① 用户解决问题或达到目标所需的条件或权能;
② 系统或系统部件要满足合同、标准、规范或其它正式规定文档所需具有的条件或权能;
③ 一种反映①或②所描述的条件或权能的文档说明。
2.2 软件的需求分析方法一、需求分析方法第二章 软件工程基础
( 2)需求分析阶段的工作
需求分析阶段的工作概括为四个方面:
① 需求获取
② 需求分析
③ 编写需求规格说明书
④ 需求评审
2.2 软件的需求分析方法一、需求分析方法第二章 软件工程基础
2.需求分析方法
常见的需求分析方法有
( 1)结构化分析方法主要包括:面向数据流的结构化分析方法、面向数据结构的 Jackson方法、面向数据结构的结构化数据系统开发方法。
( 2)面向对象的分析方法 从需求分析建立的模型的特性来分,需求分析方法又分为静态分析方法和动态分析方法。
2.2 软件的需求分析方法一、需求分析方法第二章 软件工程基础
1.结构化分析方法
结构化分析方法的实质是着眼于数据流,自顶向下,逐层分解,建立系统的处理流程,以数据流图和数据字典为主要工具,建立系统的逻辑模型。
结构化分析的步骤如下:
( 1)通过对用户的调查,以软件的需求为线索,获得当前系统的具体模型;
( 2)去掉具体模型中非本质因素,抽象出当前系统的逻辑模型;
( 3)根据计算机的特点分析当前系统与目标系统的差别,
建立目标系统的逻辑模型;
( 4)完善目标系统并补充细节,写出目标系统的软件需求规格说明:
( 5)评审直到确认完全符合用户对软件的需求。
2.2 软件的需求分析方法二、结构化分析方法第二章 软件工程基础
2.结构化分析的常用工具
( 1)数据流图 (DFD—Data Flow Diagram)
数据流图是描述数据处理过程的工具,是需求理解的逻辑模型的图形表示,它直接支持系统的功能建模。
建立数据流图的步骤如下:
第 1步,由外向里。先画系统的输入输出,然后画系统的内部。
第 2步,自顶向下。顺序完成顶层、中间层、底层数据流图。
第 3步,逐层分解。
2.2 软件的需求分析方法二、结构化分析方法第二章 软件工程基础
( 2)数据字典 (DD—Data Dictionary)
数据字典是对所有与系统相关的数据元素的一个有组织的列表,以及精确的、严格的定义,
使得用户和系统分析员对于输入、输出、存储成分和中间计算结果有共同的理解。
( 3)判定树
( 4)判定表
2.2 软件的需求分析方法二、结构化分析方法第二章 软件工程基础
1.软件需求规格说明书的作用
软件需求规格说明书的作用是:①便于用户、开发人员进行理解和交流。②反映出用户问题的结构,可以作为软件开发工作的基础和依据。③作为确认测试和验收的依据。
2.软件需求规格说明书的内容
( 1)概述
( 2)数据描述
数据流图
数据字典
系统接口说明
内部接口
2.2 软件的需求分析方法三、软件需求规格说明书第二章 软件工程基础
( 3)功能描述
功能
处理说明
设计的限制
( 4)性能描述
性能参数
测试种类
预期的软件响应
应考虑的特殊问题
( 5)参考文献目录
( 6)附录
2.2 软件的需求分析方法三、软件需求规格说明书第二章 软件工程基础
3.软件需求规格说明书的特点
( 1)正确性。体现待开发系统的真实要求。
( 2)无歧义性。对每一个需求只有一种解释。
( 3)完整性。包括全部有意义的需求,功能的、性能的、
设计的、约束的,属性或外部接口等方面的需求。
( 4)可验证性。描述的每一个需求都是可以验证的,即存在有限代价的有效过程验证确认。
( 5)一致性。各个需求的描述不矛盾。
( 6)可理解性。
( 7)可修改性。
( 8)可追踪性。每一个需求的来源、流向是清晰的。
2.2 软件的需求分析方法三、软件需求规格说明书第二章 软件工程基础
1.软件设计的基础软件设计的基本目标是用比较抽象概括的方式确定目标系统如何完成预定的任务,即软件设计是确定系统的物理模型。
软件设计的重要性和地位概括为以下几点:
( 1)软件开发阶段 (设计、编码、测试 )占据软件项目开发总成本绝大部分,是在软件开发中形成质量的关键环节;
( 2)软件设计是开发阶段最重要的步骤,是将需求准确地转化为完整的软件产品或系统的唯一途径;
( 3)软件设计做出的决策,最终影响软件实现的成败;
( 4)设计是软件工程和软件维护的基础。
2.3 软件设计方法一、软件设计的基本概念第二章 软件工程基础
从技术观点来看,软件设计包括软件结构设计、
数据设计、接口设计、过程设计。
从工程管理角度来看,软件设计分两步完成:
概要设计和详细设计。
软件设计的一般过程是:软件设计是一个迭代的过程;先进行高层次的结构设计;后进行低层次的过程设计;穿插进行数据设计和接口设计。
2.3 软件设计方法一、软件设计的基本概念第二章 软件工程基础
2.软件设计的基本原理
(1)抽象
抽象是一种思维工具,就是把事物本质的共同特性提取出来而不考虑其他细节。
(2)模块化
模块化是指解决一个复杂问题时自顶向下逐层把软件系统划分成若干模块的过程。
(3)信息隐蔽
信息隐蔽是指在一个模块内包含的信息 (过程或数据 ),对于不需要这些信息的其他模块来说是不能访问的。
2.3 软件设计方法一、软件设计的基本概念第二章 软件工程基础
(4)模块独立性
每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。
衡量软件的模块独立性使用耦合性和内聚性两个定性的度量标准。
① 内聚性是一个模块内部各个元素间彼此结合的紧密程度的质量。
② 耦合性是模块间互相连接的紧密程度的度量。
2.3 软件设计方法一、软件设计的基本概念第二章 软件工程基础
1.概要设计的任务
(1)设计软件系统结构
在需求分析阶段,已经把系统分解成层次结构,而在概要设计阶段,需要进一步分解,划分为模块以及模块的层次结构。划分的具体过程是:
① 采用某种设计方法,将一个复杂的系统按功能划分成模块。
② 确定每个模块的功能。
③ 确定模块之间的调用关系。
④ 确定模块之间的接口,即模块之间传递的信息。
⑤ 评价模块结构的质量。
2.3 软件设计方法二、概要设计第二章 软件工程基础
(2)数据结构及数据设计
数据设计的具体任务是:确定输入、输出文件的详细数据结构;结合算法设计,确定算法所必需的逻辑数据结构及其操作;确定对逻辑数据结构所必须的那些操作的程序模块,限制和确定各个数据设计决策的影响范围;需要与操作系统或调度程序接口所必需的控制表进行数据交换时,确定其详细的数据结构和使用规则;
数据的保护性设计;防卫性、一致性、冗余性设计。
2.3 软件设计方法二、概要设计第二章 软件工程基础
(3)编写概要设计文档。在概要设计阶段,需要编写的文档有:概要设计说明书、数据库设计说明书、集成测试计划等。
(4)概要设计文档评审。在概要设计中,对设计部分是否完整地实现了需求中规定的功能、性能等要求,设计方案的可行性,关键的处理及内外部接口定义正确性、有效性,各部分之间的一致性等都要进行评审,以免在以后的设计中出现大的问题而返工。
2.3 软件设计方法二、概要设计第二章 软件工程基础
2.面向数据流的设计方法
( 1)数据流类型
典型的数据流类型有两种:变换型和事务型。
① 变换型。变换型是指信息沿输入通路进入系统,
同时由外部形式变换成内部形式,进入系统的信息通过变换中心,经加工处理以后再沿输出通路变换成外部形式离开软件系统。变换型数据处理问题的工作过程大致分为三步,即取得数据、变换数据和输出数据。
2.3 软件设计方法二、概要设计第二章 软件工程基础
② 事务型。在很多软件应用中,存在某种作业数据流,它可以引发一个或多个处理,这些处理能够完成该作业要求的功能,这种数据流就叫做事务。事务型数据流的特点是接受一项事务,根据事务处理的特点和性质,选择分派一个适当的处理单元 (事务处理中心 ),然后给出结果。在一个事务型数据流中,事务中心接收数据,分析每个事务以确定它的类型,根据事务类型选取一条活动通路。
2.3 软件设计方法二、概要设计第二章 软件工程基础
(2)面向数据流设计设计过程
①分析、确认数据流图的类型,区分是事务型还是变换型;
②说明数据流的边界;
③把数据流图映射为程序结构;
④根据设计准则对产生的结构进行细化和求精。
2.3 软件设计方法二、概要设计第二章 软件工程基础
3.设计的准则
① 提高模块独立性。
② 模块规模适中。
③ 深度、宽度、扇出和扇入适当。④ 使模块的作用域在该模块的控制域内。
⑤ 应减少模块的接口和界面的复杂性。
⑥ 设计成单入口、单出口的模块。
⑦ 设计功能可预测的模块。
2.3 软件设计方法二、概要设计第二章 软件工程基础
详细设计的任务,是为软件结构图中的每个模块确定实现算法和局部数据结构,用某种选定的表达工具表示算法和数据结构的细节。
在过程设计阶段,要对每个模块规定的功能以及算法的设计,给出适当的算法描述,即确定模块内部的详细执行过程,包括局部数据组织、
控制流、每一步具体处理要求和各种实现细节等。其目的是确定应该怎样来具体实现所要求的系统。
2.3 软件设计方法三、详细设计第二章 软件工程基础
常见的过程设计工具有:
图形工具:程序流程图,N–S,PAD,
HIPO。
表格工具:判定表。
语言工具,PDL(伪码 )。
2.3 软件设计方法三、详细设计第二章 软件工程基础
软件测试是在软件投入运行前对软件需求分析、
软件设计规格说明和软件编码进行查错和纠错。
目的:
(1) 测试是一个为了寻找错误而运行程序的过程。
(2) 一个好的测试用例是指很可能找到迄今为止尚未发现的错误的用例。
(3) 一个成功的测试是指揭示了迄今为止尚未发现的错误的测试。
2.4 软件测试一、软件测试的目的第二章 软件工程基础
主要基本准则:
( 1)所有测试都应追溯到需求。
( 2)严格执行测试计划,排除测试的随意性。软件测试应当制定明确的测试计划并严格按照计划执行。
( 3)充分注意测试中的群集现象。为了提高测试效率,
测试人员应该集中对付那些错误群集的程序。
( 4)应避免程序员检查自己的程序。测试是为了找错,
而程序员大多对自己所编的程序存有偏见,总认为自己编的程序问题不大可能或无错误存在,因此很难查出错误。
( 5)穷举测试不可能。所谓穷举测试是指把程序所有可能的执行路径都进行检查的测试。这种测试是不可能实现的,因为测试只能证明程序有错误。
( 6)妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护提供方便。
2.4 软件测试二、软件测试的准则第二章 软件工程基础
依据测试过程是否执行被测软件,测试技术分为静态测试技术与动态测试技术两种。若按功能来划分,可分为白盒测试和黑盒测试两种方法。
1.静态测试与动态测试
(1)静态测试
静态测试是指被测试程序不在机器上运行,而是采用人工检测和计算机辅助静态分析的手段对程序进行检测。
2.4 软件测试三、软件测试的方法第二章 软件工程基础
方法如下:
① 人工测试:是指不依靠计算机而靠人工审查程序或评审软件。人工审查程序偏重于编码质量的检验,而软件审查除了审查编码还要对各阶段的软件产品进行检验。
② 计算机辅助静态分析:指利用静态分析工具对被测试程序进行特性分析,从程序中提取一些信息,以便检查程序的各种逻辑缺陷和可疑的程序构造。
③ 静态测试包括代码检查、静态结构分析、代码质量度量等工作。
2.4 软件测试三、软件测试的方法第二章 软件工程基础
(2)动态测试
动态测试指基于计算机的测试,通过运行程序发现错误。一般意义上的测试大多是指动态测试。
测试任何产品,一般有两种方法:一是测试产品的功能,二是测试产品内部结构及处理过程。
对软件产品进行动态测试时,也用这两种方法,
分别称为黑盒测试法和白盒测试法。
2.4 软件测试三、软件测试的方法第二章 软件工程基础
2.黑盒测试法
黑盒测试法是对软件已经实现的功能是否满足需求进行测试和验证。
通过黑盒测试主要发现以下错误:
是否有不正确或遗漏了的功能。
在接口上,能否正确地接受输入数据,能否产生正确的输出信息。
访问外部信息是否有错。
性能上是否满足要求等。
黑盒测试方法主要有等价类划分法、边界值分析法、错误推测法、因果图等。
2.4 软件测试三、软件测试的方法第二章 软件工程基础
(1) 等价类划分法
等价类划分法是一种典型的黑盒测试方法。它是将程序的所有可能的输入数据划分为若干部分(即若干等价类),然后从每个等价类中选取数据作为测试用例。对每一个等价类,各个输入数据对发现程序中的错误的几率都是等效的,因此只需从每个等价类中选取一些有代表性的测试用例进行测试而发现错误。
(2) 边界值分析法
边界值分析法是对各种输入、输出范围的边界情况设计测试用例的方法。
2.4 软件测试三、软件测试的方法第二章 软件工程基础
(3) 错误推测法
错误推测法的基本思想:列出程序中可能发生错误的情况和容易发生错误的特殊情况,根据这些情况选择测试用例。
(4) 因果图
因果图的基本思想是通过画因果图,把用自然语言描述的功能说明转换为判定表,最后为判定表的每一列设计一个测试用例。
2.4 软件测试三、软件测试的方法第二章 软件工程基础
3.白盒测试法
白盒测试是在程序内部进行,主要完成软件内部操作的验证。该方法把测试对象看作一个打开的盒子,测试人员须了解程序的内部结构和处理过程,以检查处理过程的细节为基础,对程序中尽可能多的逻辑路径进行测试,检验内部控制结构和数据结构是否有错,实际的运行状态与预期的状态是否一致。因此,白盒测试又称为结构测试或逻辑驱动测试。
2.4 软件测试三、软件测试的方法第二章 软件工程基础
白盒测试的基本原则:
保证所测模块中每一独立路径至少执行一次;
保证所测模块所有判断的每一个分支至少执行一次;
保证所测模块每一个循环都在边界条件和一般条件下至少执行一次;
验证所有数据结构的有效性。
白盒测试方法主要有逻辑覆盖、基本路经测试等。
2.4 软件测试三、软件测试的方法第二章 软件工程基础
(1) 逻辑覆盖
追求程序内部的逻辑结构覆盖程度,当程序中有循环时,覆盖每条路径是不可能的,要设计使覆盖程度较高的或覆盖最有代表性的路径的测试用例。
常用的覆盖技术有,
① 语句覆盖:
为了提高发现错误的可能性,在测试时应该执行到程序中的每一个语句。语句覆盖是指设计足够的测试用例,使被测程序中每个语句至少执行一次。
② 路径覆盖
路径覆盖是指设计足够的测试用例,覆盖被测程序中所有可能的路径。
2.4 软件测试三、软件测试的方法第二章 软件工程基础
③ 判定覆盖:
判定覆盖指设计足够的测试用例,使得被测程序中每个判定表达式至少获得一次,真,值和,假,值,从而使程序的每一个分支至少都通过一次,因此判定覆盖也称分支覆盖。
④ 条件覆盖:
条件覆盖指设计足够的测试用例,使得判定表达式中每个条件的各种可能的值至少出现一次。
⑤ 判定 /条件覆盖
该覆盖标准指设计足够的测试用例,使得判定表达式中的每个条件的所有可能取值至少出现一次,并使每个判定表达式所有可能的结果也至少出现一次。
2.4 软件测试三、软件测试的方法第二章 软件工程基础
(2)基本路径测试
基本路径测试的基本思想:在程序流程图的基础上,通过分析由控制构造的环路复杂性,导出基本路径集合,从而设计测试用例,保证这些路径至少通过一次。
2.4 软件测试三、软件测试的方法第二章 软件工程基础
软件测试过程一般按四个步骤进行,包括单元测试、集成测试、确认测试和系统测试。通过这些步骤的实施来验证软件是否合格,能否交付用户使用。
2.4 软件测试四、软件测试的实施单元测试单元测试单元测试集成测试 确认测试 系统测试已集成软件设计信息 软件需求确认软件其他系统元素可交付软件模块模块模块
第二章 软件工程基础
程序调试的任务是诊断和改正程序中的错误。
软件测试贯穿于整个软件生命期,而程序调试主要在开发阶段。
程序调试活动由两部分组成,其一是根据错误的迹象确定程序中错误的确切性质、原因和位置。其二是对程序进行修改,排除这个错误。
2.5 程序的调试一、基本概念第二章 软件工程基础
1.程序调试的基本步骤
( 1)错误定位。从错误的外部表现形式入手,研究有关部分的程序,确定程序中出错位置,找出错误的内在原因。确定错误位置占据了软件调试绝大部分的工作量。
( 2)修改设计和代码,以排除错误。排错是软件开发过程中一项艰苦的工作,这也决定了调试工作是一个具有很强技术性和技巧性的工作。
( 3)进行回归测试,防止引进新的错误。因为修改程序可能带来新的错误,重复进行暴露这个错误的原始测试或某些有关测试,以确认该错误是否被排除、是否引进了新的错误。
2.5 程序的调试一、基本概念第二章 软件工程基础
2.程序调试的原则
( 1)确定错误的性质和位置时的注意事项:
① 分析思考与错误征兆有关的信息。
② 避开死胡同。
③ 只把调试工具当作辅助手段来使用。
④ 避免用试探法,最多只能把它当作最后手段。
2.5 程序的调试一、基本概念第二章 软件工程基础
( 2)修改错误的原则
① 在出现错误的地方,很可能还有别的错误。
② 修改错误的一个常见失误是只修改了错误的征兆或这个错误的表现,而没有修改错误本身。
③ 注意修改一个错误的同时可能会引入新的错误。
④ 修改错误的过程将迫使人们暂时回到程序设计阶段。
⑤ 修改源代码程序,不要改变目标代码。
2.5 程序的调试一、基本概念第二章 软件工程基础
软件调试可以分为静态调试和动态调试。
静态调试是指通过人的思维来分析源程序代码和排错,是主要的调试手段。
动态调试是辅助静态调试的。
主要的调试方法有:
1.强行排错法
作为传统的调试方法,其过程可概括为:设置断点、程序暂停、观察程序状态、继续运行程序。特点是:使用较多、效率较低。
2.5 程序的调试二、软件调试方法第二章 软件工程基础
2.回溯法
基本思想:一旦发现了错误,先分析错误征兆,
确定最先发现,症状,的位置。然后,从发现
,症状,的地方开始,沿程序的控制流程,逆向跟踪源程序代码,直到找到错误根源或确定错误产生的范围。
3.原因排除法
原因排除法是通过演绎和归纳,以及二分法来实现的。
2.5 程序的调试二、软件调试方法第二章 软件工程基础
演绎法是一种从一般原理或前提出发,经过排除和精化的过程来推导出结论的思考方法。演绎法排错是测试人员首先根据已有的测试用例,
设想及枚举出所有可能出错的原因作为假设。
然后再用原始测试数据或新的测试,从中逐个排除不可能正确的假设。最后,再用测试数据验证余下的假设确定出错的原因。
归纳法是一种从特殊推断出一般的系统化思考方法。是从一些线索 (错误征兆或与错误发生有关的数据 )着手,通过分析寻找到潜在的原因,
从而找出错误。
2.5 程序的调试二、软件调试方法第二章 软件工程基础
二分法实现的基本思想是,如果已知每个变量在程序中若干个关键点的正确值,则可以使用定值语句 (如赋值语句、输入语句等 )在程序中的某点附近给这些变量赋正确值,然后运行程序并检查程序的输出,如果输出结果是正确的,
则错误原因在程序的前半部分;反之,错误原因在程序的后半部分。对错误原因所在的部分重复使用这种方法,直到将出错范围缩小到容易诊断的程度为止。
2.5 程序的调试二、软件调试方法