51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1936|回复: 26
打印 上一主题 下一主题

单元测试的桩函数问题

[复制链接]
  • TA的每日心情
    开心
    2014-11-11 09:38
  • 签到天数: 2 天

    连续签到: 2 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2007-5-20 21:23:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    在我们课本第一册单元测试后有个课后习题:

    函数A判断X和Y的大小来运行函数B或函数C
    函数B返回X加Y的值
    函数C返回X减Y的值


    例如:我们对函数A和函数B进行测试时,要写一个桩函数。

    问题1:我们要写的这个桩函数是不是就是函数C?

    问题2:如果不是,那么我们是不是还要先对这个桩函数进行测试呢?
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    该用户从未签到

    2#
    发表于 2007-5-20 22:59:52 | 只看该作者
    我认为不是
    我们设计桩函数时一般要根据单元的LLD,针对不同的输入得到不同的输出。也就是把自己设计的用例写成桩单元就行
    需不需要进行测试是看你采用的什么测试策略是自顶向下还是自底向上
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3#
    发表于 2007-5-21 11:24:02 | 只看该作者
    答问题1:首先应搞清桩的概念。我们要写的这个桩函数不是函数C,而是为函数C写桩,来代替函数C.
    我们对函数A和函数B进行单元测试时其实是为了验证函数B的正确性,写桩是为了更好的定位错误。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-11-11 09:38
  • 签到天数: 2 天

    连续签到: 2 天

    [LV.1]测试小兵

    4#
     楼主| 发表于 2007-5-21 17:30:53 | 只看该作者
    那么请问这个桩函数就该怎样写?能否贴出具体的内容?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    5#
    发表于 2007-5-21 20:18:57 | 只看该作者
    当然不是函数C,而是用来替代C的函数,这个函数可以说是不用测试的,在编写时就要确保没有问题的,因为这个函数比较简单,所以它的正确性容易保证

    测A函数时,要写两个桩函数代替B和C,具体写桩是要根据用例来写的
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6#
    发表于 2007-5-21 20:45:57 | 只看该作者
    具体题目我忘了,假如X>Y时就调用加法函数B,并且你设计了如下两个用例:
    Test Case 1: x=2,y=1 Expected output value:3
    Test Case 2: x=1,y=-1 Expected output value:0
    那么用来代替B函数的桩函数就可以这么写:
    int stub_Add(int x, int y)
    {
        if((x==2)&&(y==1))
           return 3;  
        else if((x==1)&&(y==-1))
            return 0;
         else
            return 100;
    }

    [ 本帖最后由 gzj_06 于 2007-5-22 07:31 编辑 ]
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7#
    发表于 2007-5-21 20:48:17 | 只看该作者
    测试函数A,则要编写函数B和函数C的桩函数,就是用桩函数代替函数B和函数C.
    测试函数A和函数B,则要编写函数C的桩函数,就是用桩函数代替函数C.
    如果X-Y=-1
    则可以写成:
    int stub_sub(int x,int y) /*桩函数*/
    {
      if((1==x)&&(2==y))
        return -1;
      else
        return 888;
    }
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8#
    发表于 2007-5-21 21:21:10 | 只看该作者
    A         
    /  \
    B   C

    int Function_A(int x , int y)
    {
       if( x >= y)
       return add_B(x,y);
      else
       return sub_C(x,y);
    }

    设计测试用例
                   case 1          case2
    输入       x=1, y=2      x=2, y=1
    预期输出    -1                  3


    设计桩函数

    int stub_add_B(int x, int y)
    {
       if ( (2 == x) &&(1 == y) )
         return 3;
       else
         return 9999; //返回 9999 是为了能够明显的看出程序的输出结果异常
    }

    int stub_sub_C(int x, int y)
    {
       if ( (1 == x) && ( 2 == y) )
          return -1;
       else
         return 8888;   //输出8888 也是为了能够看出程序有明显的异常
    }

    设计驱动函数

    void drive_A()
    {
       int result = 0;
       result = Function_A(1,2);
       if ( -1 == result)
        printf("Case1 Pass! \n");
       else
        printf("Case1 Fail! \n");

       result = Function_A(2,1);

       if ( 3 == result)
       printf("Case2 Pass! \n");
       else
       printf("Case2 Fail! \n");
    }
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2007-5-21 22:07:01 | 只看该作者
    同意8楼,b和c应该是属于被a调用,而不是桩~
    最直接的做桩就是直接输入数值进行判断~楼上讲的很明白~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2007-5-22 08:14:18 | 只看该作者
    如果采用自顶向下的单元测试策略,那么要先测A函数,由于A没有被任何函数调用,并且如果A可以自己驱动的话(我这里都是基于这一假设,如果不能驱动,那么也要写驱动,请参考8楼),那么就不需要写驱动函数,但A要调用B和C,所以必须要写分别用来代替B和C的桩函数,具体内容参见8楼,8楼写的很详细;然后接着测B,此时A已被测试通过,所以直接可以用A作为驱动,但C必须要改为桩;最后测C,由于此时A和B均已测试通过,所以仍然用A作为驱动,而B也可以直接使用,不需要桩

    如果采用孤立的单元测试策略,那么测这三个函数没有先后顺序,测A时不要驱动,但要两个桩,测B和C时都是只要写驱动即可,不需要桩,因为它们没有调用别的函数

    如果采用自底向上的单元测试策略,那么要先测B或C,此时的方法与孤立策略相同,测A时,由于B和C均已测试通过,所以不需要桩,直接使用即可

    [ 本帖最后由 gzj_06 于 2007-5-22 08:31 编辑 ]
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-11-11 09:38
  • 签到天数: 2 天

    连续签到: 2 天

    [LV.1]测试小兵

    11#
     楼主| 发表于 2007-5-22 12:49:36 | 只看该作者

    明白了

    谢谢各位的指教
    我明白了桩函数和驱动函数都是根据我们设计的测试用例,
    把具体的数值代入程序中,
    然后查看运行结果是否准确
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    12#
    发表于 2007-5-22 19:48:06 | 只看该作者
    sdlkfj3
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2007-5-22 21:24:41 | 只看该作者
    这个还是偶们的作业呢,只是交上去也没评点...期待老师的指教.sdlkfj3
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    14#
    发表于 2007-5-23 12:24:53 | 只看该作者
    这道题我做了,也问了老师,现把我做的传上来,以便大家交流与沟通!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    15#
    发表于 2007-5-23 12:30:13 | 只看该作者
    设计桩和驱动还有从测试策略方面来考虑。
    我是采用由顶至下的策略来测试的,因为 A 调用了 B和C ,所以要为 B,C 设计桩,
    如果要采用由底至上的策略来测试,那么首先要对 B,C 分别进行孤立测试,
    然后用函数A 作为驱动来测试,在测试A的时候,就可以直接调用B,C了,这样可以减少桩的开发。
    基本理论就是这些,具体情况还有根据自己工作中的一些规定和需要灵活进行。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16#
    发表于 2007-5-24 21:11:05 | 只看该作者
    sdlkfj3
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    17#
    发表于 2007-5-25 13:45:47 | 只看该作者
    不错
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    18#
    发表于 2007-5-30 09:20:05 | 只看该作者
    函数B和函数C进行孤立测试,是不是只要写驱动呢?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19#
    发表于 2007-5-30 17:51:08 | 只看该作者
    好东西啊
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20#
    发表于 2007-5-30 19:44:37 | 只看该作者
    原帖由 jiangyuetian 于 2007-5-30 09:20 发表
    函数B和函数C进行孤立测试,是不是只要写驱动呢?



    如果函数B和C,只是被其他函数调用,那么B和C就是最底层的函数,所以我们在
    测试B和C的时候,就只需要针对B,C的输入条件进行用例设计,针对B,C的输出
    条件进行结果判断。
    当然,这个例子只是一个最理想情况下的,最简单的例子了,在实际的工作中,软
    件函数的调用关系要复杂的多。
    根据开发平台的不同,单元测试的框架也有很大的差别。所以在51testing,需要重
    点掌握测试的基本理论和方法,这样在进行用例设计的时候才能够尽可能多的覆盖
    所有条件。
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-28 07:24 , Processed in 0.094997 second(s), 25 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表