软件工程期末复习
第一章 概述
软件危机定义:⚠️
是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。实际上,几乎所有软件都不同程度地存在这些问题。
产生软件危机的原因 :
1.与软件本身的特点有关
软件是逻辑部件。
软件不会被“用坏”,如果发现了错误,很可能是开发时期引入。
软件规模庞大,而且程序复杂性将随着程序规模的增加而呈指数上升。
2.与软件开发与维护的方法不正确有关
忽视软件需求分析的重要性。对用户要求没有完整准确的认识就匆忙着手编写程序。越早开始写程序,完成它所需要用的时间往往越长。
认为软件开发就是写程序并设法使之运行。程序只是完整的软件产品的一个组成部分。一个软件产品必须由一个完整的配置组成,软件配置主要包括程序、文档和数据等成分。
轻视软件维护。维护是极端艰巨复杂的工作,需要花费很大代价。软件维护的费用占软件总费用的55%~70%。
软件工程的定义:
软件工程是指导计算机软件开发和维护的一门工程学科。采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。
Fritz Bauer:软件工程是为了经济地获得可靠的和能在实际机器上高效运行的软件而建立和使用的好的工程原则。
1968年在第一届NATO会议上曾经给出了软件工程的一个早期定义:“软件工程就是为了经济地获得可靠的且能在实际机器上有效地运行的软件,而建立和使用完善的工程原理。”
IEEE**(1993年):软件工程是:①把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程,也就是把工程应用于软件;②研究①中提到的途径。**
计算机科学技术百科全书:软件工程是应用计算机科学、数学及管理科学等原理,以工程化的原则和方法制作软件的工程。
软件工程方法学3要素:
方法,工具,过程
软件工程方法学:
1.传统方法学(生命周期方法学或结构化范型)——强调自顶向下
n采用结构化技术来完成软件;
n划分为若干个阶段,然后顺序地完成每个阶段的任务;每个阶段的任务相对独立,而且比较简单,降低了整个软件开发工程的困难程度;
n前一个阶段是后一个阶段的前提和基础,而后一阶段提出的解法更具体,细节更多;
n每个阶段结束前必须从技术和管理两方面对这个阶段的开发成果进行严格的检查,通过之后这个阶段才算结束;保证质量,提高可维护性;
缺点:
当软件规模庞大,或者对软件的需求是模糊的或会随时间变化而变化的时候,使用传统方法学开发软件往往不成功
使用传统方法学开发出的软件,维护起来仍然很困难。
数据与操作相分离
2. 面向对象方法学——强调主动地多次反复迭代
面向对象方法:把数据和行为看成同等重要,它是一种
以数据为主线,把数据和对数据的操作紧密地结合起来
的方法
面向对象方法学4个要点:
对象(object):融合了数据及在数据上的操作行为。
类(class):类是对具有相同数据和相同操作的一组相似对象的定义。
继承:按照父类与子类的关系,把若干个相关类组成一个层次结构的系统。
消息:对象彼此间仅能通过发送消息互相联系
面向对象方法学的优点:
面向对象方法学的尽量模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程。
面向对象方法学开发软件的过程,是一个主动地多次反复迭代的演化过程,保证了在各项开发活动之间的平滑过渡。
促进了软件重用。最终的软件产品由许多较小的、基本上独立的对象组成,每个对象相当于一个微型程序,而且大多数对象都与现实世界中的实体相对应,降低了复杂性,提高了可理解性,简化了开发和维护工作。
软件生命周期 :(简答题)⚠️
考点:为什么要划分阶段的去做软件工程的项目?每个时期对应哪个阶段?
在软件维护阶段花的时间最久
三个时期八个阶段:
软件生命周期由软件定义、软件开发和运行维护(也称为软件维护)三个时期组成,每个时期又进一步划分成若干个阶段。
软件过程:(必考传统模型,螺旋,喷泉)⚠️
传统的瀑布模型瀑布模型
实际的瀑布模型
瀑布模型的特点:(重点)
- 阶段间具有顺序性和依赖性
前一阶段的工作完成之后,才能开始后一阶段的工作;
前一阶段的输出文档就是后一阶段的输入文档。
- 推迟实现的观点
n对于规模较大的软件项目来说,往往编码开始得越早最终完成开发工作所需要的时间反而越长。
- 质量保证的观点
每个阶段都必须完成规定的文档,是“文档驱动”的模型;
每个阶段结束前都要对所完成的文档进行评审,尽早发现问题,改正错误。
瀑布模型的优点:
可强迫开发人员采用规范的方法;
严格地规定了每个阶段必须提交的文档;
要求每个阶段交出的所有产品都必须经过质量保证小组的仔细验证。
瀑布模型的缺点:
只能通过文档了解产品,不经过实践的需求是不切实际的。
瀑布模型适用于:
需求是预知的;
软件实现方法是成熟的;
项目周期较短。
快速原型:
是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成的功能的一个子集。
增量(渐增)模型:
把软件产品作为一系列的增量构件来设计、编码、集成和测试。每个构件由多个相互作用的模块构成,并且能够完成特定的功能
螺旋模型 (重点):
螺旋模型的基本思想:使用原型及其他方法来尽量降低风险。把它看作在每个阶段之前都增加了风险分析过程的快速原型模型。
快速+瀑布相结合
简化的螺旋模型
完整的螺旋模型
制定计划、风险分析、实施工程、客户评估四种活动的循环
螺旋模型的优点:
n主要优势在于它是风险驱动的。
n对可选方案和约束条件的强调有利于已有软件的重用,也有助于把软件质量作为软件开发的一个重要目标;
n减少了过多测试或测试不足所带来的风险;
n维护只是模型的另一个周期,维护和开发之间没有本质区别。
螺旋模型的缺点:
n采用螺旋模型需要具有相当丰富的风险评估经验和专门知识,在风险较大的项目开发中,如果未能够及时标识风险,势必造成重大损失。
n过多的迭代次数会增加开发成本,延迟提交时间。
螺旋模型适用于:
n特别适用于庞大、复杂并具有高风险的系统。
n适用于内部开发的大规模软件项目。
喷泉模型:
是典型的面向对象生命周期模型。
喷泉这词体现了面向对象软件开发过程迭代我无缝的特性。
\优点:**该模型的各个阶段没有明显的界限,开发人员可以同步进行开发。其优点是可以提高软件项目开发效率,节省开发时间,适应于面向对象的软件开发过程。
\缺点:**由于喷泉模型在各个开发阶段是重叠的,因此在开发过程中需要大量的开发人员,因此**不利于项目的管理**。此外这种模型要求严格管理文档,使得**审核的难度加大**,尤其是面对可能随时加入各种信息、需求与资料的情况。
第二章 可行性研究
可行性研究的目的和任务:⚠️
\可行性研究目的**是通过运用科学的方法对拟议中的工程项目进行全面的、综合的技术经济分析,来回答:本项目在技术上是否可行,经济上是否有生命力,财务上是否有利可图,需要多少投资,资金来源能否保证,建设周期多长,需要多少物力、人力资源等,进而判断该项目值不值得去做。
\基本任务**,是对新建或改建项目的主要问题,从技术经济角度进行全面的分析研究,并对其投产后的经济效果进行预测,在既定的范围内进行方案论证的选择,以便最合理地利用资源,达到预定的社会效益和经济效益。
可行性研究的定义:⚠️
目的:弄清用户需要计算机解决的问题根本所在,以及项目所需的资源和经费。
任务:在向用户调查的基础上,编写《关于系统规模和目标的报告书 》
可行性研究的内容:
•首先进一步分析和澄清问题定义,导出系统的逻辑模型;
•然后从系统逻辑模型出发,探索若干种可供选择的主要解法(即系统实现方案);
•对每种解法都研究它的可行性,至少应该从三方面研究每种解法的可行性 。
技术可行性 经济可行性 操作可行性 运行可行性 法律可行性
可行性研究过程:
- 复查系统规模和目标
•对问题定义阶段书写的关于规模和目标的报告书进一步复查确认。
- 研究目前正在使用的系统
•新的目标系统必须也能完成旧系统的基本功能;
•新系统必须能解决旧系统中存在的问题。
- 导出新系统的高层逻辑模型
•现有的物理系统(系统流程图)→现有系统的逻辑模型(数据流图+数据字典)→目标系统的逻辑模型→新的物理系统
- 进一步定义问题
•分析员应该和用户一起再次复查问题定义、工程规模和目标。
- 导出和评价供选择的解法
•首先从技术角度出发排除不可行方案;
•其次考虑操作可行性,去掉用户不能接受的方案;
•接下来考虑经济可行性,估计余下的每个可能的系统的开发成本和运行费用,进行成本/效益分析;
•最后为每个在各方面都可行的系统制定实现进度表。
- 推荐行动方针
•根据可行性研究结果应该做出的一个关键性决定,是否继续进行这项开发工程。
•若继续开发,选择一种最好的解法,说明选择这个解决方案的理由。
•进行比较仔细的成本/效益分析。
- 草拟开发计划
•分析员应该为所推荐的方案草拟一份开发计划,制定工程进度表、估计对各类开发人员和各种资源的需要情况、估计系统生命周期每个阶段的成本、给出下一个阶段(需求分析)的详细进度表和成本估计。
系统流程图:
•是概括地描绘物理系统的传统工具。
•用图形符号以黑盒子形式描绘组成系统的每个部件(程序,文档,数据库,人工过程等)。
•表达的是数据在系统各部件之间流动的情况,而不是对数据进行加工处理的控制过程。
数据流图 (DFD) :(必考)⚠️
考点:符号代表什么意思
•是一种图形化技术,它描绘信息流和数据从输入移动到输出的过程中所经受的变换。
•在数据流图中没有任何具体的物理部件,它只是描绘数据在软件中流动和被处理的逻辑过程。
•描绘“做什么”,不考虑“怎么做”。
•今后进行软件设计的很好的出发点。
•描绘出所有可能的数据流向,而并非描绘出某个数据流的条件;忽略出错出处,内务处理(打开/关闭文件)。
为了避免可能引起的误解,如果代表同一个事物的同样符号在图中出现在n个地方,则在这个符号的一个角上画(n-1)条短斜线做标记
数据流图(Data Flow Diagram):简称DFD,它从数据传递和加工角度,以图形方式来表达系统的逻辑功能、数据在系统内部的逻辑流向和逻辑变换过程,是结构化系统分析方法的主要表达工具及用于表示软件模型的一种图示方法。
基本符号:⚠️
•数据源点/终点:通常是人或部门,可重复表示;
•处理:一个处理框可以代表一系列程序、单个程序或程序的一个模块; 穿孔机穿孔或目视检查数据正确性等人工处理过程;
•数据存储:可以表示一个文件、文件的一部分、数据库的元素或记录的一部分等,可以存储在任何介质上;数据存储是处于静止状态的数据;
•数据流:描绘所有可能的数据流向,而不应该描绘出现某个数据流的条件 ,数据流是处于运动中的数据。数据流与程序流程图(参看本书第5章)中用箭头表示的控制流有本质不同,千万不要混淆。
DFD 画法:
(一)确定系统的输入输出
由于系统究竟包括哪些功能可能一时难于弄清楚,可使范围尽量大一些,把可能有的内容全部都包括进去。此时,应该向用户了解“系统从外界接受什么数据”、“系统向外界送出什么数据”等信息,然后,根据用户的答复画出数据流图的外围。
(二)由外向里画系统的顶层数据流图
首先,将系统的输入数据和输出数据用一连串的加工连接起来。在数据流的值发生变化的地方就是一个加工。接着,给各个加工命名。然后,给加工之间的数据命名。最后,给文件命名。
(三)自顶向下逐层分解,绘出分层数据流图
对于大型的系统,为了控制复杂性,便于理解,需要采用自顶向下逐层分解的方法进行,即用分层的方法将一个数据流图分解成几个数据流图来分别表示 [1] 。
例2:高考录取统分子系统
功能如下:
(1) 计算标准分——根据考生原始分计算标准分,存入考生分数文件;
(2) 计算录取线分——根据标准分和招生计划文件中的招生人数,计算录取线分,存入录取线文件。
提取数据流图的四种成分
数据源点和终点:考生
处理:(1) 计算标准分(2) 计算录取线分
数据存储:(1) 考生分数文件
(2) 招生计划文件 (3) 录取线文件
数据流:原始分;标准分;
招生人数;录取线分
画基本数据流图
画功能级数据流图
成本/效益分析:⚠️
考点:记住公式,这一年的钱,算未来一年钱的公式
通常用利率的形式表示货币的时间价值。
假设年利率为 i ,如果现在存入 P 元,则 n 年后可以得到的钱数为
F = P ( 1 + i ) n
反之,如果 n 年后能收入 F 元钱,那么这些钱的现在价值是
P = F / ( 1 + i ) n
2. 投资回收期
所谓投资回收期就是使累计的经济效益等于最初投资所需要的时间。
通常用投资回收期衡量一项开发工程的价值。
例:投资回收期 = 2 + 774.88 / 1779.44 = 2.44年
第三章 需求分析
需求分析的结构化分析方法(SA),必需遵守的准则:
必需理解并描述问题的信息域,根据这条准则应该建立数据模型。(E-R图)
必须定义软件应完成的功能,这条准则要求建立功能模型。(DFD图)
必须描述作为外部事件结果的软件行为,这条准则要求建立行为模型。(状态转换图)
必须对描述信息、功能和行为的模型进行分解,用层次的方式展示细节。
需求分析过程应该建立3种模型,分别是:
数据模型 功能模型 行为模型
数据字典:是分析模型的核心,它描述软件使用或产生的所有数据对象。
实体-联系图:描绘数据对象及数据对象之间的关系,是用于建立数据模型的图形。
数据流图:描绘当数据在软件系统中移动时被变换的逻辑过程,指明系统具有的变换数据的功能,因此,数据流图是建立功能模型的基础。
状态转换图(简称为状态图):指明了作为外部事件结果的系统行为。为此,状态转换图描绘了系统的各种行为模式(称为“状态”)和在不同状态间转换的方式。状态转换图是行为建模的基础。
ER图:⚠️
考点:知道ER图包括哪3个成分
ER图中包含:
实体(即数据对象),用矩形框表示;
关系,用连接相关实体的菱形框表示;
属性,用椭圆形或圆角矩形表示,并用直线把实体(或关系)与其属性连接起来。
例1:某校教学管理系统的ER图
第五章 总体设计
描绘软件结构的图形工具:⚠️
层次图
HIPO图
结构图
结构化分析和结构化设计的关系:
模块独立程度的两个定性标准度量:⚠️
耦合衡量不同模块彼此间互相依赖(连接)的紧密程度。耦合要低,即每个模块和其他模块之间的关系要简单;
内聚衡量一个模块内部各个元素彼此结合的紧密程度。内聚要高,每个模块完成一个相对独立的特定子功能。
1. 耦合⚠️
耦合:是对一个软件结构内不同模块之间互连程度的度量。
要求:在软件设计中应该追求尽可能松散耦合的系统。
可以研究、测试或维护任何一个模块,而不需要对系统的其他模块有很多了解;
模块间联系简单,发生在一处的错误传播到整个系统的可能性就很小;
模块间的耦合程度强烈影响系统的可理解性、可测试性、可靠性和可维护性。
耦合程度的度量:
(1) 非直接耦合/完全独立(no direct coupling)
如果两个模块中的每一个都能独立地工作而不需要另一个模块的存在,那么它们完全独立。
在一个软件系统中不可能所有模块之间都没有任何连接。
(2) 数据耦合(data coupling)
如果两个模块彼此间通过参数交换信息,而且交换的信息仅仅是数据,那么这种耦合称为数据耦合
评价:
系统中至少必须存在这种耦合。一般说来,一个系统内可以只包含数据耦合。
数据耦合是理想的目标。
维护更容易,对一个模块的修改不会是另一个模块产生退化错误。
(3) 控制耦合(control coupling)
如果两个模块彼此间传递的信息中有控制信息,这种耦合称为控制耦合。
评价:
控制耦合往往是多余的,把模块适当分解之后通常可以用数据耦合代替它。
被调用的模块需知道调用模块的内部结构和逻辑,降低了重用的可能性 。
(4) 特征耦合(stamp coupling)
当把整个数据结构作为参数传递而被调用的模块只需要使用其中一部分数据元素时,就出现了特征耦合。
评价:
被调用的模块可使用的数据多于它确实需要的数据,这将导致对数据的访问失去控制,从而给计算机犯罪提供了机会。
无论何时把指针作为参数进行传递,都应该仔细检查该耦合。
(5) 公共环境耦合(common coupling)
当两个或多个模块通过一个公共数据环境相互作用时,它们之间的耦合称为公共环境耦合。公共环境可以是全程变量、共享的通信区、内存的公共覆盖区、任何存储介质上的文件、物理设备等等。
公共环境耦合的类型:
一个模块往公共环境送数据,另一个模块从公共环境取数据。数据耦合的一种形式,是比较松散的耦合。
两个模块都既往公共环境送数据又从里面取数据,这种耦合比较紧密,介于数据耦合和控制耦合之间。
(6) 内容耦合(content coupling)
最高程度的耦合是内容耦合。如果出现下列情况之一,两个模块间就发生了内容耦合:
一个模块访问另一个模块的内部数据;
一个模块不通过正常入口转到另一个模块的内部;
两个模块有一部分程序代码重叠;
一个模块有多个入口。
耦合是影响软件复杂程度的一个重要因素。
应该采取下述设计原则:
尽量使用数据耦合,少用控制耦合和特征耦合,
限制公共环境耦合的范围,完全不用内容耦合。
2. 内聚⚠️
内聚:标志一个模块内各个元素彼此结合的紧密程度,它是信息隐藏和局部化概念的自然扩展。简单地说,理想内聚的模块只做一件事情。
要求:设计时应该力求做到高内聚,通常中等程度的内聚也是可以采用的,而且效果和高内聚相差不多;但是,低内聚不要使用。
内聚和耦合是密切相关的,模块内的高内聚往往意味着模块间的松耦合。实践表明内聚更重要,应该把更多注意力集中到提高模块的内聚程度上。
内聚程度的度量:
(1) 偶然内聚(coincidental cohesion)
如果一个模块完成一组任务,这些任务彼此间即使有关系,关系也是很松散的,就叫做偶然内聚。
评价:
模块内各元素之间没有实质性联系,很可能在一种应用场合需要修改这个模块,在另一种应用场合又不允许这种修改,从而陷入困境;
可理解性差,可维护性产生退化;
模块是不可重用的。
解决方案:
将模块分成更小的模块,每个小模块执行一个操作。
(2) 逻辑内聚(logical cohesion)
如果一个模块完成的任务在逻辑上属于相同或相似的一类,则称为逻辑内聚。
评价:
接口难以理解,造成整体上不易理解;
完成多个操作的代码互相纠缠在一起,即使局部功能的修改有时也会影响全局,导致严重的维护问题;
难以重用。
解决方案:
模块分解。
(3) 时间内聚(temporal cohesion)
如果一个模块包含的任务必须在同一段时间内执行,就叫时间内聚。
评价:
时间关系在一定程度上反映了程序某些实质,所以时间内聚比逻辑内聚好一些。
模块内操作之间的关系很弱,与其他模块的操作却有很强的关联。
时间内聚的模块不太可能重用。
(4) 过程内聚(procedural cohesion)
如果一个模块内的处理元素是相关的,而且必须以特定次序执行,则称为过程内聚。
使用程序流程图作为工具设计软件时,常常通过研究流程图确定模块的划分,这样得到的往往是过程内聚的模块。
评价:
比时间内聚好,至少操作之间是过程关联的
仍是弱连接,不太可能重用模块。
解决方案:
分割为单独的模块,每个模块执行一个操作。
(5) 通信内聚(communicational cohesion)
如果模块中所有元素都使用同一个输入数据和(或)产生同一个输出数据,则称为通信内聚。即在同一个数据结构上操作。
评价:
模块中各操作紧密相连,比过程内聚更好。
不能重用。
解决方案:
分成多个模块,每个模块执行一个操作。
(6) 顺序内聚(sequential cohesion)
如果一个模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行,则称为顺序内聚。
评价:
根据数据流图划分模块时,通常得到顺序内聚的模块,这种模块彼此间的连接往往比较简单。
(7) 功能内聚(functional cohesion)
如果模块内所有处理元素属于一个整体,完成一个单一的功能,则称为功能内聚。功能内聚是最高程度的内聚。
评价:
模块可重用,应尽可能重用;
可隔离错误,维护更容易;
扩充产品功能时更容易。
七种内聚的优劣评分结果:
高内聚:功能内聚 10分
顺序内聚 9分
中内聚:通信内聚 7分
过程内聚 5分
低内聚:时间内聚 3分
逻辑内聚 1分
偶然内聚 0分
设计时力争做到高内聚,并且能够辨认出低内聚的模块。
散入散出:
事务流变换流:(有时间就看)
总结:
一般说来,如果数据流不具有显著的事务特点,最好使用变换分析;反之,如果具有明显的事务中心,则应该采用事务分析技术。
机械地遵循变换分析或事务分析的映射规则,可能会得到一些不必要的控制模块,如果它们确实用处不大,那么可以而且应该把它们合并。
如果一个控制模块功能过分复杂,则应该分解为两个或多个控制模块,或者增加中间层次的控制模块。
第六章 详细设计
程序控制结构结构:
经典的结构程序设计:只允许使用顺序、IF-THEN-ELSE型分支和DO-WHILE型循环这3种基本控制结构;
扩展的结构程序设计:如果除了上述3种基本控制结构之外,还允许使用DO-CASE型多分支结构和DO-UNTIL型循环结构;
修正的结构程序设计:再加上允许使用LEAVE(或BREAK)结构。
过程设计的工具:⚠️
程序流程图:
程序流程图又称为程序框图,它是历史最悠久、使用最广泛的描述过程设计的方法。
它的主要优点是对控制流程的描绘很直观,便于初学者掌握。
程序流程图历史悠久,至今仍在广泛使用着。
程序流程图基本符号:
程序流程图的主要缺点:
程序流程图本质上不是逐步求精的好工具,它诱使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构。
程序流程图中用箭头代表控制流,因此程序员不受任何约束,可以完全不顾结构程序设计的精神,随意转移控制。
程序流程图不易表示数据结构。
盒图具有下述特点:
功能域明确。
不可能任意转移控制。
很容易确定局部和全程数据的作用域。
很容易表现嵌套关系,也可以表示模块的层次结构。
盒图基本符号:
PAD图:
PAD是问题分析图(problem analysis diagram)的英文缩写,自1973年由日本日立公司发明以后,已得到一定程度的推广。
它用二维树形结构的图来表示程序的控制流,将这种图翻译成程序代码比较容易。
PAD图基本符号:
PAD图的主要优点如下:
使用表示结构化控制结构的PAD符号设计出来的程序必然是结构化程序。
PAD图所描绘的程序结构十分清晰。
PAD图表现程序逻辑易读、易懂、易记。
容易将PAD图转换成高级语言源程序,这种转换可用软件工具自动完成。
即可表示程序逻辑,也可描绘数据结构。
PAD图的符号支持自顶向下、逐步求精方法的使用。
例题:某程序流程图如右图所示,请分别用N-S图和PAD图表示
第七章 实现(20分左右)
边界值分析:⚠️
考点:给一个取值范围,要会怎么定义边界
实现的概念:
通常把编码和测试统称为实现。
所谓编码就是把软件设计结果翻译成用某种程序设计语言书写的程序。
软件测试在软件生命周期中横跨两个阶段。
通常在编写出每个模块之后就对它做单元测试。
在这个阶段结束之后,对软件系统还应该进行各种综合测试,通常由专门的测试人员承担这项工作。
通过测试发现错误之后还必须诊断并改正错误,这就是调试的目的。调试是测试阶段最困难的工作。
在对测试结果进行收集和评价的时候,使用故障率数据,估计软件将来出现故障的情况并预测软件的可靠性。
黑盒测试和白盒测试:
测试步骤:⚠️(简答题)
大型软件系统的测试过程基本上由模块测试、子系统测试、系统测试、验收测试和平行运行等五个步骤组成。
测试总结:⚠️
每个阶段对应的关系,对应是黑盒还是白盒?
白盒测试技术:
设计测试方案是测试阶段的关键技术问题。所谓测试方案包括具体的测试目的(例如,预定要测试的具体功能),应该输入的测试数据和预期的结果。通常又把测试数据和预期的输出结果称为测试用例。
例:求平均值过程
(1) 根据过程设计结果画出相应的流图。
(2) 计算流图的环形复杂度。
V(G)=6
(3) 确定线性独立路径的基本集合。
所谓独立路径是指至少引入程序的一个新处理语句集合或一个新条件的路径。
用流图术语描述,独立路径至少包含一条在定义该路径之前不曾用过的边。
路径1:1-2-10-11-13
路径2:1-2-10-12-13
路径3:1-2-3-10-11(12)-13
路径4:1-2-3-4-5-8-9-2-
10-11(12)-13
路径5:1-2-3-4-5-6-8-9-
2-10-11(12)-13
路径6:1-2-3-4-5-6-7-8-
9-2-10-11(12)-13
(4) 设计可强制执行每条独立路径的测试用例。
应该选取测试数据使得在测试每条路径时都适当地设置好了各个判定结点的条件。
在测试过程中,执行每个测试用例并把实际输出结果与预期结果相比较。
一旦执行完所有测试用例,就可以确保程序中所有语句都至少被执行了一次,而且每个条件都分别取过true值和false值。
某些独立路径不能以独立的方式测试,这些路径必须作为另一个路径的一部分来测试。
黑盒测试着重测试软件功能,错误类型为:
功能不正确或遗漏了功能;
界面错误;
数据结构错误或外部数据库访问错误;
性能错误;
初始化和终止错误。
测试标准:
测试用例尽可能少;
一个测试用例能指出一类错误。
第八章 维护
软件维护定义:
所谓软件维护就是在软件已经交付使用之后,为了改正错误或满足新的需要而修改软件的过程。
可分为4项活动:
改正性维护 适应性维护 完善性维护 预防性维护
维护类型:⚠️
考点:给例子能区分对应是什么维护类型。
改正性维护是要改正在特定的使用条件下暴露出来的一些潜在程序错误或设计缺陷;
适应性维护是要在软件使用过程中数据环境发生变化或处理环境发生变化时修改软件以适应这种变化;
完善性维护是在用户和数据处理人员使用软件过程中提出改进现有功能,增加新的功能,以及改善总体性能的要求后,修改软件以把这些要求纳入到软件之中;
预防性维护是为了提高软件的可维护性、可靠性等,事先采用先进的软件工程方法对需要维护的软件或软件中的某一部分(重新)进行设计、编制和测试,为以后进一步改进软件打下良好基础。
第九章 面对对象方法学
什么是面向对象的开发方法 :
OOSD(Object-Oriented Software Development)法是一种把面向对象的思想应用于软件开发过程,指导开发活动的系统方法。
面向对象的方法是一种运用对象、类、继承、封装、聚合、消息传送、多态性等概念来构造系统的软件开发方法。
面向对象建模:
根据Coad和Yourdon的定义,按照以下4个概念设计和实现的系统,称为是面向对象的。
面向对象=对象 (object)
+类 (classification)
+继承(inheritance)
+通信 (communication with messages)
面向对象开发软件,需要建立3种形式的模型:⚠️
对象模型。描述系统数据结构—数据结构。
动态模型。描述系统控制结构—执行操作。
功能模型。描述系统功能—数值变化。
这三种模型从不同侧面描述了对系统的需求。在面向对象的分析(OOA)阶段,这三种模型是必不可少的。
对象模型(P216):(怎么画?有什么功能?分别做什么?)
对象模型描述了系统的静态结构。OO方法强调围绕对象而不是功能来构造系统。
使用统一建模语言UML (Unified Modeling Language)提供的类图来建立对象模型。
UML用例图是建立功能模型的有力工具。
9.4.1 类图的基本符号
9.4.2 表示关系的符号
动态模型(P.223-)
动态模型表示瞬时的、行为化的系统的“控制”性质,它规定了对象模型中的对象的合法变化序列。动态模型描述系统控制结构。通常用状态图表示。
功能模型(P.224-):(用例建模)
功能模型表示变化的系统的“功能”性质,它指明了系统应该“做什么”,通常,功能模型由一组数据流图组成。
UML提供的用例图也是进行需求分析和建立功能模型的强有力工具。
第十三章 项目管理
估算软件规模:
代码行技术
代码行技术是比较简单的定量估算软件规模的方法。
依据以往开发类似产品的经验和历史数据,估计实现一个功能所需要的源程序行数。
当有以往开发类似产品的历史数据可供参考时,估计出的数值还是比较准确的。把实现每个功能所需要的源程序行数累加起来,就可得到实现整个软件所需要的源程序行数。
功能点技术
功能点技术依据对软件信息域特性和软件复杂性的评估结果,估算软件规模。
n这种方法用功能点(FP)为单位度量软件规模。
工作量估算(p308-309)
三个模型是干什么的?
进度计划的工具:
Gantt(甘特)图
Gantt(甘特)图是历史悠久、应用广泛的制定进度计划的工具。
例子:旧木板房刷漆工程(15名工人,工具各5把)
假设有一座陈旧的矩形木板房需要重新油漆。这项工作必须分3步完成:首先刮掉旧漆,然后刷上新漆,最后清除溅在窗户上的油漆。假设一共分配了15名工人去完成这项工作,然而工具却很有限:只有5把刮旧漆用的刮板,5把刷漆用的刷子,5把清除溅在窗户上的油漆用的小刮刀。怎样安排才能使工作进行得更有效呢?
Gantt图的主要优点:
Gantt图能很形象地描绘任务分解情况,以及每个子任务(作业)的开始和结束时间。
具有直观简明和容易掌握、容易绘制的优点。
Gantt图的3个主要缺点:
不能显式地描绘各项作业彼此间的依赖关系;
进度计划的关键部分不明确,难于判定哪些部分应当是主攻和主控的对象;
计划中有潜力的部分及潜力的大小不明确,往往造成潜力的浪费。
工程网络:(不用细看)
工程网络是制定进度计划时另一种常用的图形工具,它同样能描绘任务分解情况以及每项作业的开始时间和结束时间。
它能显式地描绘各个作业彼此间的依赖关系。
工程网络是系统分析和系统设计的强有力的工具。
工程网络必要的信息:
每个作业估计需要使用的时间:箭头长度和它代表的作业持续时间没有关系,箭头仅表示依赖关系,它上方的数字才表示作业的持续时间。
最早时刻EET:该事件可以发生的最早时间。
最迟时刻LET:在不影响竣工时间的前提下,该事件最晚可以发生的时刻。
机动时间:实际开始时间可以比预定时间晚一些,或者实际持续时间可以比预定的持续时间长一些,而并不影响工程的结束时间。
最早时刻的计算:
事件的最早时刻是该事件可以发生的最早时间。
通常工程网络中第一个事件的最早时刻定义为零,其他事件的最早时刻在工程网络上从左至右按事件发生顺序计算。
计算最早时刻EET使用下述3条简单规则:
考虑进入该事件的所有作业;
对于每个作业都计算它的持续时间与起始事件的EET之和;
选取上述和数中的最大值作为该事件的最早时刻EET。
最迟时刻的计算:
事件的最迟时刻是在不影响工程竣工时间的前提下,该事件最晚可以发生的时刻。
按惯例,最后一个事件(工程结束)的最迟时刻就是它的最早时刻。其他事件的最迟时刻在工程网络上从右至左按逆作业流的方向计算。
计算最迟时刻LET使用下述3条规则:
考虑离开该事件的所有作业;
从每个作业的结束事件的最迟时刻中减去该作业的持续时间;
选取上述差数中的最小值作为该事件的最迟时刻LET。