chap07 软件设计基础
1.信息隐藏、内聚度和耦合度(在七种级别里应该注意什么原则)的概念
1.信息隐藏
模块独立的概念
o 模块应该设计得使其所含信息(过程和数据)对于那些不需要这些信息的模块不可访问;
o 每个模块只完成一个相对独立的特定功能;
o 模块之间仅仅交换那些为完成系统功能必须交换的信息,即模块应该独立。
采用信息隐藏原理指导模块设计优点:
o 支持模块的并行开发
o 减少软件测试和软件维护的工作量。
2.内聚度
** 模块内部各成分彼此结合的紧密程度。**
内聚度按其高低程度可分为七级,内聚度越高越好。
低级内聚度
(1)偶然性内聚
** 模块内各成分为完成一组功能而组合在一起,它们相互之间即使有关系,也很松散。**
(2)逻辑性内聚
** 模块完成的诸任务逻辑上相关,如,一个模块产生所有与类型无关的输出****。**
(3)时间性内聚
** 模块包含的诸任务必须在同一时间段内执行,如一个初始化模块****。**
中级内聚度
(1)过程性内聚
** 模块具有过程性内聚度指,模块内成分彼此相关,并且必须按特定的次序执行;**
**(2)**通信性内聚
** 模块中各成份都将对数据结构的同一区域进行操作,以达到通信的目的。**
高级内聚度
(1)顺序性内聚
** 模块内的各处理成份均与同一功能相关,且这些处理必须顺序执行,则称顺序内聚。**
**(2)**功能性内聚
** 模块内所有成分形成一个整体,完成单个功能。**
设计软件时,应该能够识别内聚度的高低,并通过修改设计尽可能提高模块内聚度,从而获得较高的模块独立性.
3.耦合度
耦合度
** 软件结构中模块间关联程度的一种度量。**
o 耦合的强弱取决于模块间接口的复杂性、进入或调用模块的位置以及通过界面传送数据的多少等。
o 设计软件应追求尽可能松散耦合的系统。
o 松散耦合系统中,任一模块的设计、测试和维护都相对独立。
o 松散耦合系统模块间联系较少,错误在模块间传播的可能性随之变小。
o 模块间的耦合程度直接影响系统的可理解性、可测试性、可靠性和可维护性。
耦合度也分为七级:
**(1)非直接耦合:**两模块中任一个都不依赖对方能独立工作, 这类耦合度最低。
**(2)数据耦合:**两模块通过参数交换信息,信息仅限于数据。
**(3)控制耦合:传递的信息含有控制信息。**控制耦合通常会增加系统的复杂性,适当分解模块可望消除控制耦合。
**(4)特征耦合:**介于数据耦合与控制耦合之间
(5)外部耦合:当若干模块均与同一个外部环境关联,如,I/O处理使所有I/O****模块与特定的设备、格式和通信协议相关联。
** 外部耦合尽管需要,但应限制在少数几个模块上。**
**(6)公共耦合:**若干模块通过全局的数据环境相互作用, 全局数据环境中可能含有全局变量、公用区、内存公共复盖区、任何存储介质上的文件、物理设备等。
**(7)内容耦合:**一个模块使用另 一模块内部的数据或控制信息;一个模块直接转移到另一模块内部等等。
2.程序结构的相关术语(扇入、扇出、良好的程序结构)
o 软件的深度( Depth) 和宽度( Width) 分别说明控制的层数和跨度。
o 模块的"扇出率"( Fan---out) 指,该模块直接控制的其他模块数。
o 模块的"扇入率"( Fan---in) 指,能直接控制该模块的模块数。
o 良好的软件结构:顶层扇出较大,中间较小,底层则有较大扇入。
o 如果一个模块控制另一模块,称前者为"主控"模块,后者为"从属"模块。
o 软件结构的可见域和连通域。
** 模块的可见域指,该模块可直接或间接引用的一组模块;**
** 模块的连通域指,模块可直接引用的模块。**
o 软件的总体结构应该在考虑每个模块的细节前就确定下来。
o 软件设计方法鼓励人们首先致力于软件总体结构的设计,而后再进行详细设计。
o 每一种方法导出总体结构的具体方式不尽相同。
3.详细设计的任务是什么?工具有哪些?
o 程序结构仅考虑软件总体结构中模块之间的控制分层关系,而不关心模块内各处理元素和判断元素的顺序。
o 过程设计紧跟在数据结构设计和程序结构设计之后,基本任务是描述这方面的信息。
o 过程包括有关处理的精确说明,如事件的顺序、确切的判断位置、循环操作以及数据的组成等等。
o 程序结构与软件过程相互关联,程序结构中每个模块的所有从属模块必将被引用出现在该模块的过程说明中。
o 结构化程序设计
** 仅用"顺序"、"分枝"和"循环"三种基本的控制构件即能构造任何单入口单出口程序,这个结论奠定了结构程序设计的理论基础。**
o 结构化程序设计定义
** 采用自顶向下逐步求精的设计方法和单入口单出口的控制构件。**
o 自顶向下逐步求精的方法是人类解决复杂问题时常用的方法,采用这种先整体后局部,先抽象后具体的步骤开发的软件具有较清晰的层次。
o 仅使用单入口单出口的控制构件,程序有良好的结构特征,能降低程序的复杂性,增强程序的可读性、可维护性和可验证性,提高软件的生产率。
o 结构程序设计的思想,应该在软件设计中体现出来,但这并不排除为效率或其他原因,对结构程序设计作一点修正。
o 随着面向对象、软件重用等新的软件开发方法和技术的发展,更现实、更有效的开发途径可能是自顶向下和自底向上两种方法的有机结合。
4.软件设计中复审的目的是什么?
o 这些信息是对设计的一种特殊注释,最后可开发一个基本操作规格说明书或安装手册作为附录。
o 为了确保文档的质量,还必须对设计文档进行复审。
o 复审的目的在于 及早发现设计中的缺陷和错误 。
o 在大型软件的开发过程中某些错误从一个阶段传到另一个阶段呈扩大趋势,尽早发现、纠正错误所需的代价较小。
o 复审包括
** 软件总体结构、 数据结构、**
** 结构的界面、 模块过程细节。**
o 重点
** 软件结构能否满足需求?**
** 结构的形态是否合理?**
** 层次是否清晰?**
** 模块的划分是否遵循模型化和信息隐藏的思想?**
** 系统的人机界面,各模块的接口,以及出错处理是否恰当?模块的设计能否满足功能与性能要求?**
** 选择的算法与数据结构是否合理,能否适应编程语言?**
** 等等。**
复审
正式复审
** 软件开发人员、用户代表和领域专家参加**
** 采用答辩形式,与会者提前审阅了文档,设计人员在对设计方案详细说明后,答复与会者的问题并记下各种重要的评审意见。**
非正式复审
** 同行切磋、不拘时间、不拘形式。采用****"走查"**法,一 名设计人员到会,与同事逐行审阅文档,记录发现的问题。
o 复审应对事不对人。
o 软件设计人员应真诚欢迎他人提意见和建议,尽早揭露错误。
o 参加复审的其他人员应坦诚、友好,防止把复审变为质询或辩论。
o 对复审中提出的问题应详细记录,不要奢望所有问题都能当场解决。
o 复审结束前,还应对本次复审作出结论。
chap10 软件测试
1.白盒测试和黑盒测试的基本概念及两者的区别
o 任何工程化的产品都有两种测试方法:
一种方法是已知产品应该具有的功能,通过测试检验每个功能是否都能正常使用;
另一种方法是已知产品内部工作过程,通过测试检验产品内部动作是否按照产品规格说明的规定正常进行。
o 前者称为黑盒测试,后者称为白盒测试。
o 黑盒测试完全不考虑程序的内部结构和处理过程。测试仅在程序界面上进行。
o 设计测试用例旨在说明:
①软件的功能是否可操作;
②程序能否适当地接收输入数据并产生正确的输出结果或在可能的场景中事件驱动的效果是否尽如人意;
③能否保持外部信息(如数据文件)的完整性。
o 白盒测试法密切关注处理细节,针对程序的每一条逻辑路径都要分别设计测试用例,检查分枝和循环的情况。
o 穷举测试不可取,一般选用少量 " 最有效 " ,即最有可能暴露错误的路径进行测试。
o 测试的目的是为了找出错误,所以无论采用黑盒法还是白盒法,设计测试用例时总是期望用尽可能少的时间和代价发现尽可能多的错误。
2.白盒测试及黑盒测试的方法有哪些?利用相关方法设计测试用例
逻辑驱动测试
语句覆盖
为使程序中每个语句至少执行一次,只需设计一个能通过路径ace的例子就可以了,例如选择输入数据为: A=2**,B=0,**X=3 就可达到"语句覆盖"标准
分支****覆盖
o 比"语句覆盖"稍强的覆盖标准是" 分支 覆盖" ( 或称判定覆盖 ) 标准。含义是:执行足够的测试用例,使得程序中的每一个分支至少都通过一次。
o 对 例 1 的程序,如果设计两个例子,使它们能通过路径 ace 和 abd ,或者通过路径 acd 和 abe ,就可达到"判定覆盖"标准,为此,可以选择输入数据为:
①A=3,B=0,X=1 (沿路径acd执行**)****;**
②A=2,B=1,X=3(沿路径abe执行**)**
条件覆盖
o 一个判定中往往包含了若干个条件,如例 1 的程序中,判定 (A > 1) AND (B=0) 包含了两个条件: A > 1 以及 B=0 ,所以可引进一个更强的覆盖标准 ------" 条件覆盖 "。"条件覆盖"的含义是:执行足够的测试用例,使得判定中的每个条件获得各种可能的结果。
例1的程序有四个条件:
A**>1、B=0、A=2、X>**1
为了达到"条件覆盖"标准,需要执行足够的测试用例使得在a点有:
A**>1、A≤1、B=0、**B≠0
等各种结果出现,以及在b点有:
A=2**、A≠2、X>1、**X≤1
等各种结果出现。
现在只需设计以下两个测试用例就可满足这一标准:
①A=2,B=0,X=4 (沿路径ace执行**)****;**
②A=1,B=1,X=1 (沿路径abd执行**)****。**
分支**/**条件覆盖
o 针对上面的问题引出了另一种覆盖标准 ------" 分支 /条件覆盖",它的含义是:执行足够的测试用例,使得 分支 中每个条件取到各种可能的值,并使每个 分支 取到各种可能的结果。
n 对例 1 的程序,前面的两个例子
①A=2,B=0,X=4 (沿ace路**)**
② A=1**,B=1,X=1 (沿abd路****)**
是满足这一标准的。
条件组合覆盖
o 针对上述问题又提出了另一种标准 ------" 条件组合覆盖"。它的含义是:执行足够的例子,使得每个判定中条件的各种可能组合都至少出现一次。显然,满足"条件组合覆盖"的测试用例是一定满足"分支覆盖"、"条件覆盖"和"分支 / 条件覆盖"的。
再看例1的程序,我们需要选择适当的例子,使得下面8种条件组合都能够出现:
1) A>1, B=0 2) A>1, B≠0
3) A≤1, B=0 4) A≤1, B≠0
5) A=2, X>1 6) A=2, X≤1
7) A≠2, X>1 8) A≠2, X≤1
5)、6)、7)、8)四种情况是第二个IF语句的条件组合,而X的值在该语句之前是要经过计算的,所以还必须根据程序的逻辑推算出在程序的入口点X的输入值应是什么。
下面设计的四个例子可以使上述8种条件组合至少出现一次:
**①A=2,B=0,**X=4
**使1)、****5)**两种情况出现;
**②A=2,B=1,**X=1
**使2)、****6)**两种情况出现;
**③A=1,B=0,**X=2
**使3)、****7)**两种情况出现;
**④A=1,B=1,**X=1
**使4)、****8)**两种情况出现。
路径测试
o 路径测试就是设计足够多的测试用例,覆盖被测试对象中的所有可能路径。
o 对于例 1 ,下面的测试用例则可对程序进行全部的路径覆盖 。
|-------------|------|
| 测试用例 | 通过路径 |
| A=2、B=0、X=3 | ace |
| A=1、B=0、X=1 | abd |
| A=2、B=1、X=1 | abe |
| A=3、B=0、X=1 | acd |