3.3.2 数据申明错误
1. 是否所有的变量都进行了明确的声明?没有明确声明虽然不一定是错误,但通常却是麻烦的源头。举例来说,如果一个程序的子程序接收一个数组参数,却未将该参数定义为数组(如用DIMENSION 语句),对该数组的引用(如C=A (I))会被解释为一个函数调用,导致计算机试图将此数组当作程序执行。另外,如果某个变量在一个内部过程或程序坏中没有明确声明,是否可以理解为该变量在这个程序块中被共用?
2. 如果变量所有的属性在声明中没有明确说明,那么说明默认的属性能否被正确理解?举例来说,在JAVA语言中,程序接收到的恶魔人属性往往是导致意外发生的源头。 3. 如果变量在声明语句中被初始化,那么它的初始化是否正确?在很多语言中,数组和字符串的初始化比较复杂,因此也成为容易错误的地方。
4. 是否每个变量都被赋予了正确的长度和数据类型?
5. 变量的初始化是否与其存储空间的类型一致?举例来说,如果FORTRAN语言子程序中的一个变量在每次调用子程序时都需要重新初始化一次,那么必须使用赋值语句对其初始化,而不应该用DATA语句。
6. 是否存在着相似名称的变量(如VOLT和VOLTS)?这种情况不一定是错误、但应被视为警告,这些名称可能会在程序中发生混淆。
3.3.3 运算错误
1. 是否存在不一致的数据类型(如非算术类型)的变量的运算?
2. 是否有混合模式的运算?例如,将浮点变量与一个整形变量做加法运算。这种情况并不一定是错误,但应该谨慎使用,确保程序语言的转换规则能够被正确理解。卡看下面的JAVA程序片段,显示了整数运算中可能发生的取整误差:
int x = 1; int y = 2; int z = 0; z = x/y;
System.out.pirntln(“z = “+ z); Output; Z = 0;
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.是否有不同数据的变量之间的比较运算,例如,将字符串与地址、日期或数字相比较? 2.是否有混合模式的比较运算,或不同长度的变量间的比较运算?如果有,应确保程序能正确理解转换规则。
3.比较运算符是否正确?程序员经常混淆“至多”、“至少”、“大于”、“不大于”、“小于”和“等于”等比较关系。
4.每个布尔表达式所叙述的内容是否都正确?在编写涉及“与”、“或”或“非”的表达式时,测试员经常犯错。
5.布尔运算的操作数是否是布尔类型的?比较运算符和布尔运算符是否错误地混在了一起?这是一类经常会犯的错误,这里我们描述几个典型错误的例子。如果想判断i是否在2~10之间,表达式2x||y也是不正确的,正确的应该是(i>x)||(i>)y。如果要比较三个数字是否相等,表达式if(a= =b = = c)的实际意思却大相径庭。如果许啊哟验证数学关系x>y>z,正确的表达式应该是(x>y)&&(y>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语句,索引变量的值是否会大于可能的分支数量?例如,在语句
GO TO (200 ,300,400),i
2.是否所有的循环最终终止了?应设计一个非正式的证明或论据来证明每一个循环打击都会终止。
3.程序、模块或子程序是否最终终止了?
4.由于实际情况没有满足循环的入口条件,循环是否有可能从未执行过?如果确实发生这种情况,这里是否是一处疏漏?例如,如果循环一下的语句作为开头:
For (I = =x; i<=z;i ++){ … }
While (NOTFOUND){ … }
当NOTFOUND初始时就为假,或者x大于z时,情况会如何呢?
5.如果循环同时由迭代变量和一个布尔条件所控制(如一个搜索循环),如果循环越界(fall-through)了,后果会如何?例如,伪指令循环以
DO I=1 TO TABLESIZE WHILE (NOTFOUND)
开头,如果NOTFOUND永不为假,会发生什么结果呢?
6.是否存在“仅差一个”的错误,如迭代数量恰恰多一次或少一次?这在从0开始的循环中是常见的错误。我们会经常忘记将“0”作为一次计数。举例来说,如果想编写一段JAVA代码执行10次循环,下面的语句是错误的,因为它执行了11次:
For ( int i=0;i<=10;i++) { }
正确的应该是执行10次循环: For ( int i = 0 ;Ii <=9; i++) { }
7.如果编程语言中有语句组成代码的概念 (例如do-while或{…}),是否每一组语句都有一个明确的while语句,并且do语句也与其相应的语句组对应?或者,是否每一个左括号多对应有一个右括号?目前的大多数编译器都能识别保护这些不匹配的情况。
System.out.println ( i); System.out.println( i );
8.是否存在不能穷尽的判断?举例来说,如果一个输入参数测预期值是1.2或3,当参数值不为1或2时,在逻辑上是否假设了参数必定为3?如果是这样的话,这种假设是否有效?
3.3.6 接口错误
1.被调用模块接收到的参数(parameter)数量是否等于调用模块发送的参数(argument)数量?另外,顺序是否正确?
2.参数的属性(如数据类型和大小)是否与相应形参的属性相匹配?
3.实参的量纲是否与对应的量纲相匹配?举例来说,是否形参以度为单位而实参以弧度为单位?
4.此模块传递给彼此的实参数量,是否等于彼此模块期望的形参数量?
5.此模块传递给彼此模块的实参的属性,是否与彼此模块相应形参的属性相匹配? 6.此模块传递给彼此模块的实参的量纲,是否与彼此相应形参的量纲相匹配? 7.如果调用了内置函数,实参的数量,属性,顺序是否正确?
8.如果某个模块或类有多个人口点,是否引用了与当前人口点无关的形参?下面PL/I程序的第二个赋值语句就存在这种错误;
A: PROCEDURE( W,X);
W = X +1; REJURN
B: ENTRY ( Y,Z);
Y = X+Z; END;
9.是否有子程序改变了某个原本仅为输入值的形参?
10.如果存在全局变量,所有引用他们额模块中,它们的定义和属性是否形同? 11.常量是否以参数形式传递过?在一些用FOTRAN语言编写的程序中,诸如 CALL SUBX (J,3)
的语句是很危险的,因为如果子程序SUBX对其第二个形参进行赋值,常数3的值将会改变。
3.3.7 输入/输出错误
1.如果对文件明确声明过,其属性是否正确? 2.打开文件的语句中各项属性的设置是否正确?
3.格式规范是否与I/O语句中相一致(就各项的数量和属性而言)? 4.是否有足够的可用内存空间,来保留程序将读取额文件? 5.是否所有的文件在使用之前都打开了? 6.是否所有的文件在使用之后都关闭了? 7.是否判断文件结束的条件,并正确处理? 8.对I/O出错情况处理是否正确?
9.任何打印或显示的文本信息中是否存在拼写或语法错误?
3.3.8 其他检查
1.如果编译器建立了一个标识符交叉引用列表,那么对该列表进行检查,查看是否有变量从未引用过,或仅被引用过一次。
2.如果编译器建立了一个属性列表,那么对每个变量的属性进行检查,确保没有赋予过不希望的默认属性值。
3.如果程序编译通过了,但计算机提供了一个或多个“警告”或“提示”信息,应对此逐一进行认真检查。“警告”信息指出编译器对程序某些操作的正确性哟所怀疑;所有这些疑问都应进行检查。“提示”信息可能会罗列出没有声明的变量,或者是不利于代码优化的用法。 4.程序或模块是否具有足够的鲁棒性?也就是说,它是否对其输入的合法性进行了检查? 5.测试是否遗漏了某个更能?
这些检查列表在表3-1和表3-2中进行了总结。
表3-1 代码检查错误列表总结,第一部分 数据引用错误 1.是否有引用的变量未赋值或未初始化? 2.下标的值是否在范围之内? 3.是否存在非整数下标? 4.是否存在虚调度? 5.当使用别名时属性是否正确? 6.记录和结构的属性是否匹配? 7.是否计算位串的地址?是否传递位串参数? 8.基础的存储属性是否正确? 9.夸过程的结构操作是否匹配 运算错误 1.是否存在非算术变量间的运算? 2.是否存心混合模式的运算? 3.是否存在不同字长变量间的运算? 4.目标变量的大小是否小于赋值大小? 5.中间结果是否上溢或下溢? 6.是否存在被0除? 7.是否存在二进制的不精确度? 8.变量的值是否超过了有意义的范围? 9.操作符的优先级顺序优先级是否被正确理解?
软件测试的艺术毕业论文
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)