八宝书库 > 文学其他电子书 > 软件测试的艺术(中文清晰版)(PDF格式) >

第7部分

软件测试的艺术(中文清晰版)(PDF格式)-第7部分

小说: 软件测试的艺术(中文清晰版)(PDF格式) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!






    这种错误。例如,一个FORTRAN语言程序包含一个实型变量A和一个整型 



    变量B ,两者都通过使用EQUIVALENCE语句而成为同一内存区域的别名。 



    如果程序先对A赋值,然后又引用变量B ,由于机器可能会将内存中用浮点 



    位表示的实数当做整数,在这种情况下错误就可能发生。 



  6。 变量值的类型或属性是否与编译器所预期的一致?当C 、C++或COBOL程 



    序将某个记录读到内存中,并使用一个结构来引用它时,由于记录的物理 



    表示与结构定义存在差异,这种情况下错误就可能发生。 


…………………………………………………………Page 33……………………………………………………………

                        第3章 代码检查、走查与评审    21 



            COBOL与Fortran背景资料 



   COBOL和Fortran是两门分别面向商业处理和科学计算开发方向的 



元老级别的编程语言,这两门语言为数代的程序员提高开发效率作出 



了不可估量的贡献。 



   COBOL (取自mon  Business  Oriented  Language 的粗体部分) 



的雏形诞生于1959年前后,其设计的主要目的是为了支撑大型机系统 



上的商业应用软件的开发工作,其最初的规格设计可谓是集众家之长, 



当时参与COBOL 项目的有知名的计算机制造商以及联邦政府机关, 



他们共同创造了一门全新的、面向商业的、能够运行在各种硬件和操 



作系统之上的编程语言。 



   这些年来,C O B O L 语言标准不断完善和发展。到2 0 0 2 年, 



COBOL几乎能够在大多数的操作系统平台进行开发和运行,甚至还 



推出了一个用来集成开发环境的面向对象版本。 



   到本书写作之际,目前最新版本的COBOL是Visual COBOL 2010 。 



   Fortran (最早拼写成FORTRAN ,不过现在更倾向于首字母大写 



的规范)的诞生比COBOL还要稍微早点,其规格定义最早可以追溯 



到20世纪50年代早中期。和COBOL类似,Fortran被设计用来针对某 



些特殊类型(尤其是科学和数字计算方面)的大型机应用系统开发。 



Fortran 这个名字来源于当时IBM 一个叫做Mathematical  FORmula 



TRANslating  System (名字取自字体加粗部分)的系统。虽然最初的 



Fortran 只有32种语句,但是这已经远远超越了当时的汇编程序设计语 



言,是具有划时代意义的进步。 



   到本书出版之际,最新的Fortran版本是Fortran  2008 ,已经在2010 



年被标准委员会正式通过。和COBOL一样,Fortran语言的演进伴随着 



对更多硬件和操作系统的支持,不过有一点不同的是,不管是现有系 



统的开发还是老系统的维护,Fortran都可能比COBOL应用得更广泛。 



7。 在使用的计算机上,当内存分配的单元小于内存可寻址的单元大小时,是 



 否存在直接或间接的寻址错误?例如,在某些条件下,定长的位串不必以 


…………………………………………………………Page 34……………………………………………………………

22  软件测试的艺术 



    字节边界为起点,但是地址又总是指向字节边界的。如果程序计算一个位 



    串的地址,稍后又通过该地址引用这个位串,可能会指向错误的内存位置。 



    将一个位串参数传送给一个子程序时,也可能发生这种情况。 



  8。 当使用指针或引用变量时,被引用的内存的属性是否与编译器所预期的一 



    致?这种错误的一个例子是,当一个指向某个数据结构的C++指针,被赋 



    值为另外的数据结构的地址。 



  9。 假如一个数据结构在多个过程或子程序中被引用,那么每个过程或子程序 



    对该结构的定义是否都相同? 



  10。 如果字符串有索引,当对数组进行索引操作或下标引用,字符串的边界取 



    值是否有“仅差一个”(off…by…one )的错误? 



  11。 对于面向对象的语言,是否所有的继承需求都在实现类中得到了满足? 



