软件期中复习.docx
《软件期中复习.docx》由会员分享,可在线阅读,更多相关《软件期中复习.docx(23页珍藏版)》请在冰豆网上搜索。
软件期中复习
软件:
能够完成预定功能和性能的可执行的计算机程序和使程序正常执行所需要的数据,加上描述程序的操作和使用的文档。
程序:
计算任务中的处理对象和处理规则的描述。
文档:
为了便于了解程序所需的资料说明。
软件危机
软件工程学提出的起点和由来:
解决大规模、复杂软件系统的开发和维护
从程序设计到软件工程
软件工程:
采用工程的概念、原理、技术和方法来开发和维护计算机软件,将工程管理技术的成功经验和思想与具体的软件开发过程、研究技术相结合,形成一整套适合于计算机软件开发的方法、规范和技术。
软件工程学包括软件开发技术和软件工程管理。
软件开发技术又分为软件开发方法学、软件工具、软件工程环境。
软件工程管理又分为软件管理学、软件经济学、软件度量学。
计算机软件,从决定进行开发到最终退役所经历的一系列步骤与过程称为软件生命周期。
根据GB8567软件开发国家标准,软件生命周期的一种典型的阶段划分为:
问题定义和可行性研究、需求分析、概要设计、详细设计、编码、测试、维护七个阶段。
结构化软件开发范型,即传统软件工程或经典软件工程数据结构+算法
面向对象软件开发范型对象+消息
第2章软件生命周期过程模型
软件测试:
单元测试、集成测试、系统测试、验收测试
对于软件产品的开发而言,涉及对于软件产品的分析、设计、实现、测试等阶段,一般将完成这些阶段的时序称为软件开发过程。
对软件生命周期的不同划分,形成了不同的软件生存周期模型。
软件过程模型(软件生存周期模型):
从软件项目需求定义开始直至软件使用后废弃为止,针对系统开发、运作和维护所实施的全部过程、活动和任务的结构框架。
瀑布模型适用情况:
很小的项目、有熟悉的类似项目
优点:
结构简单明了;
历史较长、应用面广泛、为广大软件工作者所熟悉;
已有与之配套的一组十分成熟的开发方法和丰富的支撑工具。
缺点:
任何一个阶段都不可能在下一阶段开始之前完全结束。
确定了需求分析的绝对重要性,但是在实践中要想获得完善的需求说明是非常困难的;
反馈信息慢;
开发者常常被不必要地耽搁。
具有原型化的瀑布模型注意:
原型往往是要废弃的。
螺旋模型将瀑布模型与演化模型结合起来,并且添加两种模型均忽略的风险分析
适用:
大规模软件项目
优点:
每次迭代中收集过程中产生的各种度量数据
将软件质量作为目标
软件测试
软件维护
缺点:
管理过程、文档一致性
限制条件
增量和迭代模型:
增量开发适用于项目后期
验证(verification):
保证软件正确地实现特定功能的一系列活动(是否与前一阶段定义的规格相一致)
确认(validation):
保证所生产的软件可追溯到用户需求的一系列活动(是否与最初定义的软件需求规格相一致)
第3章需求分析
需求的定义[IEEE]:
(1)用户为了解决问题或达到某些目标所需要的条件或权能;
(2)系统或系统部件为了满足合同、标准、规范或其它正式文档所规定的要求而需要具备的条件或权能;
(3)对
(1)或
(2)中的一个条件或一种权能的一种文档化表述。
软件需求规格说明书(SoftwareRequirementsSpecification,SRS)
功能需求、非功能需求
软件的功能需求分为三个层次:
业务需求、用户需求、功能(系统)需求
可以将整个软件需求工程研究领域划分为需求开发和需求管理两部分,需求开发可进一步分为:
需求获取、需求分析、编写需求规格说明书和需求验证四个阶段。
需求分析技术
1.结构化方法由结构化分析、结构化设计和结构化程序设计构成,也称Yourdon方法。
最早的、最传统的软件开发方法
指导思想是自顶向下、逐步求精
面向数据流的开发方法
基本原则是功能的分解与抽象
出现较早,适用于数据处理领域
不适用于规模大以及特别复杂的项目
2.面向对象方法:
一种运用对象、类、继承、封装、聚合、消息传送、多态性等概念来构造系统的软件开发方法。
面向对象开发方法包括面向对象分析、面向对象设计和面向对象实现。
3.形式化方法
结构化需求分析方法(SA)是一种面向数据流的自顶向下逐步求精的分析方法
实例(Instance)
需要在系统中收集和存储的现实世界事物
实体(Entity)
具有相同特征和属性的实例集的类别描述
关系
存在于一个或多个实体之间的自然业务联系
所有的关系隐含地都是双向的
关系表达的不是实体物理上的联系(例如车与车轮),而是逻辑上的链接(例如整体部分关系)
度数参与关系的实体数量
基数(约束)实体可能参与关系的数量
最大基数(键约束KeyConstraint)
对关系中任意的其他实体实例,该实体可能参与关系的最大数量:
1或many
最小基数(参与约束ParticipantConstraint)
对关系中任意的其他实体实例,该实体可能参与关系的最小数量:
0或1
数据流图
原始DFD图可以进一步展开为:
微规格说明、数据字典
在低于0层图的子图上通常不显示外部实体
子图中过程的编号要以父过程的编号为前缀:
1.2、1.2.1……
保持数据一致性
在功能分解过程当中,最重要的是要保证分解过程的平衡性(Balance),它要求DFD子图的输入流、输出流必须和父过程的输入流、输出流保持一致
数据字典和ERD通常被用来描述DFD数据流的详细内容和数据存储
第4章概要设计
概要设计的工具HIPO图
模块是软件设计的最小单位。
(单元)
具有一定功能的可以用名词调用的程序语句集合。
具有一些基本属性
模块化就是把程序划分成若干个模块,分别实现
模块独立性的度量标准:
耦合和内聚
耦合是模块之间相对独立性的量度低好
内聚是模块功能相对强度的量度高好
耦合性是对软件程序结构中各个模块之间相互关联程度的一种度量。
耦合
间接耦合两个模块之间没有直接关系
数据耦合数据参数来交换输入、输出信息的
特征耦合通过模块接口传递数据结构的一部分
控制耦合控制参数
外部耦合访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息
公共耦合全局的数据环境
内容耦合
设计软件时应尽量使用数据耦合,减少控制耦合,限制环境耦合和公共耦合,杜绝内容耦合。
内聚性标志一个模块内部各成分彼此结合的紧密程度。
内聚和耦合是相互关联的。
在程序结构中各模块的内聚程度越高,模块间的耦合程度就越低。
但并不绝对。
软件概要设计的目标是力求增加模块的内聚,尽量减少模块间的耦合。
增加内聚比减少耦合更重要。
低级内聚:
偶然性内聚
逻辑性内聚:
一个模块完成的诸任务逻辑上相关。
时间性内聚/经典内聚:
一个模块包含的诸任务必须在同一时间段内执行。
中级内聚:
过程性内聚:
受同一控制流支配,必须按特定的次序执行。
通信性内聚:
相同的输入数据,或产生了相同的输出数据。
高级内聚:
顺序性内聚:
顺序执行,前一个处理输出是下一个处理输入。
功能性内聚:
模块内所有成分形成一个整体,完成单个功能。
黑盒特性
尽可能使模块达到功能内聚
结构化设计方法(SD)基于数据流的设计方法
SA与SD相衔接:
利用映射把数据流图(信息流)变换成软件结构,即模块结构图
信息流有变换流(以变换为中心)和事务流(以事务为中心)两种类型。
变换是系统的变换中心,变换输入端的数据流为系统的逻辑输入,输出端为逻辑输出。
而系统输入端为物理输入,输出端为物理输出。
事务分析:
从具有事务流特点的数据流图建立系统结构图。
文件设计是指对数据存储文件的设计
数据库设计的步骤:
模式设计-->子模式设计-->完整性和安全性设计-->优化。
第5章详细设计
详细设计的设计表示法(即微规格说明):
结构化语言
判定表
判定树
决策表的组成:
(规则合并、规则包含)
条件定义(条件桩):
列出问题的所有条件。
通常认为列出的条件的次序无关紧要。
条件组合(条件项):
针对条件定义给出的条件,列出所有可能的取值(Y/N、T/F、√/×)。
操作的排列顺序没有约束。
动作定义(动作桩):
列出问题规定的可能采取的操作。
条件组合下的动作(动作项):
指出在条件组合的各组取值情况下应采取的动作。
将任何一个条件组合的特定取值及相应要执行的动作称为一条规则。
结构化程序设计的基本思想是采用自顶向下,逐步求精的程序设计方法和单入口单出口的控制结构。
描述方式:
程序流程图、N-S流程图、PAD图、过程设计语言PDL
面向数据结构的设计方法
Jackson方法:
数据驱动JSP->事件驱动JSD
Jackson方法把问题分解为可由三种基本结构形式表示的各部分层次结构。
这三种基本结构形式就是顺序、选择和重复。
设计原则:
程序结构同数据结构相对应
结构化设计方法(SD):
面向数据流的设计方法
Jackson方法(JSP):
面向数据结构的设计方法
异同
SD方法和JSP方法的共同点都是数据信息驱动的,都试图将数据表示转换成软件表示;
不同之处在于面向数据结构的设计不利用数据流图,而根据数据结构的表示来设计。
JSP方法定义了一组以数据结构为指导的映射过程,它根据输入、输出的数据结构,按一定的规则映射成软件的过程描述,最终目标是生成软件过程的描述,即程序结构,而不是软件的体系结构。
而SD方法是根据数据流图来设计,最终目标是建立软件体系结构的描述,即软件模块的层次结构。
JSP方法SD方法
数据结构(Jackson图)问题结构(DFD)
程序结构(Jackson图)软件结构(SC)
程序的过程性表示(Jackson伪代码)模块的过程描述(PDL)
Jackson图
三种基本结构:
由方框、连线和一些附加标记组成。
标记“0”代表选择,标记“*”代表重复。
连线代表“包含”或“由……组成”。
纲要逻辑
纲要逻辑是一种描述算法过程的语言,分别用seq、iter和sel-alt三类关键字描述顺序、重复和选择三种结构。
复审的重要性
差错传播模型
第6章编码与语言选择
编码阶段即软件实现阶段
编码时应该把简明清晰放在第一位
命令式编程是一种描述电脑所需作出的行为的编程范型,即指定问题求解的算法。
How?
命令式语言的演化分为“结构化编程”和“面向对象编程”
声明式编程是一种编程范型,采用了和命令式编程对立的方向。
描述目目标性质,让电脑明白目标是什么。
What?
声明式编程主要包括函数式编程和逻辑式编程
编码风格又称程序设计风格,其实就是程序员在书写代码过程中保持源代码清晰易读、便于维护的一种方式。
编码的目的是把详细设计的结果翻译成用选定的语言书写的源程序。
程序的质量主要是由设计的质量决定的。
但是,编码的风格和使用的语言对编码质量也有重要的影响。
第7章面向对象方法
对象模型组成元素
——对象是现实世界中个体或事物的抽象表示,是指在一个应用当中具有明确角色的独立可确认的实体。
包含:
标识:
对象唯一标识
属性:
表示对象的性质
操作:
对象可以展现的外部服务
——链接(对象间)对象之间的物理或业务联系
链接通常是单向的,当然也有双向的链接存在
由a指向b的链接使得b对a可见,或者说a拥有b的可见性
——类
是共享相同属性和行为的对象的集合,它为属于该类的所有对象提供统一的抽象描述(接口)和生成模板(实现)
包括:
名称、属性、行为方法
类的基本特征:
抽象、继承、封装
多态:
重载、范型
——关联(类间)
特征:
名称、度数、关联类、基数(多重性约束),基数的具体值根据实际问题中的说明来确定。
消息:
对象间相互联系和相互作用的方式称为消息。
面向对象开发方法包括面向对象分析OOA、面向对象设计OOD、面向对象实现(编程)OOP
基本的OOA模型由3个层次构成:
对象层:
发现对象
特征层:
定义属性和服务
关系层:
定义对象类之间的关系
(整体-部分关系(即对象之间的组成关系),用整体-部分结构表示。
继承关系(即对象类之间的一般-特殊关系),用一般-特殊结构表示。
对象之间的静态联系(即通对象属性反映的联系),用实例连接表示。
对象之间的动态联系(即对象行为之间的依赖关系),用消息连接表示。
)
复杂系统的OOA模型由5个层次构成:
类和对象层
属性层
服务层
结构层
主题层:
把一些具有较强联系的类组织在一起构成类集合。
面向对象设计(OOD):
分为两个阶段,即高层设计(软件)和低层设计(类)
第8章统一建模语言UML
视角(采用UML进行项目分析和设计的步骤)
用例视图(用例图)
静态视图(类图,对象图)
行为视图(状态机图,活动图)动态视图
交互视图(顺序图,通讯图)动态视图
实现视图(构件图,部署图)
对象约束语言OCL
用例图(UseCaseDiagram)着重于描述系统外部的行为者与系统的用例之间的某种联系:
UML是一种用例图驱动的开发方法
基本元素:
用例、行为者(人或系统)、系统边界
关系:
关联、包含/使用、扩展、泛化(后三者是用例间的)
类图ClassDiagram描述了系统中的类及其相互之间的各种关系,其本质反映了系统中包含的各种对象的类型以及对象间的各种静态关系。
对象图ObjectDiagram是类图的一种实例化。
对象模型组成元素:
对象
链接:
对象之间的物理或业务联系
类
关联:
指出了类之间的某种语义联系,是类对其对象实例之间的无数潜在联系的描述
1..*/*
(都指向整体)
聚集关联(聚合):
用于表示类的对象之间的关系是整体与部分的关系。
组成关联(组合):
用于表示类的对象之间的关系,整体拥有各部分,部分与整体共存,如整体不存在了,部分也会随之消失。
泛化关联(继承关系):
定义了类和包间的一般元素和特殊元素之间的分类关系。
消息连接(依赖关系):
有两个类或包元素X、Y,修改元素X的定义可能会引起对另一个元素Y的定义的修改,则称元素Y依赖于元素X。
包图(PackageDiagram)
包是一种分组机制,表示一个类的集合。
包图所显示的是类的包以及这些包之间的依赖关系。
如果两个包中的任意两个类之间存在依赖关系,则这两个包之间存在依赖关系。
包的依赖是不传递的。
构件图(ComponentDiagram)
构件是系统中可替换的物理部分,它包装了实现而且遵从并提供一组接口的实现。
部署图(DeploymentDiagram)
部署图描述系统中硬件和软件的物理配置情况和系统体系结构。
在部署图中,用节点表示实际的物理设备
状态图(StatechartDiagram)
状态图是对类的一种补充描述,它展示了某类的对象所具有的可能的状态以及某些事件发生时其状态的转移情况。
主要用于描述重要而且复杂的单个对象的所有行为。
通常要涉及很多个(甚至大部分)的用例。
状态:
由圆角矩形表示
顺序图(SequenceDiagram)
顺序图描述了对象之间动态的交互关系,着重体现多个对象之间消息传递的时间顺序。
通常描述的是单个用例的典型场景
协作图(CollaborationDiagram)
与顺序图作用相同,协作图也是用来描述系统中对象之间的动态协作关系。
协作图侧重于描述多个对象之间存在的消息收发关系(交互关系),而不专门突出这些消息发送的时间顺序。
通常描述的是单个用例的典型场景
活动图(ActivityDiagram)
活动图描述系统中各种活动的执行顺序。
以“流”(控制流和数据流)处理为侧重点描述系统的行为
通常以整体业务流程为描述对象,用于描述一个操作中所要进行的各项活动的执行流程。
同时,它也可被用来描述一个用例的处理流程,或者某种交互流程。
活动图最适合支持描述并行/并发行为,这使之成为支持工作流建模的最好工具。
牵涉多个用例
协作图的布局方法能更清楚地表示出对象之间静态的连接关系。
(多个对象、单个用例)
顺序图突出执行的时序,能更方便地看出事件发生的次序。
(多个对象、单个用例)
如果想要描述跨越多个用例的单个对象的行为,应当使用状态图。
如果想要描述跨越多个用例或多个线程的多个对象的复杂行为,则需考虑使用活动图。
第9章统一软件过程
统一软件过程/统一软件开发过程(RationalUnifiedProcess,RUP):
面向对象且基于网络的程序开发方法论
主流的面向对象方法(迭代和递增)
权衡:
技术、工具、人员、组织模式
不断进化、相对稳定
5个核心工作流:
需求流:
需求流用客户的语言表达
分析流:
分析流则用更精确的语言,以确保设计流和实现流正确地完成
设计流
实现流
测试流
4个阶段:
开始阶段决定是否值得去开发目标软件产品
细化阶段细化最初的需求、细化体系结构、监视风险和细化它们的属性、细化商业案例,以及生成软件项目管理计划
构建阶段产生软件产品的第一个可工作版本,也称为测试版
转换阶段确保客户的需求切实得到满足。
二维生命周期模型
第10章软件测试
软件测试的定义[IEEE1983]:
软件测试是使用人工和自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或弄清楚预期结果与实际结果之间的差别。
按测试技术分类
白盒测试:
通过对程序内部结构的分析、检测来寻找问题,即检查程序内部操作是否按规定执行,程序各个部分功能是否得到充分使用。
白盒测试又称为结构测试或逻辑驱动测试。
逻辑覆盖法:
在测试过程中,以覆盖某些程序元素为测试目标的测试。
是一系列测试过程的总称
根据覆盖目标(覆盖源程序语句的详细程度)的不同,
逻辑覆盖可分为:
语句覆盖(被测程序的每个语句至少被执行一次)、
判定覆盖(每一个分支都至少通过一次)、
条件覆盖(判定中的每个条件的所有可能结果至少出现一次)、
判定/条件覆盖(判定中的每个条件的所有可能结果至少出现一次、每个判定本身的所有可能结果也至少出现一次)、
条件组合覆盖(每个判定中条件结果的所有可能组合至少出现一次);
路径覆盖法:
覆盖被测程序中所有可能的路径
黑盒测试:
通过软件的外部表现来发现其缺陷和错误,即测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书和用户手册,检查程序的功能是否符合它的功能说明,以及性能是否满足用户的要求。
黑盒测试又称为功能测试或数据驱动测试。
常用的黑盒测试方法
等价类划分法(代表性数据)
划分含义:
互不相交的一组子集,这些子集的并是整个集合
作用:
完备性、无冗余性
等价类:
某个输入域的子集A
等价关系:
每一类的代表性数据在测试中的作用等价于这一类中的其他值
程序的输入/输出域一般可以划分为两种等价类:
有效等价类:
是指对软件规格说明而言,是有意义的、合理的输入/输出数据所组成的集合。
无效等价类:
是指对软件规格说明而言,是无意义的、不合理的输入/输出数据所构成的集合。
设计一个新的测试用例,使它能够尽量覆盖尚未覆盖的有效等价类。
设计一个新的测试用例,使它仅覆盖一个尚未覆盖的无效等价类。
1.弱一般等价类测试用例设计法
“单缺陷”假设:
失效极少是由两个(或多个)缺陷的同时发生引起的。
测试用例从每个有效等价类中选取一个值。
变量对应有效等价类数的最大值
2.强一般等价类测试用例设计法
“多缺陷”假设。
测试用例从有效等价类的笛卡儿积中选取。
变量对应有效等价类数的乘积
3.弱健壮等价类测试用例设计法
“单缺陷”假设,考虑无效值
对于有效等价类,从每个有效等价类选取一个值。
对于无效等价类,使用一个无效值,并保持其余的值都是有效的。
变量对应有效等价类数的最大值+各个变量的无效等价类数之和
4.强健壮等价类测试用例设计法
“多缺陷”假设,考虑无效值。
测试用例从所有等价类(包括有效和无效等价类)笛卡儿乘积中选取。
(变量对应有效等价类数+变量的无效等价类数)的乘积
边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。
基本原理:
针对各种边界情况,从中标识测试用例,可以查出更多的错误。
大量的错误是发生在输入或输出范围的边界上(极值附近)
正常值与健壮值:
不考虑/考虑无效取值范围(min-、max+)
普通与最坏情况:
基于“单缺陷”假设/“多缺陷”假设(单个变量取极值、多个变量取极值)
1.一般边界条件测试用例设计法
每次保留程序中一个变量,让其余的变量取正常值,被保留的变量依次取min、min+、nom、max-和max。
对于一个n变量函数,一般边界条件测试用例设计法生成的测试用例数为4n+1个
2.健壮性边界条件测试用例设计法
每次保留程序中一个变量,让其余的变量取正常值,被保留的变量依次取min-、min、min+、nom、max-、max和max+
对于一个n变量函数,健壮性边界条件测试用例设计法生成的测试用例数为6n+1个
3.最坏边界条件测试用例设计法
所有变量均可取min、min+、nom、max-和max这五个边界值中的任何一个。
对于一个n变量函数,最坏边界条件测试用例设计法生成的测试用例数为5^n个
4.健壮最坏边界条件测试用例设计法
所有变量均可取min-、min、min+、nom、max-、max和max+这七个边界值中的任何一个。
对于一个n变量函数,健壮最坏边界条件测试用例设计法生成的测试用例数为7^n个。
不论黑盒测试还是白盒测试,是否可能穷举测试?
不能!
按测试方式,软件测试分为:
静态测试:
静态分析,不执行被测试软件,而对需求分析说明书、软件设计说明书、源程序做结构检查、流程图分析等找出软件缺陷。
静态测试可以人工进行分析,也可以由静态分析测试工具来自动分析,它将被测试程序的正文作为输入,经静态分析程序分析得出测试结果。
动态测试:
执行被测程序,通过执行结果分析软件可能出现的缺陷。
即计算机必须真正运行被测试的程序,通过输入测试用例,对其运行情况即输入与输出的对应关系进行分析,以达到检测的目的。
按测试阶段分类:
单元测试、集成测试、系统测试、验收测试
单元测试:
单元测试是对软件基本组成单元进行测试。
检验程序最小单元(具有基本属性)的实现是否和该单元的说明一致,有无错误。
细粒度的测试
主要测试5个方面的问题:
模块接口、局部数据结构、边界条件、独立的路径、错误处理
驱动模块(Drive):
用来模拟被测试模块的上一级模块,相当于被测模块的主程序。
它接收数据,将相关数据传送给被测模块,启动被测模块,并打印出相应的结果。
桩模块(Stub)(又称存根模块或连接模块):
用以代替被测模块所调用的子模块,相当于被测模块工作过程中所调用的模块。
集成测试:
集成测试是在单元测试的基础上,将所有模块按照概要设计要求组装成为子系统或系统所进行的测试。
把模块组装成为系统的方式(集成策略):
一次性集成方式(整体拼装,非增量式集成):
大爆炸集成Bigbangintegration(单元测试后,整体拼装)
增殖式集成方式(增量式集成)
自顶向下集成Topdownintegration逐步集成和逐步测试是按照结构图自上而下进行的。
深度优先方式的集成:
首先集成在结构中的一个主控路径下的所有模块,主控路径的选择是任意的。
广度优先方式的集成:
首先沿着水平方向,把每一层中所有直接隶属于上一层的模块集成起来,直到底层。
自底向上集成Bottomupintegration逐步集成和逐步测试的工作是按结构图自下而上进行的,即从