单元测试的关键难题——内部输入

发表于:2012-12-03 10:29

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

 作者:wangwencong    来源:51Testing软件测试网采编

  只有深刻理解内部输入,才能真正理解单元测试。单元测试是针对代码单元的独立测试,一个函数,在调用了底层函数的情况下(底层函数可能不存在、不可控、不得不隔离、甚至有错误),如何能够独立测试?正是因为底层函数的输出,可以视为被测函数的内部输入,才能真正进行独立测试。

  为了理解内部输入,这里用两组功能完全一样代码来进一步解释(差异部分用粗体标出):

  代码一:

//计算圆的外接正方形的面积,参数r为圆的半径
int GetArea(int r)
{
      return (r+r) * (r+r);
}

//判断指定的正方形是否可以容纳圆
//参数int r:圆的半径
//参数int x:指定正方形的边长
//返回值:不能容纳,返回-1;正好可以容纳,返回0;有多余空间,返回1
int Compare(int r, int x)
{
      int a1 = GetArea(r);
    int a2 = x * x;     
     
      if(a1 == a2) return 0;
      if(a1 < a2) return 1;
      return -1;
}

//调用compare
int Func(int r, int x)
{
    int result = Compare(r, x);
      printf("result %d\n", result);
      return result;
}

  代码二:

//计算圆的外接正方形的面积,参数r为圆的半径
int GetArea(int r)
{
      return (r+r) * (r+r);
}

//判断指定的正方形是否可以容纳圆
//参数int r:圆的半径
//参数int x:指定正方形的边长
//返回值:不能容纳,返回-1;正好可以容纳,返回0;有多余空间,返回1
int Compare(int a1, int x)
{
    int a2 = x * x;
      if(a1 == a2) return 0;
      if(a1 < a2) return 1;
      return -1;
}

//调用compare
int Func(int r, int x)
{
      int a1 = GetArea(r);
    int result = Compare(a1, x);
      printf("result %d\n", result);
      return result;
}

  假如我们的测试目标是函数Compare(),两组代码的差别在于圆的外接正方形面积a1的获得方式,代码一在Compare()内部调用GetArea()取得,代码二则由参数传递。Compare()的功能是,计算指定正方形的面积a2后与外接正方形面积a1比较,也就是说,要测试的是程序对a1和a2的各种可能是否做了合适的处理,至于a1由参数传递还是通过内部调用GetArea()取得,并无本质区别。GetArea()本身是否正确,不是我们的测试目标,即使GetArea()未实现,或者用桩来代替,Compare()也一样可以测试。

  调用底层函数获得数据的过程,对于被测试函数来说,只不过是取得一种输入数据的过程。无论底层函数是否正确或者是否存在,只要被测函数对输入(包括内部输入)的各种可能做了正确的处理,被测函数本身就不会有功能错误。设计用例时,只有把内部输入与参数等外部输入同等对待,并覆盖其各种可能,才能真正完整检测代码的功能逻辑,才能保证测试效果。

  内部输入是单元测试的关键难题。并不是所有底层函数都会产生内部输入,如果底层函数没有产生被测函数需要使用的输出,这种情形可以不处置;如果底层函数产生了被测函数需要使用的输出,就形成了内部输入。

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号