第3章 软件工程基础
一、软件工程基本概念
1软件定义与软件特点
(1)软件的定义
计算机软件(Software)是计算机系统中与硬件相互依存的另一部分,是包括程序、数据及相关文档的完整集合。
(2)软件的组成
①机器可以执行的程序和数据;
②机器不可执行的,与软件开发、运行、维护、使用等有关的文档。
(3)软件的特点
①软件是一种逻辑实体,而不是物理实体,具有抽象性。
②软件的生产与硬件不同,它没有明显的制作过程。
③软件在运行、使用期间不存在磨损、老化问题。
④软件的开发、运行对计算机系统有很大依赖性,导致软件出现移植问题。
⑤软件复杂性高,成本昂贵。
⑥软件开发涉及诸多的社会因素。
(4)软件的分类
软件按照应用功能划分,可分为:
①应用软件
应用软件是为解决特定领域的应用而开发的软件。常用的应用软件:事务处理软件,工程与科学计算软件,实时处理软件,教务管理系统等。
②系统软件
系统软件是计算机管理自身资源,提高计算机使用效率并服务于其他程序的软件。常用的系统软件:操作系统,编译程序,汇编程序,网络软件,数据库管理系统等。
③支撑软件
支撑软件是介于系统软件和应用软件之间,协助用户开发软件的工具性软件,包括辅助和支持开发和维护应用软件的工具软件。常用的支撑软件:需求分析工具软件,设计工具软件,编码工具软件,测试工具软件等。
2软件危机与软件工程
(1)软件危机
①定义
软件危机泛指计算机软件的开发和维护过程中所遇到的一系列严重问题。
②主要表现
a.软件需求的增长得不到满足,用户对系统不满意的情况经常发生;
b.软件开发成本和进度无法控制,开发成本超出预算,开发周期大大超过规定日期的情况经常发生;
c.软件质量难以保证;
d.软件不可维护或维护程度非常低;
e.软件的成本不断提高;
f.软件开发生产率的提高赶不上硬件的发展和应用需求的增长。
③产生原因
a.对软件需求速度大大超过了技术进步带来的软件生产率的提高;
b.软件工程所面临的任务和其他工程之间的差异以及软件和其他工业产品的不同。
(2)软件工程
①定义
将系统化的、规范的、可度量的方法应用于软件的开发、运行和维护的过程。
②三要素
a.方法:完成软件工程项目的技术手段。
b.工具:支持软件的开发、管理、文档生成。
c.过程:支持软件开发的各个环节的控制、管理。
③核心
把软件产品当作工程产品来处理,把需求计划、可行性研究、工程审核、质量监督等工程化的概念引入到软件生产当中,以期达到工程项目的三个基本要素:进度、经费和质量的目标。
代表性的有结构化的方法、面向对象方法和软件开发模型及软件开发过程等。
3软件过程与软件生命周期
(1)软件过程
ISO 9000定义:软件过程是把输入转化为输出的一组彼此相关的资源和活动。
软件过程通常包含4种基本活动:
①P(Plan)——软件规格说明。
规定软件的功能及其运行时的限制。
②D(Do)——软件开发或软件设计与实现。
生产满足规格说明的软件。
③C(Cheek)——软件确认。
确认软件能够满足客户提出的要求。
④A(Action)——软件演进。
(2)软件生命周期
①定义
软件生命周期是指软件产品从提出、实现、使用维护到停止使用退役的过程。
②阶段
a.软件定义
软件定义阶段包括可行性研究初步项目计划和需求分析阶段。
主要任务:确定软件开发工作必须完成的目标,确定工程可行性。
b.软件开发
软件开发阶段包括总体设计、详细设计、编码与测试阶段。
主要任务:具体完成设计和实现定义阶段所定义的软件,总体设计和详细设计又称为系统设计,编码和测试又称为系统实现。
c.软件运行维护
软件运行维护阶段包括使用、维护和退役阶段。
主要任务:使软件在运行中持久地满足用户的需要,及时改正软件在使用中发生的错误,修改软件以适应不同的使用环境。
③各阶段的基本任务
a.可行性研究与计划制定
确定待开发软件系统的开发目标和总的要求,给出它的功能、性能、可靠性以及接口等方面的可能方案,制定完成开发任务的实施计划。
b.需求分析
对待开发软件提出的需求进行分析并给出详细定义。编写软件规格说明书及初步的用户手册,提交评审。
c.软件设计
系统设计人员和程序设计人员应该在反复理解软件需求的基础上,给出软件的结构、模块的划分、功能的分配以及处理流程。在系统比较复杂的情况下,设计阶段可分解成概要设计阶段和详细设计阶段。编写概要设计说明书、详细设计说明书和测试计划初稿,提交评审。
d.编码
编码是把软件设计转换成计算机可以接受的程序代码。即完成源程序的编码,编写用户手册、操作手册等面向用户的文档,编写单元测试计划。
e.软件测试
在设计测试用例的基础上,检验软件的各个组成部分。编写测试分析报告。
f.运行和维护
将已交付的软件投入运行,并在运行使用中不断地维护,根据新提出的需求进行必要而且可能的扩充和删改。
4软件工程的目标与原则
(1)软件工程的目标
①定义
软件工程的目标是,在给定成本、进度的前提下,开发出具有有效性、可靠性、可理解性、可维护性、可重用性、可适应性、可移植性、可追踪性和可互操作性且满足用户需求的产品。
②基本目标:
a.付出较低的开发成本;
b.达到要求的软件功能;
c.取得较好的软件性能;
d.开发的软件易于移植;
e.需要较低的维护费用;
f.能按时完成开发,及时交付使用。
③软件工程的理论和技术性研究的内容:
a.软件开发技术
软件开发技术包括:软件开发方法学、开发过程、开发工具和软件工程环境,其主体内容是软件开发方法学。
b.软件工程管理
软件工程管理包括:软件管理学、软件工程经济学、软件心理学等内容。
(2)软件工程的原则
软件工程的基本原则包括抽象、信息隐蔽、模块化、局部化、确定性、一致性、完备性和可验证性。
5软件开发工具与软件开发环境
(1)软件开发工具
程序设计语言、软件开发工具、软件开发方法。
(2)软件开发环境
软件开发环境或称软件工程环境是全面支持软件开发全过程的软件工具集合。
二、结构化分析方法
1需求分析与需求分析方法
(1)需求分析
软件需求是指用户对目标软件系统在功能、行为、性能、设计约束等方面的期望。
任务是发现需求、求精、建模和定义需求的过程。
①需求的定义
a.用户解决问题或达到目标所需的条件或权能;
b.系统或系统部件要满足合同、标准、规范或其他正式规定文档所需具有的条件或权能;
c.一种反映a或b所描述的条件或权能的文档说明。
该定义从两方面阐述了需求的含义:
一是从用户角度所要求的系统应具有的功能,是系统的外部行为。
二是从系统开发者角度所要求的系统应具有的功能,是系统的内部特性。
②需求分析阶段的工作
a.需求获取
需求获取的目的是确定对目标系统的各方面需求。涉及的主要任务是建立获取用户需求的方法框架,并支持和监控需求获取的过程。
b.需求分析
对获取的需求进行分析和综合,最终给出系统的解决方案和目标系统的逻辑模型。
c.编写需求规格说明书
作为需求分析的阶段成果,可以为用户、分析人员和设计人员之间的交流提供方便,可以直接支持目标软件系统的确认,又可以作为控制软件开发进程的依据。
d.需求评审
对需求分析阶段的工作进行复审,验证需求文档的一致性、可行性、完整性和有效性。
(2)需求分析方法
①结构化分析方法
a.面向数据流的结构化分析方法;
b.面向数据结构的Jackson方法;
c.面向数据结构的结构化数据系统开发方法。
②面向对象的分析方法
从需求分析建立的模型的特性来分,需求分析方法又分为静态分析方法和动态分析方法。
2结构化分析方法
(1)关于结构化分析方法
①定义
结构化分析方法是结构化程序设计理论在软件需求分析阶段的运用。
②实质
着眼于数据流,自顶向下,逐层分解,建立系统的处理流程,以数据流图和数据字典为主要工具,建立系统的逻辑模型。
③结构化分析的步骤:
a.通过对用户的调查,以软件的需求为线索,获得当前系统的具体模型;
b.去掉具体模型中非本质因素,抽象出当前系统的逻辑模型;
c.根据计算机的特点分析当前系统与目标系统的差别,建立目标系统的逻辑模型;
d.完善目标系统并补充细节,写出目标系统的软件需求规格说明;
e.评审直到确认完全符合用户对软件的需求。
(2)结构化分析的常用工具
①数据流图
a.定义:数据流图是描述数据处理过程的工具,是需求理解的逻辑模型的图形表示,它直接支持系统的功能建模。
b.数据流图中的主要图形元素与说明
加工(转换)。输入数据经加工变换产生输出。
数据流。沿箭头方向传送数据的通道,一般在旁边标注数据流名。
存储文件(数据源)。表示处理过程中存放各种数据的文件。
数据的源点和终点。表示系统和环境的接口,属系统之外的实体。
c.建立数据流图的步骤:
第一,由外向里:先画系统的输入输出,然后画系统的内部;
第二,自顶向下:顺序完成顶层、中间层、底层数据流图;
第三,逐层分解。
d.数据流图的构造规则和注意事项
第一,对加工处理建立唯一、层次性的编号,且每个加工处理通常要求既有输入又有输出;
第二,数据存储之间不应该有数据流;
第三,数据流图的一致性。
第四,父图、子图关系与平衡规则。
相邻两层DFD之间具有父、子关系,子图代表了父图中某个加工的详细描述,父图表示了子图间的接口。
②数据字典
a.数据字典的作用
数据字典是结构化分析方法的核心,对所有与系统相关的数据元素的一个有组织的列表,以及精确的、严格的定义,使得用户和系统分析员对于输入、输出、存储成分和中间计算结果有共同的理解。
b.数据字典包含的内容
数据字典包含的信息有:名称、别名、何处使用/如何使用、内容描述、补充信息等。
③判定树
分清判定条件和判定结论,根据描述材料中的连接词找出判定条件之间的从属关系、并列关系、选择关系,根据它们构造判定树。
④判定表
判定表由以下四部分组成:
a.基本条件项:列出了各种可能的条件;
b.条件项:列出了各种可能的条件组合;
c.基本动作项:列出了所有的操作;
d.动作项:列出在对应的条件组合下所选的操作。
3软件需求规格说明书
软件需求规格说明(SRS)是描述需求中的重要文档,是软件需求分析的主要成果。
(1)软件需求规格说明书的作用
①便于用户、开发人员进行理解和交流;
②反映出用户问题的结构,可以作为软件开发工作的基础和依据;
③作为确认测试和验收的依据;
④为成本估算和编制计划进度提供基础;
⑤软件不断改进的基础。
(2)软件需求规格说明书的内容
①功能需求是软件需求规格说明,给出软件要执行什么功能的详尽描述;
②性能需求是指定量地描述软件系统应满足的具体性能需求,即各种软件功能的速度、响应时间、恢复时间;
③外部接口指软件如何与人、系统的硬件及其他硬件和其他软件进行交互;
④属性是指与软件有关的质量属性,如正确性、可用性、可靠性、安全性、可维护性等;
⑤约束条件包括影响软件实现的各种设计约束,如使用的标准、编程语言、数据库完整性方针、资源限制、运行环境等方面的要求。
(3)软件需求规格说明的特点
①正确性。体现待开发系统的真实要求。
②无歧义性。对每一个需求只有一种解释,其陈述具有唯一性。
③完整性。包括全部有意义的需求,功能的、性能的、设计的、约束的,属性或外部接口等方面的需求。
④可验证性。描述的每一个需求都是可以验证的,即存在有限代价的有效过程验证确认。
⑤一致性。各个需求的描述不矛盾。
⑥可理解性。需求说明必须简明易懂,尽量少包含计算机的概念和术语,以便用户和软件人员都能接受它。
⑦可修改性。SRS的结构风格在需求有必要改变时是易于实现的。
⑧可追踪性。每一个需求的来源、流向是清晰的,当产生和改变文件编制时,可以方便地引证每一个需求。
三、结构化设计方法
1软件设计的基本概念
(1)软件设计的基础
①软件设计的基本目标
用比较抽象概括的方式确定目标系统如何完成预定的任务,软件设计是确定系统的物理模型。
②软件设计的重要性和地位
a.软件开发阶段占据软件项目开发总成本绝大部分,是在软件开发中形成质量的关键环节;
b.软件设计是开发阶段最重要的步骤,是将需求准确地转化为完整的软件产品或系统的唯一途径;
c.软件设计作出的决策,最终影响软件实现的成败;
d.设计是软件工程和软件维护的基础。
③从技术观点来看,软件设计包括:
a.结构设计:定义软件系统各主要部件之间的关系;
b.数据设计:将分析时创建的模型转化为数据结构的定义;
c.接口设计:描述软件内部、软件和协作系统之间以及软件与人之间如何通信;
d.过程设计:把系统结构部件转换成软件的过程性描述。
④从工程管理角度来看,软件设计分两步完成:
a.概要设计(结构设计)
将软件需求转化为软件体系结构、确定系统级接口、全局数据结构或数据库模式。
b.详细设计
确立每个模块的实现算法和局部数据结构,用适当方法表示算法和数据结构的细节。
(2)软件设计的基本原理
①抽象
②逐步求精和模块化
③信息隐蔽和局部化
④模块独立性
a.耦合性
b.内聚性
(3)结构化设计方法
①含义
结构化设计是采用最佳的可能方法设计系统的各个组成部分以及各成分之间的内部联系的技术。
②基本思想
将软件设计成由相对独立、单一功能的模块组成的结构。
2概要设计
(1)概要设计的任务
①设计软件系统结构
划分具体过程:
a.采用某种设计方法,将一个复杂的系统按功能划分成模块;
b.确定每个模块的功能;
c.确定模块之间的调用关系;
d.确定模块之问的接口,即模块之间传递的信息;
e.评价模块结构的质量。
②数据结构及数据库设计
a.数据设计的具体任务:
第一,确定输入、输出文件的详细数据结构;
第二,结合算法设计,确定算法所必需的逻辑数据结构及其操作;
第三,确定对逻辑数据结构所必需的那些操作的程序模块,限制和确定各个数据设计决策的影响范围;
第四,需要与操作系统或调度程序接口所必需的控制表进行数据交换时,确定其详细的数据结构和使用规则;
第五,数据的保护性设计:防卫性、一致性、冗余性设计。
b.数据设计中应注意掌握的设计原则:
第一,用于功能和行为的系统分析原则也应用于数据;
第二,应该标识所有的数据结构以及其上的操作;
第三,应当建立数据字典,并用于数据设计和程序设计;
第四,低层的设计决策应该推迟到设计过程的后期;
第五,只有那些需要直接使用数据结构、内部数据的模块才能看到该数据的表示;
第六,应该开发一个由有用的数据结构和应用于其上的操作组成的库;
第七,软件设计和程序设计语言应该支持抽象数据类型的规格说明和实现。
③编写概要设计文档
在概要设计阶段,需要编写的文档有,概要设计说明书、数据库设计说明书、集成测试计划等。
④概要设计文档评审
a.在概要设计中,对设计部分是否完整实现需求中规定的功能、性能等要求,设计方案的可行性,关键的处理及内外部接口定义正确性,有效性,各部分之间一致性都要做评审。
b.常用的软件结构设计工具是结构图。
在结构图中,模块用矩形表示,矩形内注明模块的功能和名字,箭头表示模块之间调用关系,带实心圆的箭头表示传递的是控制信息,带空心圆的箭头表示传递的是数据。
c.常用的结构图有四种模块类型:传入模块、传出模块、变换模块和协调模块。
d.结构图中常用的术语:
深度:表示控制的层数。
上级模块、从属模块:上、下两层模块a和b,且有a调用b,则a是上级模块,b是从属模块。
宽度:整体控制跨度(最大模块数的层)的表示。
扇入:调用一个给定模块的模块个数。
扇出:一个模块直接调用的其他模块数。
原子模块:树中位于叶子结点的模块。
(2)面向数据流的结构化设计方法
①数据流类型
a.变换型
变换型是指信息沿输入通路进入系统,同时由外部形式变换成内部形式,进入系统的信息通过变换中心,经加工处理以后再沿输出通路变换成外部形式离开软件系统。
b.事务型
接收一项事务,根据事务处理的特点和性质,选择分派一个适当的处理单元(事务处理中心),然后给出结果。
②面向数据流设计方法的实施要点与设计过程
a.面向数据流的结构设计过程和步骤:
第一,分析、确认数据流图的类型,区分是事务型还是变换型。
第二,说明数据流的边界。
第三,把数据流图映射为程序结构。对于事务流区分事务中心和数据接收通路,将它映射成事务结构。对于变换流,区分输出和输入分支,并将其映射成变换结构。
第四,根据设计准则对产生的结构进行细化和求精。
b.变换型数据流图转换成程序结构图的实施步骤:
第一,确定数据流图是否具有变换特性。一般地说,一个系统中所有的信息流都可以认为是变换流,但是,当遇有明显的事务特性的信息流时,建议采用事务分析方法进行设计。在这时应该观察在整个数据流图中哪种属性占优势,先确定数据流的全局特性。此外还应把具有全局特性的不同特点的局部区域孤立出来,根据这些子数据流的特点作部分的处理。
第二,确定输入流和输出流的边界,划分出输入、变换和输出,独立出变换中心。
第三,进行第一级分解,将变换型映射成软件结构,其中输入数据处理模块协调对所有输入数据的接收;变换中心控制模块管理对内部形式的数据的所有操作;输出数据处理控制模块协调输出信息的产生过程。
第四,按上述步骤(如出现事务流也可按事务流的映射方式)对各个子流进行逐级分解,直至分解到基本功能。
第五,对每个模块写一个简要说明,内容包括该模块的接口描述、模块内部的信息、过程陈述、包括的主要判定点及任务等。
第六,利用软件结构的设计原则对软件结构进一步转化。
c.事务型数据流图转换成程序结构图的实施步骤
事务分析设计步骤与变换分析设计步骤大致类似,主要差别仅在于由数据图到软件结构的映射方法不同,它是将事务中心映射成为软件结构中发送分支的调度模块,将接收通路映射成软件结构的接收分支。
(3)设计的准则
①提高模块独立性;
②模块规模适中;
③深度、宽度、扇出和扇入适当;
好的软件设计结构通常顶层高扇出,中间扇出较少,底层高扇入;
④使模块的作用域在该模块的控制域内;
⑤应减少模块的接口和界面的复杂牲;
⑥设计成单入口、单出口的模块;
⑦设计功能可预测的模块。
3详细设计
(1)详细设计的任务
详细设计的任务,是为软件结构图中的每一个模块确定实现算法和局部数据结构,用某种选定的表达工具表示算法和数据结构的细节。
(2)常见的过程设计工具有:
①图形工具:程序流程图,N-S图,PAD图,HIPO图;
②表格工具:判定表;
③语言工具:PDL(伪码)。
(3)程序流程图(程序框图)
①程序流程图是一种传统的、应用广泛的软件过程设计表示工具,具有表达直观、清晰,易于学习掌握,且独立与任何一种程序设计语言的特点。
构成程序流程图的最基本图符及含义如图3-1所示。
图3-1 程序流程图的基本图符
②程序流程图的5种控制结构:
a.顺序型:几个连续的加工步骤依次排列构成;
b.选择型:由某个逻辑判断式的取值决定选择两个加工中的一个;
c.先判断重复型:先判断循环控制条件是否成立,成立则执行循环体语句;
d.后判断重复型:重复执行某些特定的加工,直到控制条件成立;
e.多分支选择型:列举多种加工情况,根据控制变量的取值,选择执行其中之一。
(4)N-S图
①N-S图的基本图符及表示的5种基本控制结构如图3-2所示。
图3-2 N-S图图符与构成的5种控制结构
②N-S图的特征:
a.每个构件具有明确的功能域;
b.控制转移必须遵守结构化设计要求;
c.易于确定局部数据和(或)全局数据的作用域;
d.易于表达嵌套关系和模块的层次结构。
(5)PAD图
①PAD图的基本图符及表示的5种基本控制结构如图3-3所示。
图3-3 PAD图图符与构成的5种控制结构
②PAD图有以下特征:
a.结构清晰,结构化程度高;
b.易于阅读;
c.最左端的纵线是程序主干线,对应程序的第一层结构;每增加一层PAD图向右扩展一条纵线,故程序的纵线数等于程序层次数;
d.程序执行:从PAD图最左主干线上端结点开始,自上而下、自左向右依次执行,程序终止于最左主干线。
(6)PDL(Procedure Design Language)
①过程设计语言(PDL)也称为结构化的英语和伪码,它是一种混合语言,采用英语的词汇和结构化程序设计语言的语法,类似编程语言。
②用PDL表示的基本控制结构的常用词汇如下:
条件:IF / THEN / ELSE / ENDIF
循环:DO WHILE / ENDDO
循环:REPEAT UNTIL / ENDREPEAT
分支:CASE-OF / WHEN / SELECT / WHEN / SELECT / ENDCASE
③PDL具备以下特征:
a.有为结构化构成元素、数据说明和模块化特征提供的关键词语法;
b.处理部分的描述采用自然语言语法;
c.可以说明简单和复杂的数据结构;
d.支持各种接口描述的子程序定义和调用技术。
四、软件测试
1软件测试的目的和定义
(1)软件测试的定义
①规定条件下运行系统或构件的过程:在此过程中观察和记录结果,并对系统或构件的某些方面给出评价。
②软件项目的过程:检测现有状况和所需状况的不同(即bug),并评估软件项目的特性。
(2)软件测试的目的
为了发现错误而执行程序的过程。一个好的测试用例是指很可能找到迄今为止尚未发现的错误的用例;一个成功的测试是发现了至今尚未发现的错误的测试。
【注意】软件测试的目的为常考点,一定要记住。
2软件测试的准则
(1)所有测试都应追溯到需求;
(2)严格执行测试计划,排除测试的随意性;
(3)充分注意测试中的群集现象;
(4)程序员应避免检查自己的程序;
(5)穷举测试不可能;
(6)妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护提供方便。
3软件测试方法与技术综述
对于软件测试方法和技术,可以从不同的角度加以分类。
①若从是否需要执行被测软件的角度,可以分为静态测试和动态测试方法。
②若按照功能划分可以分为白盒测试和黑盒测试方法。
(1)静态测试与动态测试
①静态测试
静态测试包括代码检查、静态结构分析、代码质量度量等。
a.代码检查
代码检查包括代码审查、代码走查、桌面检查、静态分析等具体方式。
②动态测试
动态测试是基于计算机的测试,是为了发现错误而执行程序的过程。根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误的过程。
(2)白盒测试方法与测试用例设计
①白盒测试方法也称结构测试或逻辑驱动测试。它是根据软件产品的内部工作过程,检查内部成分,以确认每种内部操作符合设计规格要求。
②白盒测试的基本原则:
a.保证所测模块中每一独立路径至少执行一次;
b.保证所测模块所有判断的每一分支至少执行一次;
c.保证所测模块每一循环都在边界条件和一般条件下至少各执行一次;
d.验证所有内部数据结构的有效性。
③白盒测试采用穷举路径测试,测试者必须检查程序内部结构,但即使每条路径都测试了仍可能有错误。
④白盒测试的主要方法有逻辑覆盖、基本路径测试等。
a.逻辑覆盖测试
逻辑覆盖是泛指一系列以程序内部的逻辑结构为基础的测试用例设计技术。通常所指的程序中的逻辑表示有判断、分支、条件等几种表示方式。
第一,语句覆盖
选择足够的测试用例,使得程序中每个语句至少都能被执行一次。
第二,路径覆盖
执行足够的测试用例,使程序中所有可能的路径都至少经历一次。
第三,判定覆盖
使设计的测试用例保证程序中每个判断的每个取值分支(T或F)至少经历一次。
第四,条件覆盖
设计的测试用例保证程序中每个判断的每个条件的可能取值至少执行一次。
第五,判断-条件覆盖
设计足够的测试用例,使判断中每个条件的所有可能取值至少执行一次同时每个判断的所有可能取值分支至少执行一次。
b.基本路径测试
基本路径测试的思想和步骤是,根据软件过程性描述中的控制流程确定程序的环路复杂性度量,用此度量定义基本路径集合,并由此导出一组测试用例对每一条独立执行路径进行测试。
(3)黑盒测试方法与测试用例设计
①黑盒测试方法也称功能测试或数据驱动测试。黑盒测试是对软件已经实现的功能是否满足需求进行测试和验证。黑盒测试是在软件接口处进行,完成功能验证。
②黑盒测试主要诊断:功能不对或遗漏、界面错误、数据结构或外部数据库访问错误、性能错误、初始化和终止条件错。
③黑盒测试方法主要有等价类划分法、边界值分析法、错误推测法、因果图等,主要用于软件确认测试。
a.等价类划分法
将程序的所有可能的输人数据划分成若干部分(即若干等价类),然后从每个等价类中选取数据作为测试用例。
第一,等价类分类
有效等价类:合理、有意义的输入数据构成的集合。可以检验程序中符合规定的功能、性能。
无效等价类:不合理、无意义的输入数据构成的集合。可以检验程序中不符合规定的功能、性能。
第二,等价类划分法实施步骤
先划分等价类,然后根据等价类选取相应的测试用例。
第三,划分等价类常用的几条原则:
Ⅰ.若输入条件规定了确切的取值范围,则可划分出一个有效等价类和两个无效等价类。
Ⅱ.若输入条件规定了输入值的集合(或有“必须如何”的条件),可确定一个有效等价类和一个无效等价类。
Ⅲ.若输入条件是一个布尔量,则可确定一个有效等价类和一个无效等价类。
Ⅳ.若输入数据是一组值,且程序要对每个值分别处理。可为每个输入值确定一个有效等价类和一个无效等价类。
Ⅴ.若规定了输入数据必须遵守一定规则,则可确定一个有效等价类和若干个无效等价类。
Ⅵ.若已划分的等价类中各元素在程序中处理方式不同,须将该等价类进一步划分(更小的等价类)。
b.边界值分析法
边界值分析法是对各种输入、输出范围的边界情况设计测试用例的方法。
边界值分析方法的使用要注意以下几点:
第一,如果输入条件规定了取值范围或数据个数,则可选择正好等于边界值、刚刚在边界范围内和刚刚超越边界外的值进行测试;
第二,针对规格说明的每个输入条件,使用上述原则;
第三,对于有序数列,选择第一个和最后一个作为测试数据。
c.错误推测法
第一,基本思想
列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例。错误推测法针对性强,可以直接切入可能的错误,直接定位,是一种非常实用、有效的方法。但是它需要丰富的经验和专业知识。
第二,实施步骤
对被测软件首先列出所有可能有的错误和易错情况表,然后基于该表设计测试用例。
4软件测试的策略
(1)定义
软件测试的策略是指在软件测试过程中对各种活动的组织和管理。
(2)步骤
软件测试过程一般按4个步骤进行,即单元测试、集成测试、验收测试(确认测试)和系统测试。
通过这些步骤的实施来验证软件是否合格,能否交付用户使用。
①单元测试
a.单元测试的目的是发现各模块内部可能存在的各种错误。
b.单元测试的依据是详细设计说明书和源程序。
c.单元测试的技术可以采用静态分析和动态测试。对动态测试通常以白盒动态测试为主,辅之以黑盒测试。
d.单元测试主要针对模块的下列5个基本特性进行:
第一,模块接口测试——测试通过模块的数据流。
第二,局部数据结构测试。
第三,重要的执行路径的检查。
第四,出错处理测试,检查模块的错误处理功能。
第五,影响以上各点及其他相关点的边界条件测试。
②集成测试
集成测试是测试和组装软件的过程。它是把模块在按照设计要求组装起来的同时进行测试。其主要目的是发现与接口有关的错误。集成测试的依据是概要设计说明书,涉及的内容包括软件单元的接口测试、全局数据结构测试、边界条件和非法输入的测试等。
集成测试时将模块组装成程序通常采用两种方式:
a.非增量方式(一次性组装方式)
将测试好的每一个软件单元一次组装在一起再进行整体测试。
b.增量方式
将已经测试好的模块逐步组装成较大系统,在组装过程中边连接边测试,以发现连接过程中产生的问题。最后通过增值,逐步组装到所要求的软件系统。
第一,自顶向下的增量方式;
第二,自底向上的增量方式;
第三,混合增量方式。
针对自顶向下、自底向上方法各自的优点和不足,人们提出了自顶向下和自底向上相结合、从两头向中间逼近的混合式组装方法,被形象称为“三明治”方法。这种方式结合考虑软件总体结构的良好设计原则,在程序结构的高层使用自顶向下方式,在程序结构的低层使用自底向上方式。
③确认测试
确认测试的任务是验证软件的功能和性能及其他特性是否满足了需求规格说明中确定的各种需求,以及软件配置是否完全、正确。
④系统测试
系统测试目的是在真实的系统工作环境下检验软件是否能与系统正确连接,发现软件与系统需求不一致的地方。
系统测试具体实施一般包括:功能测试、性能测试、操作测试、配置测试、外部接口测试、安全性测试等。
五、程序的调试
1基本概念
程序调试主要在开发阶段,其任务是诊断和改正程序中的错误。程序调试活动由两部分组成,其一是根据错误的迹象确定程序中错误的确切性质、原因和位置。其二,对程序进行修改,排除这个错误。
(1)程序调试的基本步骤
①错误定位
从错误的外部表现形式人手,研究有关部分的程序,确定程序中出错位置,找出错误的内在原因。确定错误位置占据了软件调试绝大部分的工作量。
②修改设计和代码,以排除错误
③进行回归测试,防止引进新的错误
(2)程序调试的原则
调试原则从以下两个方面考虑:
①确定错误的性质和位置时的注意事项
a.分析思考与错误征兆有关的信息。
b.避开死胡同
c.只把调试工具当做辅助手段来使用
d.避免用试探法,最多只能把它当做最后手段。
②修改错误的原则
a.在出现错误的地方,很可能还有别的错误
b.修改错误的一个常见失误是只修改了这个错误的征兆或这个错误的表现,而没有修改错误本身。
c.注意修正一个错误的同时有可能会引入新的错误。
d.修改错误的过程将迫使人们暂时回到程序设计阶段。
e.修改源代码程序,不要改变目标代码。
2软件调试方法
(1)强行排错法
主要方法有:
①通过内存全部打印来排错;
②在程序特定部位设置打印语句——断点法;
③自动调试工具。
(2)回溯法
(3)原因排除法
①演绎法;
②归纳法;
③二分法。