技术开发 频道

关于编写单元测试中的驱动模块

【IT168 技术文章】

    在网上闲逛的是后看到关于单元测试的东西,觉得非常不错,拿过来一同分享一下,测试中有一个pareto的原则,想必大家都知道,就是在需求和设计的静态测试中,可以发现80%的bug,但这是一个理想的状态。又有多少公司能够做到全面的需求和设计的静态测试呢,所以有很多公司会把一部分的精力放在单元测试里面,来进一步的靠近pareto的原则,一般来说,单元测试会详细描述,单元模块的划分,以及该模块的接口描述和说明。下面我来贴出来一段详细设计里面所设计到的模块的说明,我想对于有的看不到详细设计的测试工程师会有所帮助!
 ——————————————————————————————————————————————————————————————

    6、系统参数程序设计说明
    6.1程序描述
        显示传输系统参数配置界面

    6.2功能
        提供传输子系统系统正常运行所必需的参数。

    6.3性能
    6.4输入项
    输入数据:

    1.写参数配置文件:参数配置属性页;

    2.读参数配置文件:参数配置文件。

    输入说明:

    参数文件与系统互动,通过参数配置属性页建立/更新参数配置文件;

    各模块通过调用函数从参数配置文件中取得相应的参数值。

    6.5输出项
    输出数据:

    1.写参数配置文件:参数配置文件;

    2.读参数配置文件:参数配置属性页、各模块所需参数。

    输出说明:

    参数文件与系统互动,将参数配置文件中的参数值回显到参数配置属性页;各模块通过调用函数从参数配置文件中取得相应的参数值;

    6.6算法
    参数配置文件位于系统程序的运行目录,名称:Octdts.Properties。参数配置文件涉及到整个系统的正常运行,故参数配置文件的管理异常重要,一般情况下,不允许对参数配置文件直接进行手工修改,须通过程序实现对参数配置文件的更新;为了最大程度上的实现系统的通用性,参数配置文件中所包含的参数很详细,基本函概了系统所需的动态参数;由于设计到安全问题,数据库用户密码不以明文方式记录在参数配置文件中,调用一个加密算法对密码进行加密,在取密码时,需调用一个解密算法。

    6.7流程逻辑

    6.8接口

    序号
    调用者
    被调用者
 
    1.      
     类名称:FrameMain

    类说明:程序主界面

    调用说明:按钮、菜单显示参数配置界面
    名称:本类的实例化对象 ParameterPage

    调用说明:show()、toFront()方法

    2.      
     各个服务模块
     调用说明:直接调用getParam()方法

    那么对于这一个单元模块来讲,在开发时是再涉及到单元测试时,往往show(),toFront()方法还没有开发出来,所以测试工程师需要独立开发驱动模块或桩模块。,驱动模块和桩模块的概念如下,网上有很多概念,不好理解,我认为用这种说法更方便理解。

    驱动模块在大多数场合称为"主程序",它接收测试数据并将这些数据传递到被测试模块,相反桩模块就是那些被测试模块所调用的“程序”,它们之间的区别是调用与被调用的关系。

    往往被测试单元的上层程序还没有开发出来我们就需要实施单元测试,上层程序有时要包含多个调用界面,函数,方法等,而我们测试的单元模块的期望结果有可能只有返回一个值或是传递一个参数,这时候就需要编写驱动模块或者是桩模块(如果是需要调用其它函数返回的值)。

    如何编写桩模块?举一个简单的例子


/*被测程序*/
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;
}
——————————————————————————
    驱动模块编写完毕后,就可以直接实施单元测试而不必等待上层的程序开发出来才能进行测试,提高工作效率。

0
相关文章