现在的位置: 首页 > 综合 > 正文

桩模块和驱动模块

2013年06月30日 ⁄ 综合 ⁄ 共 1777字 ⁄ 字号 评论关闭

很多人对桩模块和驱动模块的概念会搞不清楚,下面先介绍这两个概念:
桩模块:集成测试前要为被测模块编制一些模拟其下级模块功能的“替身”模块,以代替被测模块的接口,接受或传递被测模块的数据,这些专供测试用的“假”模块称为被测模块的桩模块。
驱动模块:在大多数场合称为"主程序",它接收测试数据并将这些数据传递到被测试模块
桩模块就是用来代替所测的子模块,它不能为空,但也不需要那个子模块的所有功能都实现,只要实现在一部分就行了;
驱动模块就是用来代替主模块,用它来调用子模块。
简单的说,被测模块上层为驱动模块,是调用被测模块的,被测模块下层为桩模块,是被 被测模块调用的。

假设现在项目组把任务分给了7个人,每个人负责实现一个模块。你负责的是B模块,你很优秀,第一个完成了编码工作,现在需要开展单元测试工作,先分析结构图:

桩模块和驱动模块--概念介绍 - 阳光.雨 - 明天是阳光,还是雨,谁也不知道.
  1、由于B模块不是最顶层模块,所以它一定不包含main函数(A模块包含main函数),也就不能独立运行。
  2、B模块调用了D模块和E模块,而目前D模块和E模块都还没有开发好,那么想让B模块通过编译器的编译也是不可能的。
  那么怎样才能测试B模块呢?需要做:
  1、写两个模块Sd和Se分别代替D模块和E模块(函数名、返回值、传递的参数相同),这样B模块就可以通过编译了。Sd模块和Se模块就是桩模块。
  2、写一个模块Da用来代替A模块,里面包含main函数,可以在main函数中调用B模块,让B模块运行起来。Da模块就是驱动模块。
  知识点:
  桩模块的使命除了使得程序能够编译通过之外,还需要模拟返回被代替的模块的各种可能返回值(什么时候返回什么值需要根据测试用例的情况来决定)。
  驱动模块的使命就是根据测试用例的设计去调用被测试模块,并且判断被测试模块的返回值是否与测试用例的预期结果相符。

 

驱动模块是调用被测对象,桩是被测对象调用的虚拟块

虚拟块也是有测试人员写的一个模块,就是那个所谓的桩

驱动模块是为了驱动被测模块而编写的模拟块,而桩模块相当于被测模块要调用的块的虚拟。

驱动模块主要完成以下事情:

1、接受测试输入;

2、对输入进行判断;

3、将输入传给被测单元,驱动被测单元执行;

4、接受被测单元执行结果,并对结果进行判断;

5、将判断结果作为用例执行结果输出测试报告。

被测单元用什么语言,驱动就用什么语言写。

总而言之,写驱动和桩不需要太高深编程知识。如果有模板或框架作为参考的话,差不多就成了一个体力活。

一个简单例子:

/*被测程序*/
int Fun(int in)
{
   if (in >= 0)
   {
       return 1;
   }
   else
   {
       return -1;
   }
}

那么通过TCL进行扩展指令编写时,针对该被测函数,驱动如下:

/*用户自己扩展的用户指令,用来驱动被测函数*/

int Ex_TestFun(ClientData clientData,Tcl_Interp * interp,int argc, char* argv[])
{
    int i;
    int ret,iExceptedRet;
   //打开测试结果记录文件
   FILE * out;
   out = fopen("D:\\result.txt","a");
   //第一步:检查用户输入参数个数是否正确
   if (3 != argc)
   {
       fputs("Parameters error",out);
       fflush(out);
               return TCL_ERROR;
   } 
  //第二步:取出用户输入参数
   if (TCL_OK != Tcl_GetInt(interp,argv[1],&i))
  {
             return TCL_ERROR;           
  }
  if (TCL_OK != Tcl_GetInt(interp,argv[2],&iExceptedRet))
  {
       return TCL_ERROR;
  }
  //第三步:将参数传递给被测函数
  ret = Fun(i);
  //第四步:将被测函数执行结果和输入的期望结果进行比较,根据比较结果作为用例执行结果输出到测试报告中
 if (ret != iExceptedRet)
  {
       fputs("test fail",out);
       fflush(out);
  }
  else
  {
       fputs("test success",out);
       fflush(out);
  }
  return TCL_OK;
}

本文来自:http://lsshappy007.blog.163.com/blog/static/3582025120108953750255/

抱歉!评论已关闭.