3。3。2   数据声明错误 



  1。 是否所有的变量都进行了明确的声明?虽然没有明确声明不一定是错误, 



    但通常却是麻烦的源头。举例来说,如果一个程序的子程序接收一个数组 



    参数,却未将该参数定义为数组(如用 DIMENSION  语句),对该数组的 



    引用(如 C=A  (I) )会被解释为一个函数调用,导致计算机试图将此数组 



    当做程序执行。另外,如果某个变量在一个内部过程或程序块中没有明确 



    声明,是否可以理解为该变量在这个程序块中被共用? 



  2。 如果变量所有的属性在声明中没有明确说明,那么默认的属性能否被正确 



    理解?举例来说,在Java语言中,程序接收到的没有正确声明的默认属性 



    往往是导致意外情况发生的源头。 



  3。 如果变量在声明语句中被初始化,那么它的初始化是否正确?在很多语言 



    中,数组和字符串的初始化比较复杂,因此也成为容易出错的地方。 



  4。 是否每个变量都被赋予了正确的长度和数据类型? 



  5。 变量的初始化是否与其存储空间的类型一致?举例来说,如果Fortran语言 



    子程序中的一个变量在每次调用子程序时都需要重新初始化一次,那么必 



    须使用赋值语句对其初始化,而不应该用DATA语句。 



  6。 是否存在着相似名称的变量(如VOLT和VOLTS)?这种情况不一定是错误, 



    但应被视为警告,这些名称可能会在程序中发生混淆。 


…………………………………………………………Page 35……………………………………………………………

                           第3章 代码检查、走查与评审    23 



3。3。3   运算错误 



   1。 是否存在不一致的数据类型(如非算术类型)的变量间的运算? 



   2。 是否有混合模式的运算?例如,将浮点变量与一个整型变量做加法运算。 



    这种情况并不一定是错误,但应该谨慎使用,确保程序语言的转换规则能 



    够被正确理解。看看下面的Java程序片段,显示了整数运算中可能发生的 



    取整误差: 



   3。 是否有相同数据类型、不同字长变量间的运算? 



   4。 赋值语句的目标变量的数据类型是否小于右边表达式的数据类型或结果? 



   5。 在表达式的运算中是否存在表达式向上或向下溢出的情况?也就是说,最 



    终的结果看起来是个有效值,但中间结果对于编程语言的数据类型可能过 



    大或过小。 



   6。 除法运算中的除数是否可能为0 ? 



   7。 如果计算机表达变量的基本方式是基于二进制的,那么运算结果是否不精 



    确?也就是说,在一个二进制计算机上,10×0。1很少会等于1。0。 



   8。 在特定场合,变量的值是否超出了有意义的范围?例如,对变量 



    PROBABILITY赋值的语句可能需要进行检查,保证赋值始终为正且不大于1。0。 



   9。 对于包含一个以上操作符的表达式,赋值顺序和操作符的优先顺序是否正确? 



   10。 整数的运算是否有使用不当的情况,尤其是除法?举例来说,如果i是一个 



    整型变量,表达式2 * i / 2 = = i 是否成立,取决于i是奇数还是偶数, 



    或是先运算乘法,还是先运算除法。 



3。3。4    比较错误 



   1。 是否有不同数据类型的变量之间的比较运算,例如,将字符串与地址、日期或 



    数字相比较? 


…………………………………………………………Page 36……………………………………………………………

