`
zy825316
  • 浏览: 10426 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

为了复试_软件工程 大纲内容解析

阅读更多

人这辈子的喜怒哀乐真的很折磨人啊。好想自己是个机器人或者不存在。

 

今天第一次看软件工程导论 第五版 是张海潘老师的书,清华出版社

由于复试没有考试大纲,我只有用了另外一个相近专业的初试大纲来系统性的学习。

 

今天是第一次这本书,看的时间不太长。总结的内容也不太多,大概的情况就是依据大纲把书中的目录全部勾画出来了。我还是把大纲也上传到这里,免得以后找不到了。

 

 

(一)软件工程基本概念

0、(补充)软件的定义:计算机程序、方法、规则、相关文档资料以及在计算机上运行程序时所必须的数据。(方法和规则通常在文档中说明并在程序中实现)

软件=程序+数据+文档。

1、软件危机:落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象。

2、软件工程定义:

****书中的定义:

概括的说,软件工程是指导计算机软件开发和维护的一门工程学科。采用工程的概念、原理、技术和方法来开发和维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发高质量的软件并有效地维护它,这就是软件工程。

 

下面两个是著名的定义,仅为了解。

****BarryBoehm:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料。

****IEEE:在软件工程术语汇编中的定义:软件工程是:1.将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护,即将工程化应用于软件;2.在1中所述方法的研究

 

 

 

3、软件工程的基本原理:

下面简要介绍软件工程的七条原理:

 

****用分阶段的生命周期计划严格管理

这一条是吸取前人的教训而提出来的。统计表明,50%以上的失败项目是由于计划不周而造成的。在软件开发与维护的漫长生命周期中,需要完成许多性质各异的工作。这条原理意味着,应该把软件生命周期分成若干阶段,并相应制定出切实可行的计划,然后严格按照计划对软件的开发和维护进行管理。

玻姆认为,在整个软件生命周期中应指定并严格执行6类计划:

项目概要计划、

里程碑计划、

项目控制计划、

产品控制计划、

验证计划、

运行维护计划。

 

****坚持进行阶段评审

统计结果显示:大部分错误是在编码之前造成的,大约占63%错误发现的越晚,改正它要付出的代价就越大,要差2到3个数量级。 因此,软件的质量保证工作不能等到编码结束之后再进行,应坚持进行严格的阶段评审,以便尽早发现错误。

 

****实行严格的产品控制

开发人员最痛恨的事情之一就是改动需求。但是实践告诉我们,需求的改动往往是不可避免的。这就要求我们要采用科学的产品控制技术来顺应这种要求。也就是要采用变动控制,又叫基准配置管理。当需求变动时,其它各个阶段的文档或代码随之相应变动,以保证软件的一致性。

 

****采纳现代程序设计技术

从六、七十年代的结构化软件开发技术,到最近的面向对象技术,从第一、第二代语言,到第四代语言,人们已经充分认识到:方法大似气力。采用先进的技术即可以提高软件开发的效率,又可以减少软件维护的成本。

 

****结果应能清楚地审查

软件是一种看不见、摸不着的逻辑产品。软件开发小组的工作进展情况可见性差,难于评价和管理。为更好地进行管理,应根据软件开发的总目标及完成期限,尽量明确地规定开发小组的责任和产品标准,从而使所得到的标准能清楚地审查。

 

****开发小组的人员应少而精

开发人员的素质和数量是影响软件质量和开发效率的重要因素,应该少而精。 这一条基于两点原因:高素质开发人员的效率比低素质开发人员的效率要高几倍到几十倍,开发工作中犯的错误也要少的多;当开发小组为N人时,可能的通讯信道为N(N-1)/2, 可见随着人数N的增大,通讯开销将急剧增大。

 

****承认不断改进软件工程实践的必要性

遵从上述六条基本原理,就能够较好地实现软件的工程化生产。但是,它们只是对现有的经验的总结和归纳,并不能保证赶上技术不断前进发展的步伐。因此,玻姆提出应把承认不断改进软件工程实践的必要性作为软件工程的第七条原理。根据这条原理,不仅要积极采纳新的软件开发技术,还要注意不断总结经验,收集进度和消耗等数据,进行出错类型和问题报告统计。这些数据既可以用来评估新的软件技术的效果,也可以用来指明必须着重注意的问题和应该优先进行研究的工具和技术。[11]

 

4、软件工程包含的领域:9页,软件工程包括技术和管理两方面的内容。(未找到标准答案)。

 

 

(二)软件过程

5、软件生命周期(SDLC,Systems Development Life Cycle,SDLC)及任务

生命周期分三个:软件定义,软件开发,运行维护。

再分

软件定义分为:问题定义、可行性研究、需要分析

软件开发分为:总体设计、详细设计、编码和单元测试,综合测试。注意编码和单元测试是一个整体。

软件维护:主要任务是使软件持久地满足用户的需要。

 

百度对此的解释也比较好:

——————————————————————————————————————————

通常,软件生存周期包括:

一,问题定义。要求系统分析员与用户进行交流,弄清“用户需要计算及解决什么问题”然后提出关于“系统目标与范围的说明”,提交用户审查和确认。

二,可行性研究。一方面在于把待开发的系统的目标以明确的语言描述出来,另一方面从经济、技术、法律等多方面进行可行性分析。

三,需求分析。弄清用户对软件系统的全部需求,编写需求规格说明书和初步的用户手册,提交评审。

四,开发阶段。开发阶段由三个阶段组成:

1,总体设计:即对有关系统全局问题的设计,也就是设计系统总的处理方案,又称系统概要设计。

2、详细设计:对概要设计的一个细化,设计每个模块的实现算法、所需的局部数据结构。详细设计的目标有两个:实现模块功能的算法要逻辑上正确和算法描     述要简明易懂。

3,编码与单元测试:写出正确的容易理解和维护的程序模块。主要要根据目标系统的性质和实际环境选一种适当的高级语言,将详细设计的结果翻译成用选定语言书写的程序,并且仔细检查编写的每一个模块。

4,综合测试:通过各种类型的测试和相应的调试使软件达到预定的要求。

五,维护:维护包括四个方面

1,改正性维护:在软件交付使用后,由于开发测试时的不彻底、不完全、必然会有一部分隐藏的错误被带到运行阶段,这些隐藏的错误在某些特定的使用环境下就会暴露。

2,适应性维护:是为适应环境的变化而修改软件的活动。

3,完善性维护[1]:是根据用户在使用过程中提出的一些建设性意见而进行的维护活动。

4,预防性维护:是为了进一步改善软件系统的可维护性和可靠性,并为以后的改进奠定基础。

————————————————————————————————————————————

 

 

今天都主要是一些记忆的内容,没有太复杂的概念的理解之类的。

6、基本软件过程模型:

首先解释名词,软件过程:是为了获得高质量软件所需要完成的一系列任务框架,它规定了完成各项任务的工作步骤。也就是为了开发出软件,规定who/when/what/how,什么人在什么时候做什么,如何做

主要是有以下7种模型:瀑布模型,快速原型模型,增量模型,螺旋模型,喷泉模型,rational统一过程

、敏捷过程

 

 

粗读的时候还是非常抽象的。基本不太容易深刻理解。

但是还是对每一种模型做一个简要的概括:

 

****瀑布模型:瀑布模型将软件生命周期划分为需求分析、规格说明、设计、编码、综合测试和维护等六个基本活动,并且规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落。

 

 

 

****快速原型模型:快速原型模型的第一步是建造一个快速原型,实现客户或未来的用户与系统的交互,用户或客户对原型进行评价,进一步细化待开发软件的需求。通过逐步调整原型使其满足客户的要求,开发人员可以确定客户的真正需求是什么;第二步则在第一步的基础上开发客户满意的软件产品。

 

 

 

****增量模型:与建造大厦相同,软件也是一步一步建造起来的。在增量模型中,软件被作为一系列的增量构件来设计、实现、集成和测试,每一个构件是由多种相互作用的模块所形成的提供特定功能的代码片段构成。增量模型在各个阶段并不交付一个可运行的完整产品,而是交付满足客户需求的一个子集的可运行产品。整个产品被分解成若干个构件,开发人员逐个构件地交付产品,这样做的好处是软件开发可以较好地适应变化,客户可以不断地看到所开发的软件,从而降低开发风险。 

 

 

 

****螺旋模型(由风险驱动):  一个阶段首先是确定该阶段的目标,完成这些目标的选择方案及其约束条件,然后从风险角度分析方案的开发策略,努力排除各种潜在的风险,有时需要通过建造原型来完成。如果某些风险不能排除,该方案立即终止,否则启动下一个开发步骤。最后,评价该阶段的结果,并设计下一个阶段。

 

 

 

****喷泉模型(面向对象的生存期模型, 面向对象(Object Oriented,OO)模型):该模型认为软件开发过程自下而上周期的各阶段是相互迭代和无缝的特性。软件的某个部分常常被重复工作多次,相关对象在每次迭代中随之加入渐进的软件成分。无缝指在各项活动之间无明显边界,如分析和设计活动之间没有明显的界限,由于对象概念的引入,表达分析、设计、实现等活动只用对象类和关系,从而可以较为容易地实现活动的迭代和无间隙,使其开发自然地包括复用。

 

 

 

 

****Rational统一过程:RUP强调采用迭代和检查的方式来开发软件,整个项目开发过程由多个迭代过程组成。在每次迭代中只考虑系统的一部分需求,针对这部分需求进行分析、设计、实现、测试和部署等工作,每次迭代都是在系统已完成部分的基础上进行的,每次给系统能够增加一些新的功能,如此循环往复地进行下去,直至完成最终项目。

 

 

 

****敏捷过程:为了使软件开发团队具有高效工作和快速响应的变化的能力。注重4个要点:团队成员之间的沟通,内部文档尽量简明扼要(图),与客户密切沟通,快速响应变化。其中极限编程是敏捷过程中最出名的一个。

 

 

 

****极限编程:XP是一种近螺旋式的开发方法,它将复杂的开发过程分解为一个个相对比较简单的小周期;通过积极的交流、反馈以及其它一系列的方法,开发人员和客户可以非常清楚开发进度、变化、待解决的问题和潜在的困难等,并根据实际情况及时地调整开发过程。

 

 

7、能力成熟度模型等级及过程域:

****能力成熟度模型(CMM):是改进软件过程的有效策略。CMM的基本思想是,因为问题是由我们管理软件过程的方法不当引起的,所以新软件技术的运用不会自动提高软件生产率和软件质量,应该下大功夫改进对软件过程的管理。但是实际上对软件过程的改变不是一蹴而就的,因此,cmm以增量方法逐步引入变化, 它明确地定义了5个成熟度等级,一个软件开发组织可以一系列的小的改良性步骤迈入更高的成熟度。

成熟度等级:

——初始级(Initial):一切都来没有规章制度可循,一个特定的工程碰巧由一个有能力的管理员和一个优秀的软件开发组来做,则这个工程可能是成功的。

——可重复级(Repeatable):有些基本的软件项目的管理行为、设计和管理技术(跟踪费用和进度),并且是基于相似产品中的经验,故称为“可重复”。

——已定义级(Defined):已为软件生产的过程编制了完整的文档。软件过程的管理方面和技术方面都明确地做了定义,并按需要不断地改进过程,而且采用评审的办法来保证软件的质量。

——已管理级(Managed):一个处于第4级的公司对每个项目都设定质量和生产目标。这两个量将被不断地测量,当偏离目标太多时,就采取行动来修正。

——优化级(Optimizing):—个第5级组织的目标是连续地改进软件过程。

 

 

 

****过程域:过程域指出了达到某个成熟度等级必须要解决的一族问题。除了初始级以外,每个成熟度等级都有若干个过程域,如表5-1所示。由于成熟度等级是循序渐进的,如果想达到某个成熟度等级,例如CMMI 3级,除了满足CMMI 3级本身11过程域之外,还要满足CMMI 2级的7个过程域,依此类推。



 

 

(三)结构化分析、设计(在软件工程导论里面搞不清在哪里,有点像在第二章,又有点像属于在91页总体设计和与94页的设计原理相关)

 

8、结构化分析:是强调开发方法的结构合理性以及所开发软件的结构合理性的软件开发方法。结构是指系统内各个组成要素之间的相互联系、相互作用的框架。结构化开发方法提出了一组提高软件结构合理性的准则,如分解与抽象、模块独立性、信息隐蔽等。针对软件生存周期各个不同的阶段,它有结构化分析(SA)和结构化程序设计(SP)等方法。

 

9、数据流图(Data Flow Diagram):数据流图是结构化分析方法中使用的工具,它以图形的方式描绘数据在系统中流动和处理的过程,由于它只反映系统必须完成的逻辑功能,所以它是一种功能模型。

****数据流程图中有以下几种主要元素:

→:数据流。数据流是数据在系统内传播的路径,因此由一组成分固定的数据组成。

□:数据源(终点)。代表系统之外的实体,可以是人、物或其他软件系统

○:对数据的加工(处理)。加工是对数据进行处理的单元,它接收一定的数据输入,对其进行处理,并产生输出。

〓:数据存储。表示信息的静态存储,可以代表文件、文件的一部分、数据库的元素等。



 

****关于附加的说明:星号表示与,加号表示或,圆里有加表示互斥,请看图



 

 

 

这些都是基本的内容,书中还描述了一个列子、命名规则和用途。这些都以后再深入学习的时候补充吧。

 

10、数据字典(Data dictionary):

定义:数据字典是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑、外部实体等进行定义和描述,其目的是对数据流程图中的各个元素做出详细的说明。

内容:数据字典通常包括数据项\数据流\数据存储和处理过程四个部分。注意对数据的处理用IPO图或PDL描述更为方便。

****IPO图:在计算机领域IPO是指结构化设计中变换型结构的输入(Input)、加工(Processing)、输出(Output)。IPO图是对每个模块进行详细设计的工具,它是输入加工输出(INPUT PROCESS OUTPUT)图的简称。IPO图的主体是算法说明部分,该部分可采用结构化语言、判定表、判定树,也可用N-S图、问题分析图和过程设计语言等工具进行描述,要准确而简明的描述模块执行的细节。

****PDL就是过程设计语言,就是伪代码。用正文形式表述数据和处理的设计工具

举例:

二、数据字典应用举例

以学生选课数据字典为例简要说明如何定义数据字典。

学生选课的数据流图如下:

①数据项:以“学号”为例

数据项名:学号

数据项含义:唯一标识每一个学生

别名:学生编号

数据类型:字符型

长度:8

取值范围:00000~99999

取值含义:前2位为入学年号,后3位为顺序编号

与其他数据项的逻辑关系:(无)

② 数据结构:以“学生”为例

数据结构名:学生

含义说明:是学籍管理子系统的主体数据结构,定义了一个学生的有关信息

组成:学号,姓名,性别,年龄,所在系

③ 数据流:以“选课信息”为例

数据流名:选课信息

说明:学生所选课程信息

数据流来源:“学生选课”处理

数据流去向:“学生选课”存储

组成:学号,课程号

平均流量:每天10个

高峰期流量:每天100个

④ 数据存储:以“学生选课”为例

数据存储名:学生选课

说明:记录学生所选课程的成绩

编号:(无)

流入的数据流:选课信息,成绩信息

流出的数据流:选课信息,成绩信息

组成:学号,课程号,成绩

数据量:50000个记录

存取方式:随机存取

⑤ 处理过程:以“学生选课”为例

处理过程名:学生选课

说明:学生从可选修的课程中选出课程

输入数据流:学生,课程

输出数据流:学生选课

处理:每学期学生都可以从公布的选修课程中选修自己愿意选修的课程,选课时有些选修课有先修课程的要求,还要保证选修课的上课时间不能与该生必修课时间相冲

 

突,每个学生四年内的选修课门数不能超过8门。

 

 

上述例子摘抄于网上,我发现设计并不是那么的固定和规范,只要把东西说清楚了就行,有还个小的知识点要记忆。

就是在数据字典中定义某个东西的时候常用的几个符号

=意思是等价于

+的意思是和

[]的意思是或用|隔开分量

{}意思是重复,并且在{前面标明上限,}后表明下限。或者{的前面的上、下位置表明上下限

()表示可选。

比如8个字符的字符串,第一个为字母

标示符=字母字符+字母数字串

字符数字串=0{字母或者数字}7

字母或者数字=[字母字符|数字字符]

 

 

11、

软件设计的概念:软件设计的任务是从软件需求规格说明书出发,根据需求分析阶段确定的功能设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及编写具体的代码,形成软件的具体设计方案。

 

软件设计的原则:与总体设计的原理一致。

 

上面来个应该是匹配书上的总体设计章节。

 

总体设计:又称为概要设计或者初步设计,通过这个阶段的工作将划分出组成系统的物理元素——程序、文件、数据库、人工过程和文档等,但是每个物理元素仍然处于黑盒子级,这些黑盒子里的具体内容将在以后仔细设计。 总体设计的过程包含两个阶段:系统设计阶段:确定系统具体实现方案。结构设计阶段,确定软件结构.

 

设计原理:

****模块化:就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。

 

****抽象:将相似的方面集中和概括起来,暂时忽略他们之间的差异,这就是抽象。就是抽出事情的本质特性而暂时不考虑它们的细节。

 

****逐步求精:为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。

 

****信息隐藏和局部化:信息隐藏是指在设计和确定模块时,使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说是不可能访问到的。局部化是指把一些关系密切的软件元素物理放地比较靠近。

 

****模块独立:模块独立就是模块化、抽象、信息隐藏和局部化概念的直接结果。开发具有独立功能而且和其他模块之间没有过多的相互作用的模块,就可以做到模块独立。有两个定性衡量标准,内聚和耦合。耦合衡量不同模块彼此间互相依赖(连接)的程度。内聚衡量一个模块内部各个元素彼此结合的紧密程度。追求低耦合和高内聚。

 

 

12、面向数据流的设计方法:  面向数据流的设计是以需求分析阶段产生的数据流图为基础,按一定的步骤映射成软件结构,因此“又称结构化设计(Structured Design,简称SD)。即将信息流映射成软件结构,信息的类型决定了映射的方法。信息流有下面两种类型:变换型和事务型。

 

****变换型的DFD是由输入、变换和输出组成,变换型数据处理的工作过程一般分为三步:取得数据、变换数据和给出数据,这三步体现了变换型DFD的基本思想。变换是系统的主加工,变换输入端的数据流为系统的逻辑输入,输出端为逻辑输出。

 

 

****事务型:若某个加工将它的输入流分离成许多发散的数据流,形成许多加工路径,并根据输入的值选择其中一条路径来执行,这种特征的DFD称为事务型的数据流图,这个加工称为事务处理中心。

 



 

设计过程用一个图来说明比较好:



 

 

书中关于变换流所述步骤,我觉得有必要记录一下:具体事例图,不方便给出。请参阅书上106页

1.审查基本系统模型

2.复查并且精化数据流图

3.确定数据流图具有变换特征还是事物特征

4.确定输入流和输出流的边界,从而孤立出控制中心

5.完成一级分解,用一个图来说明分解方法



 

 

6.二级分解,用图来说明



 

7.使用设计度量和启发式规则对第一次分割得到的软件结构进一步精化。

 

 

关于事务流的例子,前几部和变换流差不多,给出关键差别的几步

 




 

 

 
 

12、过程设计工具

这一部分就是涉及详细设计了。

 

过程设计工具即使指:描述程序处理过程的工具称为过程设计的工具,可以是图、表格、语言。必须描述的非常清楚,以便在边编码阶段能把对设计的描述直接翻译成程序代码。

 

有如下几种常见的过程设计工具:程序流程图、盒图、PAD(problem analysis diagram)图、判定表、判定树、过程设计语言(就是伪码)。

 

**程序流程图,下图给出了所有的符号。



 

 

**盒图,下图给出常用符号



 

 

**PAD(problem analysis diagram)图的常用符号

PAD(problem analysis diagram)图逐步求精的例子

 

 

 

**判定表

一张判定表由 4 部分组成,左上部列出所有条件,左下部是所有可能做的动作,右上部是表示各种条件组合 的一个矩阵,右下部是和每种条件组合相对应的动作。判定表右半部的每一列实质上是一条规则,规定了与特定的条件组合相对应的动作。

 

下面以行李托运费的算法为例说明判定表的组织方法。假设某航空公司规定,乘客可以免费托运重量不超过 30kg 的行李。当行李重量超过 30kg 时,对头等舱的国内乘客超重部分每公斤收费 4 元,对其他舱的国内乘客超重部分每公斤收费 6 元,对外国乘客超重部分每公斤收费比国内乘客多一倍,对残疾乘客超重部分每公斤收费比正常乘客少一半。 用判定表可以清楚地表示与上述每种条件组合相对应的计算行李费的算法,如下图所示

 

 

 

**判定树相对非常容易理解:但是注意,判定树分支的次序可能会对结果造成将大的影响。

 

**过程设计语言(就是伪码):这个玩意我觉得就是c语言的一些词语和中文的交叉呗(当然日本人用日语,美国人用英语),还是贴一张图来看看什么是伪码。



(四)软件测试

13、软件测试的定义:利用测试工具按照测试方案和流程对产品进行功能和性能测试。可以理解为 为了发现程序中的错误而执行程序的过程软件测试分类:根据不同的角度,分类有所不同.

 

从是否关心软件内部结构和具体实现的角度划分:白盒测试,黑盒测试(下面详解)

 

从是否执行程序的角度:

静态测试:静态方法是指不运行被测程序本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性。对需求规格说明书、软件设计说明书、源程序做结构分析、流程图分析、符号执行来找错。

动态测试:动态方法是指通过运行被测程序,检查运行结果与预期结果的差异,并分析运行效率和健壮性等性能,这种方法由三部分组成:构造测试实例、执行程序、分析程序的输出结果。

 

从软件开发的过程按阶段划分有:

单元测试:单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。一般与编码阶段一起执行。

 

集成测试:在单元测试的基础上,将所有模块按照设计要求(如根据结构图〕组装成为子系统或系统,进行集成测试。实践表明,一些模块虽然能够单独地工作,但并不能保证连接起来也能正常的工作。程序在某些局部反映不出来的问题,在全局上很可能暴露出来,影响功能的实现。

 

确认测试(又称验收测试):目的是向未来的用户表明系统能够像预定要求那样工作。经集成测试后,已经按照设计把所有的模块组装成一个完整的软件系统,接口错误也已经基本排除了,接着就应该进一步验证软件的有效性,这就是确认测试的任务,即软件的功能和性能如同用户所合理期待的那样。

 

14、黑盒、白盒测试方法

**黑盒测试也称功能测试,它是通过测试来检测每个功能是否都能正常使用。在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。

 

**黑盒测试方法:

 

等价划分:等价类划分的办法是把程序的输入域划分成若干部分(子集),然后从每个部分中选取少数代表性数据作为测试用例。每一类的代表性数据在测试中的作用等价于这一类中的其他值。该方法是一种重要的,常用的黑盒测试用例设计方法。

 

边界值划分: 经验表明,处理边界的情况程序最容易发生错误。边界值分析法不仅重视输入条件边界,而且也必须考虑输出域边界。它是对等价类划分方法的补充。

 

错误推测法:在测试程序时,人们可以根据经验或直觉推测程序中可能存在的各种错误,从而有针对性地编写检查这些错误的测试用例的方法。输入数据和输出数据为0的情况。输入表格为空格或输入表格只有一行. 这些都是容易发生错误的情况。可选择这些情况下的例子作为测试用例.

 

**白盒测试:白盒测试也称结构测试或逻辑驱动测试,它是按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。 这一方法是把测试对象看作一个打开的盒子,测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例,对程序所有逻辑路径进行测试,通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。

 

**白盒测试方法:

逻辑覆盖:以程序内部的逻辑结构为基础的设计测试用例的技术。又分为: 语句覆盖,判定覆盖,条件覆盖, 条件判定覆盖,条件组合覆盖,点覆盖,边覆盖,路径覆盖。

语句覆盖:找一个用例,使每一个句子都会执行。

判断覆盖: 让每个判断都执行一次。比如大于某个数要执行,小于某个数也要执行。后面几个就深化的时候再分析吧。

控制结构测试:就是根据程序的控制结构设计测试数据的一种技术。

基本路径测试:计算程序的环形复杂度,以此复杂度为指南定义执行路径的集合,从该基本的集合到处的测试用例保证程序中的每条语句至少执行一次。

条件测试:用条件测试技术所设计出的测试用例,能够检查程序模块中包含的逻辑条件。

循环测试:循环测试是一种专注于测试循环结构的有效性的技术。

15、软件测试的步骤

大型软件的测试过程基本上由以下几个步骤组成:

1**模块测试:每一个模块完成一个清晰的子功能,这是为了确保每一个模块作为一个单元能正确运行测试的是编码和详细设计的错误

2**子系统测试:把经过单元测试的模块放在一起形成一个子系统来测试。

3**系统测试:经过测试的子系统装配成一个完整的系统来测试。子系统测试和系统测试都有检测和组装的两层含义,所以都称为集成测试。

4**验收测试:是将软件系统作为单一的实体进行测试,测试过程要在用户积极地参与。并且会使用实际数据,看是否满足客户需求。

5**平行运行:将新软件和即将要被取代的旧软件一起运行,这样的好处当然很多

16、调试

调试是作为成功测试的后果出现,调试就是测试发现错误之后排除错误的过程。

调试过程从执行一个测试用例开始,评估测试结果,如果发现实际结果与预期结果不一致,则这样不一致就是一个症状,它表明在软件中存在着隐藏的问题,调试过程就是试图找出症状的原因,以便于改正错误。

调试途径:蛮干法(到处打write)、回溯法、原因排除法。

 

(五)面向对象方法基础

17、面向对象的主要概念

这一部分关于一些名词概念

**对象:在应用领域中有意义的,与所要解决的问题有关系的任何事物都可以作为对象,它既可以是具体的物理实体的抽象,也可以是人为概念,或者是任何有明确边界和意义的东西

**类:就是对具有相同数据和相同操作的一组相似对象的定义。

**实例:实例就是由某个特定的类所描述的一个具体的对象

**消息:就是要求某个对象执行在定义它的那个类中所定义的某个操作的规格的说明。就是某个对象调用某个方法的,那一句话就是一个消息

**方法:就是对象所能执行的操作,也就是类中所定义的服务

**属性:就是累中所定义的数据,它是对客观世界实体所具有的性质的抽象。

**封装:把数据和实现操作的代码集中起来放在对象的内部。使用一个对象的时候,只需要知道它向外界提供的接口形式,无须知道它的数据结构和实现操作的算法。

**继承:广义上说:继承是指能够直接获得已有的性质和特征。面向对象的思维中:继承是指子类自动地共享基类中定义的数据和方法的机制。

**多态性:子类对象可以像父类对象那样使用,同样的消息即可以发送给父类对象也可以发送给子类对象。在类的不同层次中可以共享一共公用的行为或者方法的名字,然后在不同层次中的每个类却可以按照自己的需要来实现这个行为。

**重载:函数重载是指同一个作用域内的若干个参数特征不同的函数可以使用相同的函数名称。

 

18、面向对象建模基础知识

**为了更好的理解一个问题,往往会建立问题模型,所谓模型:就是为了事物而对事物作出的一种抽象,是对事物的一种无歧义的书面描述。模型通常是由一组图示符号和组织这些符号的规则组成,利用它们来定义和描述问题域中的术语和概念。

**要建立三种形式的模型:描述系统数据结构的对象模型,描述系统控制结构的动态模型和描述系统功能的功能模型。形象地说,功能模型定义“做什么”,状态模型定义“何时做”,对象模型定义“对谁做”。

**任何情况下,都是对象模型是最基本、核心、重要的。

 

19、面向对象软件过程,感觉在书上与20重复

(六)面向对象分析、设计

20、面向对象分析和设计模型建模(这一段是非常长的,书上讲了一个例子。我只能抽象的概括一些要点)

****面向对象分析:就是抽取和整理用户需求并建立问题域精确模型的过程。

****面对对象建模:建立三个,表示静态结构的对象模型,表示交互结构的动态模型,表示数据变换的功能模型。

 

****复杂的大型系统的对象模型通常有5个层次组成:

 

主题层、通过主题层将大型复杂的对象模型分阶层几个不同的概念,帮助理解。

类与对象层、

结构层(类与对象的关系)、

属性层、

服务层。(从描述来可以推断成就是方法、函数、操作,能做什么)

 

本课的例子是从一个需求文档出发,

然后着手建立对象模型,首先确定类和对象,再确定关联、划分主题、确定属性、识别继承关系。这样对象模型就算建立完成了

 

之后开始建立动态模型,首先编写脚本(系统在某一执行期间内出现的一系列事件,附图),设想用户界面,根据脚本画顺序图,画状态图,各个状态图通过共享事件合起来就形成了动态模型。意思就是最后得到的是几张图,这几张图合起来才是动态模型。



 

 

再建立功能模型(表明系统中数据之间的依赖关系,它由一组数据流图组成),先画出基本的,再画出功能级数据流图(将基本的单一的处理框分解为若干个,以描述的更为准确),再对每一个处理框的功能进行描述。

 

最后是定义服务(行为、方法、操作、函数),首先是常规行为(就是将属性定义为私有的,然后用get、set方法),从事件分析得出操作,从数据流图中的处理框对应得到相应的操作,减少多余的操作。

 

以上就是分析的整个流程。是抽象出来了关键的几个点,具体的实例恐怕只要看教材,注意每一步都是要多次检查、反复迭代的。

 

21、面向对象设计原则:模块化、抽象、信息隐藏、弱耦合、强内聚、可重用。这个几个词都是在11中讲过了,而且也比较容易理解,所以不多解释了。

 

22、面向对象设计优化

首先要确定优先级,也就是说这套软件到底什么最重要,是效率,还是清晰,还要考虑到费用。

其次有提高效率的几项技术

增加多余关联可以提高访问效率:比如一个公司查询有哪些人会日语,那么就在雇员类增加额外属性:会不会外语。这样查询的时候就只查会外语的人

调整查询次序:具体情况具体分析

保留派生属性:意思就是有一个结果运行了很久才得到,我们就把这个结果保留好,然后以后再做一模一样的事的时候直接取结果。当然如果过程改了,结果要注意改再有就是调整继承关系:包括,做一个祖先类 ,为提高继承程序而修改类的定义,利用委托机制(c++里面的)都是 要具体情况具体分析。

 

(七)统一建模语言

23、UML结构及概念

结构图请看图

 

 

UML统一建模语言的概念:统一建模语言UML是国际对象管理组织OMG批准的基于面向对象技术的标准建模语言。通常用UML的类图来建立对象模型,使用UML的状态图来建立动态模型,使用数据流图或者UML的用例图来建立功能模型。在UML中把用用例图建立起来的系统模型叫做用例模型。

 

24、UML表示符号(这个不同的图符号也许不同,所以请看下一节)

 

25、UML用例图、类图(书217页)、顺序图、状态图(书65页)

 

先看类图:

类图(Class diagram)是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。

 

定义一个类用一个长方形的符号表示,分为三个部分。分别是类名、属性、服务。

 

属性名的定义方法:

 可见性 属性名:类型名=初值{性质串}

可见性用+表示public,用-表示private,用#表示protected。

类型名是数据类型

{}可以表明约束条件,也可以能是枚举类的枚举值。

 

而服务里面就是的语法规格

可见性 操作名(参数表):返回值类型{性质串}

 

类图的表示关系的符号:这里是粗略总结,请看219页就例子。(也可以用下面的网页再复习复习)

**接口:使用两层矩形框表示,与类图的区别主要是顶端有<<interface>>显示 。 

第一行是接口名称。 

第二行是接口方法。 

 

** 继承类(泛化)(extends) :用空心三角形+实线来表示。 

 

** 实现接口(implements) :用空心三角形+虚线来表示 

 

** 关联(Association) :用实线连起来,上面用黑色箭头表明含义,例如:燕子与气候。关联的直线两端还可以写出重数,表示该类的多少个对象与对方的一个对象

 

连接.

若0··1  表示 0到1个对象

若0··*或* 表示0到多个对象

若1+或1··* 表示 1到多个对象

若1··15 表示 1到15个对象

若3 表示3个对象

 

** 聚合(Aggregation) :用空心的菱形+实线箭头来表示 

聚合:表示一种弱的‘拥有’关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分,例如:公司和员工

 

组合(Composition):用实心的菱形+实线箭头来表示 

组合:部分和整体的关系,并且生命周期是相同的。例如:人与手 

 

** 依赖(Dependency) :用虚线实心箭头来表示,例如:动物与氧气 

 

**细化:用虚线空心箭头表示,表示某个类比另一个类更加的抽象,有着更为详细的描述,两个类是细化关系。

 

 

再看状态图:

状态转换图(简称为状态图)通过描绘系统的状态及引起系统状态转换的时间,来表示系统的行为。此外,状态图还指明了作为特定时间的结果系统将做哪些动作(例如,处理数据)。

 

在状态图中定义的状态主要有:初态(即初始状态)、终态(即最终状态)和中间状态。在一张状态图中只能有一个初态,而终态则可以有0至多个。

 

在状态图中,初态用实心圆表示,终态用一对同心圆(内圆为实心圆)表示。

 

中间状态用圆角矩形表示可以用两条水平横线把它分成上、中、下3个部分。上面部分为状态的名称,这部分是必须有的;中间部分为状态变量的名字和值,这部分是可选的;下面部分是活动表,这部分也是可选的。

   活动表的语法格式如下:

     事件名(参数表)/动作表达式

   其中,“事件名”可以是任何事件的名称。在活动表中经常使用下述3种标准事件:entry,exit和do。entry事件指定进入该状态的动作,exit事件指定退出该状态的动作,而do事件则指定在该状态下的动作。

 

状态图中两个状态之间带箭头的连线称为状态转换,箭头指明了转换方向。状态变迁通常是由事件触发的,在这种情况下应在表示状态转换的箭头线上标出触发转换的事件表达式



 

 

 

 

用例图:

 

一幅用例图包含的模型元素有系统、行为者、用例及用例之间的关系。

下图是自动售货机系统的用例图。图中的方框代表系统,椭圆代表用例(售货、供货和取货款系统是自动售货机系统的典型用例),线条人代表行为者,它们之间的连线表示关系。

 

系统被看作是一个提供用例的黑盒子,内部如何工作、用例如何实现,这些对于建立用例模型来说都是不重要的。

 

一个用例是可以被行为者感受到的、系统的一个完整的功能。在UML中把用例定义成系统完成的一系列动作,动作的结果能被特定的行为者察觉到。

 

行为者是指与系统交互的人或其他系统,它代表外部实体。使用用例并且与系统交互的任何人或物都是行为者。

 

用例之间的关系:

***扩展关系:向一个用例中添加一些动作后构成了另一个用例,这两个用例之间的关系就是扩展关系,后者继承前者的一些行为,通常把后者称为扩展用例。

***使用关系:当一个用例使用另一个用例时,这两个用例之间就构成了使用关系。一般说来,如果在若干个用例中有某些相同的动作,则可以把这些相同的动作提取出来单独构成一个用例(称为抽象用例)。

请看例图

 


 

 

再看顺序图:在顺序图中,一个竖线代表一个对象,每个事件用一条水平的箭头线来表示,箭头线方向从事件的发送对象指向接受对象。时间从上往下。下面是一个顺序图的例子,很容易理解。



 

 

(八)软件项目管理

26、软件项目管理的基本概念:软件项目管理的对象是软件工程项目。它所涉及的范围覆盖了整个软件工程过程。 为使软件项目开发获得成功,关键问题是必须对软件项目的工作范围、可能风险、需要资源(人、硬件/软件)、要实现的任务、经历的里程碑、花费工作量(成本)、进度安排等做到心中有数。 这种管理在技术工作开始之前就应开始,在软件从概念到实现的过程中继续进行,当软件工程过程最后结束时才终止

 

27、项目计划和跟踪:这一点不知道怎么学,书中的内容太多,怕学了无用的,就放一放

 

28、进度安排(主要是甘特图和工程网络)

甘特图就是画的一个图,是一种制定进度计划的工具。有一个例子可以很好的说明

 

 

假设有一座陈旧的矩形木板房需要重新油漆。这项工作必须分3步完成: 首先刮掉旧漆,然后刷上新漆,最后清除溅在窗户上的油漆。假设一共分配了15名工人去完成

 

这项工作,然而工具却很有限: 只有5把刮旧漆用的刮板,5把刷漆用的刷子,5把清除溅在窗户上的油漆用的小刮刀。怎样安排才能使工作进行得更有效呢?

 

首先由5名工人用刮板刮掉第1面墙上的旧漆(这时其余10名工人休息),当第1面墙刮净后,另外5名工人立即用刷子给这面墙刷新漆(与此同时拿刮板的5名工人转去刮第2

 

面墙上的旧漆),一旦刮旧漆的工人转到第3面墙而且刷新漆的工人转到第2面墙以后,余下的5名工人立即拿起刮刀去清除溅在第1面墙窗户上的油漆,……。这样安排每

 

个工人都有活干,因此能够在较短的时间内完成任务。

 

Gantt图描绘上述流水作业过程: 在时间为零时开始刮第1面墙上的旧漆,两小时后刮旧漆的工人转去刮第2面墙,同时另5名工人开始给第1面墙刷新漆,每当给一面墙

 

刷完新漆之后,第3组的5名工人立即清除溅在这面墙窗户上的漆。从图13.1可以看出12小时后刮完所有旧漆,20小时后完成所有墙壁的刷漆工作,再过2小时后清理工作结束。

 

 

工程网络

工程网络是制定进度计划时另一种常用的图形工具,它同样能描绘任务分解情况以及每项作业的开始时间和结束时间,此外,它还显式地描绘各个作业彼此间的依赖关系。因此,工程网络是系统分析和系统设计的强有力的工具。

图1

 

 

在图13.2中还有一些虚线箭头,它们表示虚拟作业,也就是事实上并不存在的作业。引入虚拟作业是为了显式地表示作业之间的依赖关系。例如,事件4既是给第1面墙刷新漆结束,又是给第2面墙刷新漆开始(作业4—6)。但是,在开始给第2面墙刷新漆之前,不仅必须已经给第1面墙刷完了新漆,而且第2面墙上的旧漆也必须已经刮净(事件3)。也就是说,在事件3和事件4之间有依赖关系,或者说在作业2—3(刮第2面墙上旧漆)和作业4—6(给第2面墙刷新漆)之间有依赖关系,虚拟作业3—4明确地表示了这种依赖关系。注意,虚拟作业既不消耗资源也不需要时间。

 

 

接着要求计算事件的最早时刻和最晚时刻:

首先,把每个作业估计需要使用的时间写在表示该项作业的箭头上方。注意,箭头长度和它代表的作业持续时间没有关系,箭头仅表示依赖关系,它上方的数字才表示作业的持续时间。

 

其次,为每个事件计算下述两个统计数字: 最早时刻EET和最迟时刻LET。这两个数字将分别写在表示事件的圆圈的右上角和右下角,如图13.3左下角的符号所示。

 

 

事件的最早时刻是该事件可以发生的最早时间。通常工程网络中第一个事件的最早时刻定义为零,其他事件的最早时刻在工程网络上从左至右按事件发生顺序计算。

 

求出机动时间:

一个作业可以有的全部机动时间等于它的结束事件的最迟时刻减去它的开始事件的最早时刻,再减去这个作业的持续时间:机动时间=(LET)结束-(EET)开始-持续时间



 

 

最后找出关键路径,也就是机动时间为0的。请看图13.3,已经标出。

 

29、风险管理:书上没有,以后补充吧

 

30、配置管理:这一段如果在实践中体验的话,将会非常有效果。所以这里暂时只是给出基本的意思

 

软件配置管理是在软件的整个生命期内管理变化的一组活动。具体地说,这组活动用来: 

①标识变化;

②控制变化;

③确保适当地实现了变化;

④向需要知道这类信息的人报告变化。

软件配置管理的目标是,使变化更正确且更容易被适应,在必须变化时减少所需花费的工作量。

我觉得先了解以上几点可以了,最多一道选择题。而且这个内容非常抽象的。如果不够,再查书328页。

 

本次博客写了1天,主要是总结一些基本知识点,可能不太深刻。但是这次复试的考试大纲我已总结完,至少对于知识点能说不太清楚,但是不能说不知道,或者没听说过。这是目标。

 

最后,在编写此次博客的过程中无意发现了一个网站(我不能判断是否是非法使用,如果是被认定非法使用的话,请通知我,我会删掉):

http://wlzy.aynu.edu.cn/jsj/wlkc/rjgc1,2,3/3/10.4.htm 只要更改最后的10.4为相应的章节,即可得的与书一模一样的原文。

http://wlzy.aynu.edu.cn/如果这样就可以得到一个安阳师范学院的网络教学资源,感觉还是蛮好的,很多资料可以看。

我从主页一下(百度输入安阳师范学院,进入主页后,点击下面网络教学资源)就进去了。肯定不是非法的吧。

 

后来发现原来每个大学都有,我晕。我本科学校建设的用都用不了,中传媒都可以用,但是太复杂了。

 

  • 大小: 22.1 KB
  • 大小: 20.5 KB
  • 大小: 23.6 KB
  • 大小: 4.6 KB
  • 大小: 11.4 KB
  • 大小: 55.4 KB
  • 大小: 50.5 KB
  • 大小: 58.8 KB
  • 大小: 61.5 KB
  • 大小: 49 KB
  • 大小: 38.6 KB
  • 大小: 9.9 KB
  • 大小: 44.4 KB
  • 大小: 33.5 KB
  • 大小: 33.5 KB
  • 大小: 51 KB
  • 大小: 48.9 KB
  • 大小: 41.3 KB
  • 大小: 41.3 KB
  • 大小: 71.2 KB
  • 大小: 42 KB
  • 大小: 53.3 KB
  • 大小: 52.6 KB
  • 大小: 10.2 KB
  • 大小: 29.6 KB
  • 大小: 12.4 KB
  • 大小: 22.4 KB
  • 大小: 14 KB
  • 大小: 17.6 KB
  • 大小: 23 KB
  • 大小: 32.9 KB
  • 大小: 9.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics