一种软件单元的测试方法

文档序号:6556803阅读:237来源:国知局
专利名称:一种软件单元的测试方法
技术领域
本发明涉及软件测试技术,特别是涉及一种软件单元的测试方法。
背景技术
单元测试是面向函数级的测试,在DSP软件开发过程中,如何有效地进行单元测试一直是一个令人十分头疼的问题。与其它的开发环境不同,DSP软件没有专门的自动化测试工具可供使用,因此,目前普遍采用的DSP软件单元测试方法一般是编写测试程序,将其与被测程序一起编译、加载,并手工单步执行来观察测试结果是否正确。
图1为现有单元测试方法执行流程示意图。
以下将参阅图1说明现有单元检测方法。由于尚无合适的自动化测试工具,因此目前DSP软件的单元测试方法只能针对测试用例逐个进行,其步骤为编写测试程序,这里的测试程序包括驱动函数、桩函数以及测试用例;设置测试条件和观测点;将测试程序与被测程序一起编译、加载;手工单步执行并观测测试结果。
测试用例的修改需要重新编译和加载源程序,且多数情况下,需要修改源程序。其中的源程序包括测试程序和被测程序,被测程序包括所有需要测试的被测单元。
显然,这种测试方法至少有如下几个方面的缺陷1.不能批量和自动化,每条测试用例都必须在人工干预下执行,既不方便,又浪费了大量宝贵时间。尤其在测试用例较多的情况下,测试时间和效果都得不到保证;2.测试过程中需要不断地编写和修改驱动函数,而每次修改都需要重新编译及加载源程序,并设置各种变量,效率十分低下;
3.被测程序与测试程序一起编译、加载,不利于版本的管理,容易造成版本混乱;4.回归测试困难,可重复性差。
另一方面,DSP是通信设备中最常用的芯片之一,DSP软件在整个通信软件中无处不在,因此如何在DSP上实现自动化测试、如何提高测试的可重复性,对于保障和提升DSP上的软件质量具有非同寻常的意义。

发明内容
本发明的目的在于,提供一种软件单元的测试方法,通过测试脚本和驱动脚本从程序外部对被测单元的测试进行控制,实现自动化测试。
本发明的软件单元的测试方法,包括以下步骤步骤一,驱动脚本触发主函数运行,并控制程序运行到驱动函数的起始处,其中驱动函数由主函数调用;步骤二,测试脚本触发驱动函数运行,在驱动函数中调用执行被测单元。
在上述步骤二中,被测单元的调用执行包括以下步骤在驱动函数中将输入参数传递给被测单元;在预置条件下调用执行被测单元;测试脚本控制程序运行到预先设置的测试用例结束标签处。
上述测试用例所需的预置条件和输入参数预先设置在测试脚本中,包括函数涉及的各全局变量的取值、输入参数、以及桩函数的输出。
在上述方法的步骤二之后进一步包括步骤三,本测试用例执行完毕,由测试脚本输出本测试用例的执行结果。
在上述方法的步骤三之后进一步包括步骤四,测试脚本判断是否还有测试用例需要测试,如果有则返回到步骤二,否则结束测试。
另外,测试脚本中进一步设置全局的被测单元函数指针及存储输入参数的数组,在步骤二中驱动函数通过调用被测单元函数指针来完成被测单元在预置条件下的调用执行。
另外,在上述方法的步骤一之前进一步包括对脚本语言进行初始化的步骤。
与现有技术相比,本发明的有益效果是本发明通过编写并且执行脚本(驱动脚本和测试脚本),从外部对被测程序的测试进行控制,由于这种方法用测试脚本取代了原来的测试程序,而脚本与源程序物理上是分离的,两者不在一起编译,因此测试时只涉及脚本的改动,无需修改源程序。


