友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
富士康小说网 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

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

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 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。 是否有子程序改变了某个原本仅为输入值的形参? 



   10。 如果存在全局变量,在所有引用它们的模块中,它们的定义和属性是否相同? 



   11。 常数是否以实参形式传递过?在一些用FORTRAN语言编写的程序中,诸如 



    的语句是很危险的,因为如果子程序SUBX对其第二个形参进行赋值,常数3 



    的值将会被改变。 


…………………………………………………………Page 39……………………………………………………………

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



3。3。7   输入/输出错误 



   1。 如果对文件明确声明过,其属性是否正确? 



   2。 打开文件的语句中各项属性的设置是否正确? 



   3。 格式规范是否与I/O语句中的信息相吻合?举例来说,在FORTRAN语言中, 



    是否每个FORMAT语句都与相应的READ或WRITE语句相一致(就各项的数 



    量和属性而言)? 



   4。 是否有足够的可用内存空间,来保留程序将读取的文件? 



   5。 是否所有的文件在使用之前都打开了? 



   6。 是否所有的文件在使用之后都关闭了? 



   7。 是否判断文件结束的条件,并正确处理? 



   8。 对I/O 出错情况处理是否正确? 



   9。 任何打印或显示的文本信息中是否存在拼写或语法错误? 



   10。 程序是否正确处理了类似于“File Not Found ”这样的错误? 



3。3。8   其他检查 



   1。 如果编译器建立了一个标识符交叉引用列表,那么对该列表进行检查,查 



    看是否有变量从未引用过,或仅被引用过一次。 



   2。 如果编译器建立了一个属性列表,那么对每个变量的属性进行检查,确保 



    没有赋予过不希望的默认属性值。 



   3。 如果程序编译通过了,但计算机提供了一个或多个“警告”或“提示”信 



    息,应对此逐一进行认真检查。“警告”信息指出编译器对程序某些操作的 



    正确性有所怀疑;所有这些疑问都应进行检查。“提示”信息可能会罗列出 



    没有声明的变量,或者是不利于代码优化的用法。 



   4。 程序或模块是否具有足够的鲁棒性?也就是说,它是否对其输入的合法性 



    进行了检查? 



   5。 程序是否遗漏了某个功能? 



   这些检查列表在表3…1和表3…2 中进行了总结。 


…………………………………………………………Page 40……………………………………………………………

28   软件测试的艺术 



                 表3…1   代码检查错误列表总结,第一部分 



           数据引用错误                       运算错误 



   1。 是否有引用的变量未赋值或未初始化?         1。 是否存在非算术变量间的运算? 



   2。 下标的值是否在范围之内?              2。 是否存在混合模式的运算? 



   3。 是否存在非整数下标?                3。 是否存在不同字长变量间的运算? 



   4。 是否存在虚调用?                  4。  目标变量的大小是否小于赋值大小? 



   5。 当使用别名时属性是否正确?             5。  中间结果是否上溢或下溢? 



   6。 记录和结构的属性是否匹配?             6。 是否存在被0 除? 



   7。 是否计算位串的地址?是否传递位串参数?       7。 是否存在二进制的不精确度? 



   8。 基础的存储属性是否正确?              8。变量的值是否超过了有意义的范围? 



   9。 跨过程的结构定义是否匹配?             9。 操作符的优先顺序是否被正确理解? 



  10。 索引或下标操作是否有“仅差一个”的错误?     10。 整数除法是否正确? 



  11。 继承需求是否得到满足? 



           数据声明错误                       比较错误 



   1。 是否所有的变量都已声明?              1。 是否存在不同类型变量间的比较? 



   2。 默认的属性是否被正确理解?             2。 是否存在混合模式的比较运算? 



   3。 数组和字符串的初始化是否正确?           3。  比较运算符是否正确? 



   4。 变量是否赋予了正确的长度、类型和存储类?      4。 布尔表达式是否正确? 



   5。 初始化是否与存储类相一致?             5。  比较运算是否与布尔表达式相混合? 



   6。 是否有相似的变量名?                6。 是否存在二进制小数的比较? 



                                7。 操作符的优先顺序是否被正确理解? 



                                8。 编译器对布尔表达式的计算方式是否 



                                 被正确理解? 



               表3…2   代码检查错误列表总结,第二部分 



          控制流程错误                       输入/输出错误 



   1。 是否超出了多条分支路径?              1。文件属性是否正确? 



   2。 是否每个循环都终止了?               2。OPEN语句是否正确? 



   3。 是否每个程序都终止了?               3。I/O语句是否符合格式规范? 



   4。 是否存在由于入口条件不满足而跳过循环体?      4。缓冲大小与记录大小是否匹配? 



   5。 可能的循环越界是否正确?              5。文件在使用前是否打开? 



   6。 是否存在“仅差一个”的迭代错误?          6。 文件在使用后是否关闭? 



   7。 DO/END语句是否匹配?             7。 文件结束条件是否被正确处理? 



   8。 是否存在不能穷尽的判断?              8。 是否处理了I/O错误? 



   9。 输出信息中是否有文字或语法错误? 



           接口错误                         其他检查 



   1。 形参的数量是否等于实参的数量?           1。 在交叉引用列表中是否存在未引用过 



   2。 形参的属性是否与实参的属性相匹配?          的变量? 



   3。 形参的量纲是否与实参的量纲相匹配?         2。 属性列表是否与预期的相一致? 



   4。 传递给被调用模块的实参个数是否等于         3。 是否存在“警告”或“提示”信息? 



    其形参个数?                      4。 是否对输入的合法性进行了检查? 


…………………………………………………………Page 41……………………………………………………………

                            第3章 
返回目录 上一页 下一页 回到顶部 9 9
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!