软件工程
概论
软件危机
计算机软件的开发和维护过程中所遇到的一系列严重问题,软件的发展速度远远滞后于硬件的发展速度,不能满足社会日益增长的软件需求,软件开发效率低(开发周期长)、成本高、质量差、维护困难
软件过程
软件工程以质量为中心,软件过程、方法和工具为三要素,其基础是软件过程(Software Process)
瀑布模型
各阶段按顺序执行,每个阶段都必须完成规定文档,每个阶段结束时有一个验证(评审)环节,只有通过验证,才能进入下一个阶段
软件设计
软件体系架构
- 五种架构风格
- 数据中心架构
- 数据流架构
- 调用返回架构
- 面向对象架构
- 层次架构
- B/S和C/S架构
- C/S架构
服务器/客户机架构,由服务器客户机和网络三部分组成
两层C/S架构有 1.瘦客户机模型 2.胖客户机模型
两层C/S架构开发成本高、软件维护迭代移植困难、用户界面不一使用繁杂、开发成本高
三层C/S架构为了解决以上问题,增加了应用服务器,应用逻辑在服务器上,表示层在客户机上,分为表示层、逻辑层、数据层三个部分。 - B/S架构
B/S体系结构用通用浏览器就实现了原来需要复杂的专用软件才能实现的强大功能
缺点是:1.B/S体系功能缺少 2.响应速度慢 3.动态特性不强 优点是:1.系统安装、修改和维护全在服务器端解决 2.统一服务的最现实的开放性基础
界面设计三原则
- 用户控制系统(以用户为中心)
- 减少用户学习记忆负担
- 保持界面操作一致性
界面设计从用户分析开始
- 用户特点分析
- 用户任务分析
- 应用场景分析
流程图
基本语句控制结构
程序流程图的缺点:
- 本质上来说不是逐步求精的好工具,它容易使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构。
- 程序员可以不顾结构程序设计的精神,随意转移控制,而使程序结构过于混乱
- 表示数据结构方面存在不足
伪代码
伪代码是一种介于自然语言和形式化语言之间的半形式化语言
NS图(盒图)
五种构件
PAD图
由程序流程图演化来的,用结构化程序设计思想表现程序逻辑结构的图形工具
五种基本控制结构
示例
生产率和工作度量
基于功能点(FP)
间接测量,每人月功能点数量,也包括每功能点错误数、缺陷数、文档页数
基于代码行数(LOC)
直接测量,基于代码行数的度量,生产率是每人月代码行数,也包括每千行代码错误数、缺陷数、文档页数
二者优缺点
- 基于LOC
- 容易计算
- 有大量相关参考文件
- 是现有软件估算模型的重要参数 缺点
- 依赖于使用的语言
- 不太适用于非过程化语言
- 只有在设计完成时可以计算
- 基于FP
- FP只与需求有关
- 与实现语言无关
缺点: - 主观因素无法排除
- 只适用于数据处理问题,不适用于非数据处理问题
- 不能靠工具自动完成
成本估算方法之一————COCOMO模型
软件测试
测试基本原则:
- 穷尽测试是不可能的
- 测试无法完全显示潜伏的软件缺陷
- 尽早进行测试
成本指数增长 - 软件缺陷具有群聚性
大多数缺陷由程序中少数模块造成 - 注意杀虫剂现象
同一批测试用例用的越多,找到缺陷的概率越小,要不断编写测试用例测试。 - 应尽量由独立测试团队测试
测试目标
- 便于及早发现软件和系统的异常
- 及早进行性能评估
- 为管理者提供真实的信息,决定当下状态发布产品可行性
- 确认系统满足预期需求
- 确认解决了所需解决的问题
- 测试用例应该尽可能发现错误而不是表明程序是正确的
测试用例
测试用例目的在于尽可能发现错误,而非着眼于表明程序是正确的,一个好的测试用例在于能发现至今未发现的错误,一个成功的测试是发现了至今未发现的错误的测试。
测试与质量保证
软件测试人员目标
尽早找出软件缺陷并确保缺陷得到修复
软件测试保证人员职责
创建和执行改进软件开发过程并防止软件缺陷发生的标准和方法
软件测试的评估标准
下面是常见的几个准则:
覆盖率
百分百覆盖率是不现实的,可以用自动化测试工具
故障插入
变异分值
黑盒测试
指忽略系统或组件的内部机制(把测试对象看做一个黑盒子),仅关注于那些响应所选择的输入及相应执行条件的输出的测试形式,也称为功能性测试(Functional Testing)
三个基本的黑盒测试方法:
- 等价类划分方法 等价类划分方法即把所有可能的输入(被测程序的输入域)划分成若干互不相交的部分(子集),然后从 每一个部分中选取少数具有代表性的数据(通常是1个)作为测试用例
- 边界值分析法
边界值分析就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充,这种情况下,其测试用例来自等价类的边界 - 状态测试
白盒测试
指考虑系统或组件的内部机制的测试形式,也称为结构性测试(Structural Testing)
基于逻辑结构的测试
- 语句覆盖:每条可执行语句都要走一次
- 分支覆盖:每个逻辑判断的真和假分支都要走一次
- 条件覆盖:每个判断条件中的每个取值都要执行一次
满足条件覆盖不一定满足分支覆盖 - 条件组合覆盖:每个判断的所有可能条件取值组合执行一次
满足条件组合覆盖就满足分支覆盖和条件覆盖准则,但可能有路径漏掉 - 路径覆盖
覆盖程序中所有可能的路径
基于控制流图的测试
画出程序的控制流图(一种退化的程序流程图)
基本组件:
基本路径测试
-
计算环形复杂度
环形复杂度就是区域数 V(G) = e-n+2 = P+1 e是边数目,n是节点数目 -
确定线性独立路径基本集合
-
为基本集合中每条路径生成测试用例
灰盒测试
不仅关注输出、输入的正确性,同时也关注程序内部的情况。灰盒测试不像白盒测试那样详细、完整,但又比黑盒测试更关注程序的内部逻辑,常常是通过一些的现象、事件、标志来判断内部的运行状态。
穷举
黑盒测试穷举:把所有可能的输入数据的各种可能值排列组合测试,实际上不可能
白盒测试穷举:代码每条路径执行一次,实际上不可能
穷举不可行,所以要精心设计用例,达到最佳测试效果,高效地把隐藏的错误尽可能暴露出来
软件测试策略
改进V模型
改进的V模型:将测试的设计活动提前,对应于相应的开发活动,在某一开发阶段完成之后就进行相应的测试设计。一旦有文档提供,就可以开始测试计划,确定测试条件和编写测试用例等。
四个级别测试
- 单元测试:主要目的是验证软件模块是否按详细设计的规格说明正确运行
主要采用白盒测试方法设计测试用例,但也要先进行黑盒测试
单元测试五个方面内容:
1.对模块接口测试 2.对局部数据结构测试 3.对边界条件的测试 4.对所有独立路径覆盖 5.对出错路径测试
单元测试的主要依据是详细设计,而不是针对代码的测试。因为未测代码可能包含错误和缺陷,如果依照其测试,则可能无法发现一些错误
- 驱动模块
用来被调用的模块,使得被测模块得以执行,测试用例是在驱动模块中实现的 - 桩模块
用以替代被测模块所调用的那些模块。桩模块的接口与其替代的模块完全一致,但其功能非常简单,且不包含错误。作用是缺陷隔离,模拟被调用模块难以出现情况降低测试成本。
- 集成测试:主要目的是查询多个模块间是否按照要求协同
主要灰盒测试
三种集成测试方法: 1.自顶向下的集成方法:从顶层模块(主控模块)开始,沿着软件的控制层次向下移动,逐渐把各个模块结合起来,广度优先或深度优先的进行结合,优点是可以可以较早验证主程序功能,缺陷隔离好,验证主要控制和判断点。缺点是桩开发量大。 2.自底向上的集成方法:从最底层模块开始按照接口依赖关系逐层向上集成进行测试,不需要桩模块但要为每个模块编写驱动模块。优点是不需要桩模块,缺点是缺陷隔离和定位不如自顶向下,都要编写驱动模块。 3.Smoke方法 - 系统测试:主要目的是验证整个系统是否满足需求说明
主要工作是将完成了集成测试的软件放在真实的运行环境下进行测试,用于功能确认和验证
使用黑盒测试方法
测试的主要内容:
功能性测试、性能测试、压力测试、恢复测试、安全测试等 - 验收测试:以用户角度检查是否满足定义的需求
进行以上三种测试后所进行的测试
主要形式有:
- 根据合同验收形式
- 用户验收测试
- 现场测试
阿尔法测试:
开发员在现场,在开发者指导下用户进行软件测试,开发者记录问题,也可以是在组织内部用户测试
贝塔测试:
贝塔测试开发人员不在现场,是开发者不能控制的真实环境下进行的测试
回归测试
有选择地重新测试系统或其组件,以验证对软件的修改没有导致不希望出现的影响,以及系统或组件仍然符合其指定的需求,回归测试可以在所有的测试级别执行,并应用于功能和非功能测试中,尽量采用自动化测试
软件维护
软件维护是指由于软件产品出现问题或需要改进而对代码及相关文档的修改,其目的是对现有软件产品进行修改的同时保持其完整性。
四类软件维护
- 纠错性维护
- 适应性维护
- 完善性维护
- 预防性维护
维护初期纠错性维护工作量较大,随着错误发现率逐渐降低并趋于稳定,适应性维护和完善性维护工作量逐步增加。完善性维护占了一半工作量。
软件维护必要性
改正错误、改善设计、软件改进、实现与其他系统交互、完成遗留程序移植
软件维护的困难
配置管理工作不到位(文档没更新)、人员变动问题、维护人员不是编码人员、往往任务紧急时间紧
可维护性
通过一定手段,使得软件可以被维护改正修正以满足需求的方便程度
决定可维护的主要因素包括 可理解性、可测试性、可修改性、可移植性、可重用性,环境因素包括软件文档、运行环境、维护组织和质量
综上,提高软件可维护性必须从软件自身因素和软件维护环境两方面改善。
维护工作量估算模型
M=P+K·exp(c-d)
M是总工作量、P是生产性工作量、K是经验常数、C是软件复杂程度、D是维护人员熟悉程度
软件再工程
软件再工程(Re-engineering)指对现有软件进行仔细审查和改造,对其进行重新构造,使之成为一个新的形式,同时包括随之产生的对新形式的实现。
过程模型:
库存目录分析->文档重构->逆向工程->代码重构->数据重构->正向工程
逆向工程
软件逆向工程(Software Reverse Engineering)是分析目标系统,识别系统的构件及其交互关系,并且通过高层抽象或其他形式来展现目标系统的过程
逆向工程包括:数据、处理、用户界面的逆向工程三个方面
项目管理
项目管理四大要素
人员、产品、过程、项目
三种团队组织方式
- 民主分权制(DD):没有领导者,问题的解决依赖小组达成共识,团队人员之间横向通信。
- 有控制的分权制(CD):有领导,解决问题仍然是集体活动,横向沟通与垂直控制都存在
- 有控制的集中制(CC):领导者管理问题,垂直控制
虚拟团队
虚拟团队是跨越时间、空间和组织界限,运用通信技术加强连接的队伍
优势:提高生产力、扩大市场机遇、进行知识转移
劣势:沟通不足、领导不足、团队成员不称职
emm
策划一个项目之前,应当建立产品目标和范围、应当考虑其他解决方法、以及约束和管理
项目成本估算
两种方法:
分解技术和经验模型
软件范围
是定量估计项目计划的需要
项目计划
项目开始时随项目进展定期更新,提供准确成本和日程安排信息
P-CMM的五个级别
P-CMM(人力资源管理能力成熟度模型)
初始级、管理级、定义级、可预测级、优化级