出品 | 51Testing软件测试网
02.
局部数据结构
单元的局部数据结构是最常见的错误来源之一。在单元工作的过程中,必须测试单元内部的数据能否完整,确保内部数据的内容、形式及相互关系不发生错误。
对于局部数据结构,应该在单元测试中注意以下几类错误。
(1)使用不正确或不一致的数据类型。
不正确的数据类型。例如,char a中,由于char?是无符号字符数据类型,占2字节(Unicode码),范围是0~65535,因此a永远不为负,如果用a小于0作为循环结束条件,肯定会进入死循环。
不一致的数据类型。例如,以下两个单元之间需要传递一个学生对象(包括姓名、身高、年龄),结果两个单元对学生对象的属性定义不一致,导致错误。
public class Student{ String name; int height; int age;}public class Student{ String name; float height; int age;}
(2)使用尚未赋值或尚未初始化的变量。例如,在以下代码中,变量age未初始化,编译无法通过,会报错。
int age; System.out.println(age);
(3)使用错误的初始值或错误的默认值。例如,以下代码无法正确编译,会报错。
int a=2147483648;
因为在Java中,int的取值范围为 2 147 483 648~2 147 483 647,占用4字节。
(4)变量名拼写错误或书写错误,如addMember写成addMenber等。
(5)使用不一致的数据类型。例如,以下代码会导致b的精度降低。
int a; float b; a=b;
03.
独立路径
对基本执行路径和循环进行测试会发现大量的错误。通过设计的测试用例查找由于错误的计算、不正确的比较或不正常的控制流而导致的错误。
常见的错误如下。
(1)运算的优先级次序不正确或误解了运算的优先次序。例如,+、?的优先级高于 >> 和 <> 2相当于a = ( b + c )/4,而不是a = b + c/4(使用括号,有利于阅读,也不易出错)。
很多运算符拥有相同的优先级,一起使用的时候要注意它们的执行顺序。单目运算符、赋值运算符和“?:”的执行顺序是从右到左,其余运算符的执行顺序是从左到右。
(2)运算方式错误。例如,把a=b++(先给a赋值再递增b)误写为a=++b(b先加1再给a赋值)。
(3)对不同数据类型进行比较。例如,以下代码容易进入死循环。
char x = '1'; int y = 0; while (x > y) {}
(4)关系表达式中使用了不正确的变量和比较符。例如,将if(a==1)写成if(a=1)(有一种防止误写的办法,写成1==a)。再如,将&&写成&,在if(a>0&&b>0)中,若a>0不成立,则不再判断b>0;若写作if(a>0&b>0),则a>0和b>0都要进行判断。
(5)“差1错”,即不正确地多循环或少循环一次。
例如,整型数组A[100]表示数组的实际长度是100,可以存储100个整数,数组的下标从0开始,这100个元素的表示方式是A[0],A[1],…,A[99],而下面这个循环中,获取数组中的元素是A[0],A[1],…,A[100],超出了数组下标的最大值,这称为数组下标越界。
int A[100]; int sum=0; … for(i=0;i<=100;i++) sum+=A[i];
(6)使用了错误的或不可能的循环终止条件,如while(|a|<0)。
(7)当遇到发散的迭代时不能终止循环。
① 可能一直递归下去,找不到返回的路径。例如,以下代码会一直直接递归。
public int func (int n) { int i; … func(n-1); … }
② 递归嵌套的层次太深,每嵌套调用一次都要消耗堆栈资源,可能会导致递归还未到回归点时,堆栈资源已被耗光。例如,以下代码会一直间接递归。
public int funcA (int n) { funcB(); … } public int funcB() { int m; funcA(m); … }
04.
异常处理
比较完善的单元设计要求能预见异常的条件,并设置适当的异常处理,以便在程序异常时能调整异常程序,保证其逻辑上的正确性。异常处理模块经常出现的错误或缺陷如下。
(1)异常的描述难以理解。例如,对于常见的用户登录界面,输入用户名和密码即可完成登录,若用户名和密码错误,错误提示为“Error code00001”。
(2)异常的描述不足以定位错误和确定异常的原因,如“登录失败”。
(3)显示的错误与实际的错误不符。例如,用户名错误,结果却提示“密码错误”。
(4)对错误条件的处理不正确。例如,提示“密码错误”,但单击“确定”按钮后仍能登录成功。
(5)在对错误进行处理之前,错误条件已经引起系统的干预等。严重的错误会导致操作系统的干预。例如,实现购买商品的单元没有进行事务及异常管理,在生成订购关系时异常,导致用户扣款却没有生成送货订单。
05.
边界条件
边界上出现错误是常见的,因此应当认真、仔细地测试边界处单元是否能够正常工作。不仅要注意一些可能与边界有关的数据类型,如数值、字符等,还要注意这些边界的首个值、最后一个值、最大值、最小值等。
在第n次循环中取最大值或最小值时容易发生错误。例如:
int sum = 0; int[] a = new int[] { 1,2,3,4,5,6,7,8,9,0 }; for (int i = 1; i <= 10; i++) { sum = sum + a[i]; }
特别要注意数据流与控制流中刚好等于、大于、小于确定的边界值时出现错误的可能性。
10.1.4
单元测试和集成测试、系统测试的区别
单元测试和集成测试、系统测试的区别如下。
(1)测试方法不同。
① 单元测试属于白盒测试。
② 集成测试属于灰盒测试。
③ 系统测试属于黑盒测试。
(2)考察范围不同。
① 单元测试主要测试单元内部的数据结构、逻辑控制、异常处理等。
② 集成测试主要测试模块之间的接口和接口数据的传递关系,以及模块组合后的整体功能。
③ 系统测试主要测试整个系统相对于需求的符合度。
(3)评估基准不同。
① 单元测试的评估基准主要是逻辑覆盖率。
② 集成测试的评估基准主要是接口覆盖率。
③ 系统测试的评估基准主要是测试用例对需求说明书的覆盖率。
... ...扫码/点击,查看独家连载
戳