a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 176|回复: 3

[计算机四级] 全国计算机四级考试复习纲要五(3)

[复制链接]
发表于 2012-7-31 20:48:14 | 显示全部楼层 |阅读模式
3.信息隐蔽: p+ ?: o0 l1 y8 F7 K
信息隐蔽是开发整体程序结构时使用的法则,即将每个程序的成分隐蔽或封装在一个单一的设计模块中,定义每一个模块时尽可能少地显露其内部的处理。在设计时首先列出一些可能发生变化的因素,在划分模块时将一个可能发生变化的因素隐蔽在某个模块的内部,使其他模块与这个因素无关。在这个因素发生变化时,我们只需修改含有这个因素的模块,而与其他模块无关。隐蔽的对象可以有:什么的决策,可能修改的决策,数据结构的内部连接以及对它所做的操作细节,内部特征码,与计算机硬件有关的细节等。信息隐蔽原则对提高软件的可修改性、可测试性和可移植性都有重要的作用。
  x' e/ ]$ @. p4.模块独立
4 L# O2 z2 K$ x$ ~9 |. ?0 a模块独立是指每个模块完成一个相对独立的特定子功能,并且与其他模块之间的联系简单。衡量模块独立程序的度量标准有两个:耦合和内聚。耦合是指模块之间联系的紧密程度。耦合度越高则模块的独立性越差。内聚是指模块内部各元素之间联系的紧密程度。例如一个完成多个功能的模块的内聚度就比完成单一功能的模块的内聚度低。内聚度越低模块的独立性越差。因此,模块独立就是希望每个模块都是高内聚低耦合的。! f( I0 a$ ?* i' K, ?/ P8 v
(1)耦合
0 n  a8 z1 z$ m5 b; I* e5 k8 }& W6 ?两个模块之间的耦合方式通常有如下7种,下面按它们的耦合度从低到高的次序依次作介绍。; t7 [( g: t, e' k
① 非直接耦合:非直接耦合是指两个模块没有直接的联系,它们中的任一个都能不依赖于对方而独立地工作。
1 j4 o% w' L/ T8 R② 数据耦合:数据耦合是指两个模块借助于参数表传递简单数据。
2 x& E# N& O( c5 C* I' _③ 标记耦合(stamp coupling):当一个数据结构的一部分(如记录的一部分)借助于模块接口被传递时就发生标记耦合。0 b. A; {1 ]( @: a) ?5 O
④ 控制耦合:控制耦合指两个模块间传递的信息中包含用于控制模块内部逻辑的控制信息。2 [, K: L/ i4 ~$ q* v# g& h
⑤ 外部耦合:当模块与软件以外的环境有关时就发生外部耦合。例如,输入/输出把一个模块与特定的设备、格式、通信协议耦合在一起。
# i. @9 Q2 E+ t& S# i7 ?⑥ 公共耦合:多个模块引用一全局数据区的模式称为公共耦合。例如FORTRAN语言中的COMMON语句,C语言中的external数据类型,一个磁盘文件等都是全局数据区。
: N- y9 H5 |3 y9 J6 L0 ?⑦内容耦合:内容耦合指两上模块之间出现了下列情况之一:; O+ B, f% W( ~1 s
一个模块访问另一个模块的内部数据;9 f; j4 ], Q0 w4 [& B  l0 w
一个模块不通过正常入口转到另一模块的内部;
( s* n- s5 \2 Q两个模块有一部分程序代码重叠;
" P8 O$ ?1 [3 h# S一个模块有多个入口。6 l( V+ @2 k! @, z& q% a
(2)内聚
- s* d6 [* x. M4 O* M* c/ K模块的内聚种类通常可分成7种,下面按内聚度从低到高的次序依次作介绍。
5 s: n5 O0 }7 A  U: J- K①偶然内聚:如果一个模块完成一组任务,这组任务彼此间即使有关系,其关系也是很松散的,这个模块属于偶然内聚。, ^" c. B9 y# ?
②逻辑内聚:如果一个模块完成逻辑上相关的一组任务,这个模块是逻辑内聚的。例如,产生与类型无关的全部输出的模块。
' ~2 C% T/ @" W1 u4 A2 ]* T7 T③瞬时内聚(temporal cohesion):如果一个模块所包含的任务必须在同一时间间隔内执行,这个模块属于瞬时内聚。例如初始化模块。
5 }8 j5 c8 m+ N④过程内聚:如果一个模块的处理元素是相关的,而且必须按特定的次序执行,这个模块属于过程内聚。
; f5 J3 V7 H; N) H& ^( I⑤通信内聚:如果一个模块的所有处理元素集中在一个数据结构的区域上,该模块属于通信内聚。例如,一个模块中的所有处理元素使用同一输入数据。; u8 u# i" I& Q+ v0 `9 Y! Y
⑥顺序内聚:如果一个模块的处理元素是相关的,而且必须顺序执行,这个模块属于顺序内聚。
3 Y5 s6 f& z  L* S8 x/ d# K⑦功能内聚:如果一个模块完成一个单一的功能,模块中的各部分在此目标下协同工作,而且都是为完成这一功能而不可缺少的,那么这个模块是功能内聚的。
回复

使用道具 举报

 楼主| 发表于 2012-7-31 20:48:15 | 显示全部楼层

全国计算机四级考试复习纲要五(3)

5.模块分解时应遵循的准则" S9 b# }* Y- S) |1 e# r
(1)满足信息隐蔽原则
$ ^  U* Z; y, O5 d& Y) q(2)尽量使得模块的内聚度高,模块间的耦合度低。+ d+ B. h% |  D
(3)模块的大小适中(通常一个模块以50~100个语句行为适宜)。
8 n' @; w' Q7 W7 E# G/ Q8 |5 i(4)模块的调用深度不宜过大。一个模块A可以调用另一模块B,模块B还可调用模块C,称模块A直接调用模块B,模块A间接调用模块C,被间接调用的模块还可调其他模块,这样可形成一棵调用树,我们把以某个模块为根结点的调用树的深度称为该模块的调用深度。
( e. z7 r2 u/ J# f& n+ S( L(5)模块的扇入应尽量大,扇出不宜过大。一个模块的扇入是指直接调用该模块的上级模块个数。一个模块的扇出是指该模块直接调用的下级模块的个数。扇入大表示模块的复用程序高,扇出大表示模块的复杂度高。& o/ X  W) Y& I, A
(6)设计单入口和单出口的模块。
6 f1 K5 w- e; G$ E' _% o5 m(7)模块的作用域应在控制域之内。模块的作用域是指受该模块内一个判定影响的所在模块的集合。模块的控制域是指该模块本身以及被该模块直接或间接调用的所有模块的集合。在设计时,作用域应是控制域的子集,作用域最好是做出判定的模块本身以及它的直属下级模块(直接调用的模块)。& G8 ]8 b% I9 ~- K
(8)模块的功能应是可以预测的,功能可预测是指对相同的输入数据能产生相同的输出。
$ u/ F+ |: ~& R. e5 ]三、软件测试
; s% r% p& @! u( E+ S& Y+ ~在软件开发的一列活动中,为了保证软件的可靠性,人们研究并使用了很多方法进行分析、设计及编码实现。但是由于软件产品本身无形态,它是复杂的、知识高度密集的逻辑产品,其中不可能没有错误。物理产品在出厂前都要进行严格的检验,软件产品也不例外。软件开发总伴随着软件质量保证的活动,而软件测试是主要活动之一。软件测试代表了需求分析、设计、编码的最终复审。测试是一项很艰苦的工作,其工作量约占软件开发总工作量的40%以上,特别对一些关系到人的生命安全的软件,共测试成本可能相当于开发阶段总成本的3~5倍。  N( j8 }2 F1 ?1 h4 w+ g. T
(一) 测试的基本概念
8 K- n* {( P3 G1.测试的目的' M1 e: [( X; k- }/ c0 {% B7 A
软件测试的目的是尽可能多地发现软件产品(主要是指程序)中的错误和缺陷。明确测试的目的是一件非常重要的事,因为在现实世界中对测试工作存在着许多模糊或者错误的看法,这些看法严重影响着测试工作的顺利进行。有人认为测试是为了证明程序是正确的,也就是说程序不再有错误,事实证明这是不现实的。因为要通过测试来发现程序中的所有错误就要穷举所有可能的输入数据,检查它们是否产生正确的结果。例如,一个需要3个16位字长的整型输入数据的程序,输入数据的所有组合情况大约有3×10 14 种,若每组数据的测试时间为1ms,那么即使一年365天,每天24小时地测试,也大约需要1万年的时间。7 @4 C3 [, R8 Q9 E" ?& L" x
2.测试用例$ _0 B9 k3 M; g0 W
要进行测试,除了要有测试数据(或称输入数据)外,还应同时给出该组测试数据应该得以怎样的输出结果,我们称它为预期结果。在测试时将实际的输出结果与预期结果比较,若不同则表示发现了错误,因此测试用例是由测试数据和预期结果构成的。为了发现程序中的错误,应竭力设计能暴露错误的测试用例。一个好的测试用例是极有可能发现迄今为止尚未发现的错误的测试用例。一次成功的测试是发现了至今为止尚未发现的错误的测试。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 20:48:16 | 显示全部楼层

全国计算机四级考试复习纲要五(3)

3.测试的原则
0 Y8 B/ c+ V2 n基于上述测试目的,我们可以考虑以下有关测试的原则:0 k6 l) J" T: M+ e& {9 D
(1)确定预期输出结果是测试用例必不可少的一部分。如果只有测试数据而无预期结果,那么就不易判断测试结果是否正确。
! I0 \" [$ P+ ]2 x0 A. D( ^  I7 e6 X2 a(2)程序员应避免测试自己的程序,程序设计机构不应测试自己的程序。这是因为程序中的错误往往是由于程序员对问题说明的误解,由他来测试自己的程序就不易找出因这种误解而产生的错误。此外,开发程序是一项建设性的工作,而测试则是一项破坏性的工作(证明程序有错),这对开发人员或机构来说在心理上是难以容忍的。为了证明自己的程序没有错误或错误很少,他们往往不去选择容易发现错误的测试用例,而选择容易通过的测试用例。当然,这并不意味着程序员都不能测试自己的程序,如单元测试通常就是由程序员自己测试的。$ f) ?8 S' z& ]- J# N1 |( c8 \! V% ~2 Z
(3)彻底检查每个测试结果。如果不仔细检查测试结果,有些已经测试出来的错误也可能被遗漏掉。
' z/ |8 @* A- l/ Y7 _(4)对非法的非预期的输入数据也要像合法的和预期的输入数据一样编写测试用例。! I( }8 D$ c. C9 P
(5)检查程序是否做了应做的事是成功的一半,另一半是看程序是否做了不该做的事。/ c7 g$ h4 ]2 z6 E
(6)除了真正没有用的程序外,一定不要扔掉测试用例。因为在改正错误或程序维护后还要进行重新测试。* @7 Z- `0 K; h! Q7 i
(7)在规划测试时不要设想程序中不会查出错误。
# i4 c" c4 |+ E4 ^(8)程序模块经测试后,残存的错误数目往往与已发现的错误数目成比例。实践证明,程序中的大量错误仅与少量的程序模块有关,因此当A模块找出的错误比B模块多得多时,很可能A模块残存的错误仍比B模块残存的错误多多。$ t& [& g9 a# u" I( m: N
4.白盒测试和黑盒测试
3 t' c: O% o) X: F$ P测试的关键是测试用例的设计,其方法可分成两类:白盒测试和黑盒测试。白盒测试是把程序看成装在一只透明的白盒子里,测试者完全了解程序结构和处理过程。它根据程序的内部逻辑来设计测试用例,检查程序中的逻辑通路是否都按预定的要求正确地工作。黑盒测试是把程序看成一只黑盒子,测试者完全不了解(或不考虑)程序的结构和处理过程。它根据规格说明书规定的功能来设计测试用例,检查程序的功能是否符合规格说明的要求。  K1 g$ C4 A; x, \
(二) 测试步骤
4 E& E' O& H* v9 V. h软件测试的主要步骤有单元测试,集成测试和确认测试。6 N8 i8 T  z6 B7 H7 w9 b8 v' D. V
1.单元测试(unit testing)  q7 i  i5 H0 G/ i: C) m5 z5 a
单元测试也称模块测试。通常单元测试可放在编码阶段,程序员在编写好一个模块后,总会(也应该)对自己编写的模块进行测试,检查它是否实现了详细设计说明书中规定的模块功能 和算法。单元测试主要发现编码和详细设计中产生的错误,通常采用白盒测试。测试一个模块时需要编写一个驱动模块和若干个桩(stub)模块,如下图所示。驱动模块的功能是向被测试模块提供测试数据,驱动(即调用)被测模块,并从被测模块中接受测试结果。桩模块的功能是模拟被模块所调用的子模块,它接受被测模块的调用,检验调用参数,模拟被调用的子模块功能,把结果送回给被测模块。在模块结构图中,顶层模块测试时不需要驱动模块,最底层的模块测试时不需要桩模块。
5 b! g* K6 g8 H2.集成测试(integration testing)3 i- S* E- R2 Z6 b
集成测试也称组装测试,它是对由各模块组装而成的程序进行测试,主要检查模块间的接口和通信。集成测试主要发现设计阶段产生的错误,通常采用黑盒测试。集成的方式可分成非渐增式集成和渐增式集成。非渐增式集成是先测试所有的模块,然后把这些模块集成在一起对整个程序进行测试。渐增式集成是将单元测试和集成测试合并在一起,它根据模块结构图,按某种次序选一个尚未测试的模块,把它同已经测试好的模块组合在一起对整个程序进行测试,每次增加一个模块,直至所有模块全部集成在程序中。渐增式集成又可分成自顶向下集成和自底向上集成。自顶向下集成先测试上层模块,再测试下层模块。由于测试下层模块时它的上层模块已测试过,所以可以用其上层模块作为它的驱动模块,而不必另编驱动模块。自底向上集成先测试下层模块,再测试上层模块。同样道理,在自底向上集成时可用下层模块作为上层模块的桩模块,而不必另外编写桩模块。( C3 [* o+ Q* e. B4 o5 f
3.确认测试(walidation testing), ^0 A$ ^: Q5 k* s( I
确认测试的任务是检查软件的功能、性能及其他特征是否与用户的需求一致,它是以需求规格说明书(即需求规约)作为依据的测试。确认测试通常采用黑盒测试。确认测试首先测试程序是否满足需求规格说明书所列的各项要求,然后要进行软件配置复查,特别是文档是否齐全,各方面的质量是否符合要求等。如果一个软件是为某个客户定制的,那么最后由客户来实施验收测试(acceptance testing),以便客户确认该软件是否他所需要的。如果一个软件是作为产品被许多客户使用的话,那不可能为每个客户进行验收测试。大多数软件生产者使用一种Alpha测试和Beta测试的过程,来揭露仅由最终用户才能发现的错误。Alpha测试是在开发者的现场由客户来实施的,被测试的软件是在开发者从用户的角度进行常规设置的环境下运行的。Beat测试是在一个或多个客户的现场由该软件的最终用户实施的。与Alpha测试不同的是,Beat测试时开发者通常是不在场的。Alpha测试和Beat测试除了进一步发现程序中的错误外,还能发现使用上的问题。经过确认测试后的软件通常就可交付使用了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 20:48:17 | 显示全部楼层

全国计算机四级考试复习纲要五(3)

(三) 白盒测试的测试用例设计+ @8 d' n! _/ N  ]& B2 h
白盒测试是根据程序的内部逻辑来设计测试用例,常用的技术是逻辑覆盖,即考察用测试数据运行被测程序时对程序逻辑的覆盖程度。主要的覆盖标准有6种:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖、路径覆盖。为了提高测试的效率,应选择最少的测试用例来满足指定的覆盖标准。) r# e0 v+ R; n# g8 Y- Q* C4 {
1.语句覆盖
; ^- c5 m  V% g' U+ r$ p- T( c语句覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个语句至少执行一次。6 t* ^# [# Z) E& W- \. ~* |
2.判定覆盖
# f6 j6 ]- t- b" r7 {3 W  N3 F判定覆盖又称为分支覆盖。它是指选择足够的测试用例,使得运行这些测试用例时,每个判定的所有可能结果至少出现一次(即判定的每个分支至少经过一次)。
8 V- F8 K$ b( t+ C2 e0 Z$ ^* R3.条件覆盖
) ^; C! Q+ c  `/ Q0 |3 [在软件设计过程中,一个判定往往由多个条件组成,判定覆盖仅考虑了判定的结果而没有考虑每个条件的可能结果。条件覆盖是指选择足够的测试用例,使得运行这些测试用例时,判定中的每个条件的所有可能结果至少出现一次。/ G# J) |6 P/ }7 ?$ L6 o1 O
4.判定/条件覆盖2 x& l5 H2 c; `1 c! N4 A) S( E
判定/条件覆盖是指选择足够的测试用例。使得运行这些测试用例时,判定中每个条件的所有可能结果至少出现一次,并且每个判定本身的所有可能结果至少出现一次。显然,满足判定/条件覆盖标准的测试用例一定也满足判定覆盖、条件覆盖和语句覆盖标准。在某些程序的测试中,如果选择得好,判定覆盖、条件覆盖和判定/条件覆盖可以使用相同的最少的测试用例。; y8 [) p) q" V1 M& l. o$ y$ `2 D
5.条件组合覆盖; t3 V* _4 L5 J
在条件覆盖中考虑了判定中每个条件的所有可能结果,但并未考虑条件的组合情况。条件组合覆盖是指选择足够的测试用例,使得运行这些测试用例时,每个判定中条件结果的所有可能组合至少出现一次。由于条件组合覆盖使每个判定中条件结果的所有可能组合都至少出现一次,因此判定本身的所有可能结果也一定至少出现一次,同时也使每个条件的所有可能结果至少出现一次。因此,条件组合覆盖是上述5种覆盖标准中最强的一种。然而,条件组合覆盖还不能保证程序中所有可能的路径都被覆盖。
: {: b: ~( V3 U9 z6.路径覆盖: I% u. Q! R/ `  S; u
路径覆盖是指选择足够的测试用例,使得运行这些测试用例时,程序的每条可能执行到的路径都至少经过一次(如果程序中有环路,则要求每条环路至少经过一次)。路径覆盖实际上是考虑了程序中各种判定结果的所有可能组合,但它并未考虑判定中的条件结果的组合,因此它是一种比较强的覆盖标准,但并不能代替条件覆盖和条件组合覆盖。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-16 06:35 , Processed in 0.357052 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表