24  软件测试的艺术 



   2。 是否有混合模式的比较运算,或不同长度的变量间的比较运算?如果有, 



    应确保程序能正确理解转换规则。 



   3。  比较运算符是否正确?程序员经常混淆“至多”、“至少”、“大于”、“不小 



    于”、“小于”和“等于”等比较关系。 



   4。 每个布尔表达式所叙述的内容是否都正确?在编写涉及“与”、“或”或 



    “非”的表达式时,程序员经常犯错。 



   5。 布尔运算符的操作数是否是布尔类型的?比较运算符和布尔运算符是否错 



    误地混在了一起?这是一类经常会犯的错误,这里我们描述几个典型错误 



    的例子: 



    o 如果想判断i是否在2 ~10之间,表达式2y》z,正确的表达式应该是             。 



   6。 在二进制的计算机上,是否有用二进制表示的小数或浮点数的比较运算?由 



    于四舍五入,以及用二进制表示十进制数的近似度,这往往是错误的根源。 



   7。 对于那些包含一个以上布尔运算符的表达式,赋值顺序以及运算符的优先顺 



    序是否正确?也就是说,如果碰到如同(if((a==2)&&(b==2) || (c==3)) 



    的表达式,程序能否正确理解是“与”运算在先还是“或”运算在先? 



   8。 编译器计算布尔表达式的方式是否会对程序产生影响?例如,语句 



    if((x==0  && (x/y)》z)对于有的编译器来说是可接受的,因为其认为 



    一旦“与”运算符的一侧为FALSE 时,另一侧就不用计算;但是对于其他 



    编译器来说,却可能引起一个被0 除的错误。 



3。3。5   控制流程错误 



   1。 如果程序包含多条分支路径,比如有计算GO  TO语句,索引变量的值是否 



    会大于可能的分支数量?例如,在语句 


…………………………………………………………Page 37……………………………………………………………

                         第3章 代码检查、走查与评审     25 



  中,i 的取值是否总是1、2或3 ? 



2。 是否所有的循环最终都终止了?应设计一个非正式的证据或论据来证明每 



 一个循环都会终止。 



3。 程序、模块或子程序是否最终都终止了? 



4。  由于实际情况没有满足循环的入口条件,循环体是否有可能从未执行过? 



 如果确实发生这种情况,这里是否是一处疏漏?例如,如果循环以下面的 



 语句作为开头: 



  or。。。 



当NOTFOUND初始时就为假,或者x大于z时,情况会如何呢? 



5。 如果循环同时由迭代变量和一个布尔条件所控制(如一个搜索循环),如果 



 循环越界(fall…through )了,后果会如何?例如,伪指令循环以 



开头,如果NOTFOUND 永不为假,会发生什么结果呢? 



6。 是否存在“仅差一个”的错误,如迭代数量恰恰多一次或少一次?这在从0 



 开始的循环中是常见的错误。我们会经常忘记将“0 ”作为一次计数。举例 



 来说,如果想编写一段Java代码执行10次循环,下面的语句是错误的,因 



 为它执行了11次: 



  正确的应该是执行10次循环: 



7。 如果编程语言中有语句组或代码块的概念(例如do…while 或 {…} ),是 



 否每一组语句都有一个明确的while语句,并且do语句也与其相应的语句 


…………………………………………………………Page 38……………………………………………………………

26  软件测试的艺术 



    组对应?或者,是否每一个左括号都对应有一个右括号?目前的大多数编 



    译器都能识别出这些不匹配的情况。 



   8。 是否存在不能穷尽的判断?举例来说,如果一个输入参数的预期值是1,2 



    或3 ,当参数值不为1或2 时,在逻辑上是否假设了参数必定为3 ?如果是这 



    样的话,这种假设是否有效? 



3。3。6   接口错误 



   1。 被调用模块接收到的形参(parameter )数量是否等于调用模块发送的实参 



    (argument )数量?另外,顺序是否正确? 



  2。 实参的属性(如数据类型和大小)是否与相应形参的属性相匹配? 



  3。 实参的量纲是否与对应形参的量纲相匹配?举例来说,是否形参以度为单 



    位而实参以弧度为单位? 



  4。 此模块传递给彼模块的实参数量,是否等于彼模块期望的形参数量? 



   5。 此模块传递给彼模块的实参的属性,是否与彼模块相应形参的属性相匹配? 



  6。 此模块传递给彼模块的实参的量纲,是否与彼模块相应形参的量纲相匹配? 



  7。 如果调用了内置函数,实参的数量、属性、顺序是否正确? 



   8。 如果某个模块或类有多个入口点,是否引用了与当前入口点无关的形参? 



    下面PL/1程序的第二个赋值语句就存在这种错误: 



  9。 是否有子程序改变了某个原本仅为输入值的形参

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的