局部数据结构—软件测试核心技术(12)

发表于:2020-9-01 09:41

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:51Testing教研团队    来源:51Testing软件测试网原创

  2.局部数据结构
  单元的局部数据结构是最常见的错误来源之一。在单元工作的过程中,必须测试单元内部的数据能否完整,确保内部数据的内容、形式及相互关系不发生错误。
  对于局部数据结构,应该在单元测试中注意以下几类错误。
  (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; 
  3.独立路径
  对基本执行路径和循环进行测试会发现大量的错误。通过设计的测试用例查找由于错误的计算、不正确的比较或不正常的控制流而导致的错误。
  常见的错误如下。
  (1)运算的优先级次序不正确或误解了运算的优先次序。例如,+、?的优先级高于 >> 和 <<,因此a = b + c >> 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);
       …
  }
  4.异常处理
  比较完善的单元设计要求能预见异常的条件,并设置适当的异常处理,以便在程序异常时能调整异常程序,保证其逻辑上的正确性。异常处理模块经常出现的错误或缺陷如下。
  (1)异常的描述难以理解。例如,对于常见的用户登录界面,输入用户名和密码即可完成登录,若用户名和密码错误,错误提示为“Error code00001”。
  (2)异常的描述不足以定位错误和确定异常的原因,如“登录失败”。
  (3)显示的错误与实际的错误不符。例如,用户名错误,结果却提示“密码错误”。
  (4)对错误条件的处理不正确。例如,提示“密码错误”,但单击“确定”按钮后仍能登录成功。
  (5)在对错误进行处理之前,错误条件已经引起系统的干预等。严重的错误会导致操作系统的干预。例如,实现购买商品的单元没有进行事务及异常管理,在生成订购关系时异常,导致用户扣款却没有生成送货订单。
  5.边界条件
  边界上出现错误是常见的,因此应当认真、仔细地测试边界处单元是否能够正常工作。不仅要注意一些可能与边界有关的数据类型,如数值、字符等,还要注意这些边界的首个值、最后一个值、最大值、最小值等。
  在第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)评估基准不同。
  ① 单元测试的评估基准主要是逻辑覆盖率。
  ② 集成测试的评估基准主要是接口覆盖率。
  ③ 系统测试的评估基准主要是测试用例对需求说明书的覆盖率。

查看《软件测试核心技术 从理论到实践》全部连载章节
版权声明:51Testing软件测试网获得人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号