图1为现有单元检测方法的流程图。
图2为本发明软件单元的测试方法进行单个被测单元单个测试用例测试时的流程图。
图3为本发明软件单元的测试方法进行单个被测单元多个测试用例测试时的流程图。
图4为本发明软件单元的测试方法进行多个被测单元多个测试用例测试时的流程图。
具体实施例方式
本发明提供一种可在DSP芯片上进行软件单元自动化测试的方法,它利用DSP能够支持的脚本语言来实现,通过编写和执行脚本,在不改动源程序的情况下,从片外控制片内的程序运行、获得测试结果,从而达到自动化测试的目的。本发明中所提到的“程序”是指源程序的编译链接结果,它最终将被加载到DSP上执行。
以下将结合附图及具体实施例来说明本发明利用脚本语言实现软件单元的自动化测试的方法。
实施例单个被测单元单个用例的测试如图2所示,首先考虑最简单的、对单个被测单元的单个用例进行测试的情况。对于单个被测单元的单个用例的测试,其过程为步骤11,首先进行脚本语言初始化(这一步不是必须的,取决于具体的脚本语言);步骤12,驱动脚本触发主函数(Main)运行,并控制程序运行到驱动函数(DriverFunc)起始处,其中驱动函数由主函数调用;步骤13,测试脚本触发驱动函数运行,在驱动函数中首先将输入参数传递给被测单元,然后完成被测单元在预置条件下的调用执行,最后输出被测单元执行结果,测试脚本控制程序运行到测试用例结束(TestFuncover)标签的位置。其中,该预置条件和输入参数预先设置在测试脚本中,为测试用例所需要的条件和参数,包括函数涉及的各全局变量的取值、输入参数、以及桩函数的输出等;步骤14,测试用例执行完毕,由测试脚本输出本测试用例的执行结果。
由于在脚本中可以直接访问程序中的全局变量,因此上述过程中设置测试用例所需要的预置条件和输入参数、以及步骤14是很容易实现的,而步骤12和13可以用脚本语言提供的相应命令来实现,为了描述方便,这里我们假定该命令为Proc_Goto。如果没有可直接使用的命令,也可以很方便的定制,只要脚本能够识别程序中的标签,并能够停在任意指定的标签处。对于一般的脚本语言来说,这两个条件都是满足的。这需要在源程序中定制类似如下的驱动函数void DriveFunc(void){unsigned int Result;
/*执行被测单元*/Result=Func1(gPara1,gPara2);//假定被测单元原型为unsigned int Func1(int Para1,//int Para2);
//gPara1和gPara2为int型的两个全局变量,用于为Func1//传递参数,在步骤13中与用例预置条件一起设定/*输出执行结果*/LOG_printf(trace,“Func Exec Result:%u”,Result);
/*设置标签,每次用例执行完毕即停止此标签处*/asm("TestFuncOver:");
}而测试脚本则可如下编写
DebugFunc1All() /Func1的测试用例{Proc_Goto(Main); //为了使被测程序得到驱动,在源程序main函数调用驱动函数//DriveFunc,如果需要,前面应该还包括脚本语言的初始化,此处略Proc_Goto(DriveFunc);//执行到驱动函数起始位置/***********************test case1***********************//*此处设置测试用例1的预置条件,包括输入参数*/……Proc_Goto(TestFuncOver);//从驱动函数起始位置开始执行,直到找到标志TestFuncOver//为止,执行到此,被测单元的用例1已执行完毕/*此处输出测试结果*/……}测试时,只需执行脚本函数DebugFunc1All,则被测单元Func1的测试用例1得到执行。
实施例单个被测单元多个测试用例的测试如图3所示,说明单个被测单元的多个测试用例的测试。对于单个被测单元的多个测试用例的测试,其过程为步骤21,首先进行脚本语言初始化;步骤22,驱动脚本触发主函数运行,并控制程序运行到驱动函数的起始处,其中,驱动函数由主函数调用;步骤23,测试脚本触发驱动函数运行,在驱动函数中首先将输入参数传递给被测单元,然后完成被测单元在预置条件下的调用执行,最后输出被测单元执行结果,并且,测试脚本控制程序运行到测试用例结束标签的位置。其中,该预置条件和输入参数预先设置在测试脚本中,为测试用例所需要的条件和参数,包括函数涉及的各全局变量的取值、函数输入参数、以及桩函数的输出等;
步骤24,本测试用例执行完毕,由测试脚本输出本测试用例的执行结果;步骤25,测试脚本判断是否还有测试用例需要测试,如果有则返回到步骤23,否则结束测试。
由于在脚本中可以直接访问程序中的全局变量,因此上述过程中设置测试用例所需要的预置条件和输入参数、以及步骤24是很容易实现的,而步骤23可以用脚本语言提供的相应命令来实现。对于多个测试用例的情况,为了能够自动化测试而无需重新加载程序,则驱动函数必须保证前一个用例执行完后能够自动回到被测单元被调用处,这可通过在驱动函数中设置一个循环来实现。
这需要在源程序中定制类似如下的驱动函数void DriveFunc(void){unsigned int Result;
for(;;){/*执行被测单元*/Result=Func1(gPara1,gPara2);//假定被测单元原型为unsigned int Func1(int//Para1,int Para2);
//gPara1和gPara2为int型的两个全局变量,用于为Func1//传递参数,在步骤23中与用例预置条件一起设定/*输出执行结果*/LOG_printf(trace,“Func Exec Result:%u”,Result);
/*设置标签,每次用例执行完毕即停止此标签处*/asm("TestFuncOver:");
}}多个测试用例的测试脚本则可写为DebugFunc1All()//为Func1的测试用例设置热键
{Proc_Goto(Main); //为了使被测程序得到驱动,在源程序main函数调用驱动函数//DriveFunc,如果需要,前面应该还包括脚本语言的初始化,此处略Proc_Goto(DriveFunc);//执行到驱动函数起始位置/***********************test case1***********************//*此处设置测试用例1的预置条件,包括输入参数*/……Proc_Goto(TestFuncOver);//从驱动函数起始位置开始执行,直到找到标志TestFuncOver//为止。执行到此,被测单元的用例1已执行完毕/*此处输出用例1的测试结果*/……/***********************test case2***********************//*此处设置测试用例2的预置条件,包括输入参数*/……Proc_Goto(TestFuncOver);//从标志TestFuncOver所在位置开始执行,直到重新找到该标志//为止。执行到此,被测单元的用例2已执行完毕/*此处输出用例2的测试结果*/………… //Func1的其它测试用例}这时,一旦执行脚本函数DebugFunc1All,则Func1的所有测试用例都得到执行。
实施例多个被测单元的测试如图4所示,说明多个被测单元的测试。对于多个被测单元的测试,其过程为步骤31,首先进行脚本语言初始化;
步骤32,驱动脚本触发主函数运行,并控制程序运行到驱动函数起始处,其中,驱动函数由主函数调用;步骤33,测试脚本触发驱动函数运行,在驱动函数中通过调用被测单元函数指针来完成被测单元在预置条件下的调用执行,并输出被测函数执行结果,测试脚本控制程序运行到测试用例结束标签的位置。其中,该预置条件和输入参数预先设置在测试脚本中,为测试用例所需要的条件和参数,包括函数涉及的各全局变量的取值、函数输入参数、以及桩函数的输出等;步骤34,本测试用例执行完毕,由测试脚本输出本测试用例的执行结果;步骤35,测试脚本判断是否还有测试用例需要测试,如果有则返回到步骤33,否则结束测试。
从上面过程可以看出,在多个被测单元的情况下,由于各被测单元的原型(函数名、参数个数和类型、返回值类型)各不相同,因此,为了使驱动函数能适用于每一个被测单元,将其中对被测单元的调用改为通过函数指针来实现,即可以定制如下的全局函数指针和存储输入参数的数组(参数数组)/*函数指针*/int(*gpFuncPointer)(int Para0,int Para1,int Para2,int Para3,int Para4,int Para5,int Para6,int Para7);//假定所有被测单元的输入参数个数//不超过8,当然,该值可以修改/*函数输入参数*/int gFuncPara[8]; //同样,该数组长度应不小于被测单元的最大输入参数个数而驱动函数可如下编写void DriveFunc(void){unsigned int Result;
/*循环执行脚本中指定的被测单元,每循环一次相当于执行一个用例*/for(;;)
{/*执行被测单元*/Result=(*gpFuncPointer)(gFuncPara
,gFuncPara[1],gFuncPara[2],gFuncPara[3],gFuncPara[4],gFuncPara[5],gFuncPara[6],gFuncPara[7]);
/*输出执行结果*/LOG_printf(trace,“Func Exec Result:%d”,Result);
/*设置标签,每次用例执行完毕即停止此标签处*/asm("TestFuncOver:");
}}在测试脚本中,当需要测试某一个被测单元时,需要将其函数名赋给全局函数指针gpFuncPointer,并设置其所需参数。为了方便,这一操作可以封装成如下的脚本函数Proc_RunFunc(FuncName,Para0,Para1,Para2,Para3,Para4,Para5,Para6,Para7){/*设置函数输入参数*/gFuncPara
=Para0;
gFuncPara[1]=Para1;
gFuncPara[2]=Para2;
gFuncPara[3]=Para3;
gFuncPara[4]=Para4;
gFuncPara[5]=Para5;
gFuncPara[6]=Para6;
gFuncPara[7]=Para7;
/*设置函数指针*/gpFuncPointer=FuncName;
/*运行函数*/Proc_Goto(TestFuncOver);
}并定制如下的驱动脚本Proc_DebugInit()//单元测试驱动脚本函数{/*脚本语言初始化*/……/*驱动程序运行*/Proc_Goto(main); //main函数中调用驱动函数DriveFuncProc_Goto(DriveFunc);//程序被驱动,等待用例执行}这样,DSP自动化测试工具就定制完毕,它包括一个驱动脚本和一个DSP上的测试工程,这里,所述的驱动脚本包含前面的Proc_DebugInit和Proc_RunFunc两个脚本函数,所述DSP上的测试工程包括主函数main和驱动函数DriveFunc,以及其它一些DSP工程必须的配置文件等。测试人员在进行单元测试时,只需将所有被测单元和桩函数加入工程并一起编译、链接、加载,然后依次执行测试用例的脚本即可。而测试脚本的通用形式如下DebugFunc_x()//Func_X的测试用例,一般建议为每个被测单元定制//一个脚本函数,包含该被测单元的所有测试用例{/***********************test case1***********************//*设置测试用例1的预置条件,包括输入参数*/
……/*执行用例1*/Proc_RunFunc(Func_x,输入参数1,输入参数2,…,输入参数n);/*此处输出用例1的测试结果*/……/***********************test case2***********************//*设置测试用例2的预置条件,包括输入参数*/……/*执行用例2*/Proc_RunFunc(Func_x,输入参数1,输入参数2,…,输入参数n);/*此处输出用例2的测试结果*/…………//Func_x的其它测试用例}从上面可以看出,本发明的测试方法的核心在于利用脚本语言能够直接访问程序内部数据等一些特点,通过全局函数指针和数组实现被测单元的变化和输入参数传递,在源程序内部定制统一的驱动函数不间断地调用函数指针,在外部则定制统一的脚本设置被测单元及其输入参数,并驱动内部的驱动函数执行一次循环。
从而,与现有的测试方法相比,该测试方法具有以下优点1.由于采用统一的驱动函数和驱动脚本,测试用例可以连续不断地执行,程序运行受外部的测试脚本控制,无需人工干预,因而测试自动化得以实现;2.测试过程中无须修改源程序、无须重新编译链接源程序、甚至无须重新加载程序就可以使程序中使用的变量或内存甚至是程序本身的内容发生改变,并立刻按照修改后的方式运行,因而测试更方便、效率也更高;3.测试程序的某功能单元或验证某功能项时,只需要编一段测试脚本即可,且测试脚本与源程序本身在物理上是完全分离的,可单独修改、保存,因而当源程序改动时,回归也就变得非常简单;4.使用该技术,可以减少因版本管理不当而引发的各类问题,因为测试过程无须修改源程序本身,测试用例的修改完全可以通过修改测试脚本文件即可,因而可以减少多个中间版本而造成的混乱。
对于不同公司的DSP芯片,它们所支持的脚本语言可能各不相同,但是从前面对自动化测试方法的描述中可以看出,只要该类型DSP及其编译调试环境能够解决如下几方面问题,则这种测试方法也是适用的1.支持独立于源程序的脚本语言,并可利用脚本从外部对程序施加激励,设置和读取程序内部变量、设置程序启动/停止位置等。这一条件使得测试时可以在脚本中设置被测单元所需预置条件,驱动程序从指定的位置(被测单元起始处)开始执行,并在另一指定位置(驱动函数中的全局标志)停止,然后通过在脚本中读取程序内部变量,输出测试结果;2.支持个数可变的函数参数传递。这一条件使得不同的被测单元可以共用同一个通用函数指针,进而共用同一个驱动函数,而无需为每个被测单元单独定制驱动函数。
本发明并不局限于上述实施例,那些本领域普通技术人员通过阅读本申请后对本发明所做的简单的修饰、修改或者等同方案,都应该落在本发明的权利要求所要求保护的范围之内。
权利要求
1.一种软件单元的测试方法,其特征在于通过驱动脚本和测试脚本,从程序外部对被测程序的测试进行控制,该方法包括以下步骤步骤一,驱动脚本触发主函数运行,并控制程序运行到驱动函数的起始处,其中驱动函数由主函数调用;步骤二,测试脚本触发驱动函数运行,在驱动函数中调用执行被测单元。
2.如权利要求1所述的软件单元的测试方法,其特征在于被测单元的调用执行包括以下步骤在驱动函数中将输入参数传递给被测单元;在预置条件下调用执行被测单元;测试脚本控制程序运行到预先设置的测试用例结束标签处。
3.如权利要求2所述的软件单元的测试方法,其特征在于,上述测试用例所需的预置条件和输入参数预先设置在测试脚本中。
4.如权利要求3所述的软件单元的测试方法,其特征在于,上述测试用例所需的预置条件和输入参数包括函数涉及的各全局变量的取值、输入参数、以及桩函数的输出。
5.如权利要求1至4任一项所述的软件单元的测试方法,其特征在于,该方法在步骤二之后进一步包括步骤三,本测试用例执行完毕,由测试脚本输出本测试用例的执行结果。
6.如权利要求5所述的软件单元的测试方法,其特征在于,该方法在步骤三之后进一步包括步骤四,测试脚本判断是否还有测试用例需要测试,如果有则返回到步骤二,否则结束测试。
7.如权利要求6所述的软件单元的测试方法,其特征在于,测试脚本中进一步设置全局的被测单元函数指针及存储输入参数的数组,在步骤二中驱动函数通过调用被测单元函数指针来完成被测单元在预置条件下的调用执行。
8.如权利要求1至7任一项所述的软件单元的测试方法,其特征在于,步骤一之前进一步包括对脚本语言进行初始化的步骤。
9.如权利要求2所述的软件单元的测试方法,其特征在于,在预置条件下调用执行被测单元之后进一步包括输出被测单元执行结果的步骤。
全文摘要
本发明提供一种软件单元的测试方法。该测试方法包括步骤步骤一,驱动脚本触发主函数运行,并控制程序运行到驱动函数的起始处,其中驱动函数由主函数调用;步骤二,测试脚本触发驱动函数运行,在驱动函数中调用执行被测单元。本发明通过编写并且执行脚本,包括驱动脚本和测试脚本,从外部对被测程序的测试进行控制,由于采用测试脚本取代了原来的测试程序,而脚本与源程序物理上是分离的,两者不在一起编译,因此测试时只涉及脚本的改动,无需修改源程序。
文档编号G06F11/36GK1862511SQ20061005803
公开日2006年11月15日 申请日期2006年2月28日 优先权日2006年2月28日
发明者王成毅 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1