白盒测试的方法和系统与流程

文档序号:11582504阅读:665来源:国知局
白盒测试的方法和系统与流程
本发明涉及计算机
技术领域
,具体涉及一种白盒测试的方法和系统。
背景技术
:白盒测试是基于程序的内在逻辑进行的代码级测试。白盒测试要求测试人员为每个功能单元编写测试用例,因此白盒测试的编码工作量很大,对测试人员的编码能力要求很高。目前已有的一些测试框架,如java的junit和testing测试框架,测试人员可以在框架中编写、编译和执行测试代码,虽然能减轻测试人员的一部分编码工作,但无法使测试人员完全从编码工作中摆脱出来。在项目前期,测试人员需要花费大量的时间和精力去编写测试代码。在项目延续期间,测试人员需要持续地对测试代码进行维护。例如,一个类的某个方法的变量个数由两个变为三个,那这个类的测试代码也需要进行修改,这个类所在的测试工程文件需要重新编译。再例如,一个类方法的变量类型发生改变,也需要重复上述过程。此类修改要求测试人员及时掌握被测代码单元的变动情况,并据此修改测试代码。但在现实场景中,研发人员可能会忘记或者忽略此类修改,测试人员不能及时更正测试代码,导致的结果是测试工程无法编译通过或执行错误。技术实现要素:有鉴于此,本发明提供一种白盒测试的方法和系统,以解决上述问题。根据本发明的第一方面,提供一种白盒测试的方法,包括:读取测试数据,所述测试数据包括被测代码单元的标识、入口参数和预期结果;根据所述被测代码单元的标识和入口参数生成所述被测代码单元的测试 代码;根据所述测试代码的执行结果和所述预期结果的比对,输出所述被测代码单元的测试状态。优选地,所述被测代码单元的标识为面向对象设计语言的类的类名称和类方法,所述入口参数为所述类方法的入口参数。优选地,所述生成所述被测代码单元的测试代码包括:根据所述类名称生成构造所述类的实例化对象的测试代码;根据所述类方法和所述入口参数生成调用所述实例化对象中的类方法的测试代码。优选地,所述被测代码单元的标识为过程化设计语言的函数名称,所述入口参数为所述函数的入口参数。优选地,还包括:校验所述入口参数。优选地,输出所述被测代码单元的测试状态包括:通过邮件发送所述被测代码单元的测试状态。根据本发明的第二方面,提供一种用于白盒测试的系统,包括:接收模块,用于读取测试数据,所述测试数据包括被测代码单元的标识、入口参数和预期结果;生成模块,用于根据所述被测代码单元的标识和入口参数生成所述被测代码单元的测试代码;输出模块,用于根据测试代码的执行结果和预期结果的比对,输出所述被测代码单元的测试状态。优选地,所述被测代码单元的标识为面向对象设计语言的类的类名称和类方法,所述入口参数为所述类方法的入口参数。优选地,所述被测代码单元的标识为过程化设计语言的函数名称,所述入口参数为所述函数的入口参数。优选地,还包括:校验模块,用于校验所述入口参数。本发明实施例提供的一种白盒测试的方法,包括:读取测试数据,所述测试数据包括被测代码单元的标识、入口参数、预期结果;根据所述被测代码单元的标识和入口参数生成所述被测代码单元的测试代码;根据所述测试代码的执行结果和所述预期结果的比对,输出所述被测代码单元的测试状态。本发明实施例提供的用于白盒测试的方法解除了测试代码对被测 代码的依赖,实现测试代码和被测代码单元的松耦合,使测试环境更加的独立,易于维护和使用。测试人员可以不编写测试代码实现多个测试用例,减少测试成本,提高测试效率。测试系统生成的测试报告直接发送给研发人员,并在其中增加了对错误的描述,对于问题的追踪起到积极效果。附图说明通过参照以下附图对本发明实施例的描述,本发明的上述以及其它目的、特征和优点将更为清楚,在附图中:图1是根据本发明实施例的白盒测试的方法的流程图;图2是根据本发明另一实施例的白盒测试的方法的流程图;图3是根据本发明实施例的用于白盒测试的系统的结构图;图4是根据本发明实施例的使用白盒测试系统的测试效果比对。具体实施方式以下基于实施例对本发明进行描述,但是本发明并不仅仅限于这些实施例。在下文对本发明的细节描述中,详尽描述了一些特定的细节部分。对本领域技术人员来说没有这些细节部分的描述也可以完全理解本发明。为了避免混淆本发明的实质,公知的方法、过程、流程没有详细叙述。另外附图不一定是按比例绘制的。附图中的流程图、框图图示了本发明实施例的系统、方法、装置的可能的体系框架、功能和操作,流程图和框图上的方框可以代表一个模块、程序段或仅仅是一段代码,所述模块、程序段和代码都是用来实现规定逻辑功能的可执行指令。也应当注意,所述实现规定逻辑功能的可执行指令可以重新组合,从而生成新的模块和程序段。因此附图的方框以及方框顺序只是用来更好的图示实施例的过程和步骤,而不应以此作为对发明本身的限制。图1是根据本发明实施例的白盒测试的方法的流程图,包括步骤100-102。在步骤100中,读取测试数据。本步骤中的测试数据包括被测代码单元的标识、入口参数和预期结果。被测代码单元在面向对象的编程语言(如,java,c#)中指类的方法,入口参数为类的方法的入口参数。在过程化编程语言(如,c)设计时,被测代码单元为函数,入口参数为函数的入口参数。预期结果是将入口参数代入到被测代码单元执行时预期的返回值。在本步骤中,将测试数据读取到内存中,在内存中对测试数据进行处理。在步骤101中,根据被测代码单元的标识和入口参数生成被测代码单元的测试代码。在使用面向对象设计语言时,测试一个类或类的方法首先需要将类实例化,通过实例化对象调用每个类方法;如果是过程设计语言,不需要构造实例化对象,直接调用每个函数。在步骤102中,根据测试代码的执行结果和预期结果的比对,输出被测代码单元的测试状态。在本步骤中,记录类方法或函数的执行结果,将该执行结果和每个方法或函数的预期结果比对,判断被测代码单元是否通过,并作为测试状态输出。本发明实施例提供的白盒测试的方法,读取测试数据,生成被测代码单元的测试代码,并根据预期结果和测试代码的执行结果输出测试状态。该方法根据测试数据直接生成测试代码,使测试人员免于编写测试代码,节省了人力资源,从而提高了测试效率。图2是根据本发明另一实施例的白盒测试的方法的流程图,包括步骤201-204。在步骤201中,读取测试数据。表1是java的一个测试数据的示例。在本步骤中,将下述的测试数据读取到内存中,将类名和方法名去重,针对于同一个类的多个方法采用map的形式进行组装,组装后进行排序分类。表格1在上表中,将类com.jd.easytest.service.userservice(其中com.jd.easytest.service为类所属的包的名称)的方法findbyerp、findbyname和addbyname和对应的入口参数组织在一起。将类com.jd.easytest.service.usercase的方法readcount、accessbyname和对应的入口参数组织在一起。在步骤202中,根据类名称生成构造类的实例化对象的代码。在步骤203中,生成调用实例化对象中的每个方法的测试代码。在步骤202和203中,首先根据类的名称生成实例化对象,然后生成调用实例对象的每个方法的测试代码。在java/c++中最常用的是通过new语句创建对象,然后通过对象指针依次调用类的方法。下面是根据表1的测试数据生成示意性的测试代码。userservice*p=newuserservice();//实例化usercase*q=newusercase();//实例化stringa,b,d;//返回值定义integere,f;//返回值定义a=p->findbyerp("name");//方法调用b=p->findbyname("name","addr");//方法调用d=p->addbyname("mingming");//方法调用e=q->readcount("name");//方法调用f=q->accessbyname("name","addr");//方法调用p,q为两个实例化对象的指针,通过指针调用设定的类方法,并将方法的执行结果保存在变量中。在步骤204中,根据测试代码的执行结果和预期结果的比对,输出被测代码单元的测试状态。下面的代码是根据步骤202、203续写的测试代码。if(a=="jiaou")system.out("测试通过");if(b=="aa")system.out("测试通过");if(d=="bb")system.out("测试通过");if(e==0)system.out("测试通过");if(f==0)system.out("测试通过");为了方便研发人员对测试用例进行复查,上述比对结果会保存到一个文件中,如excel表格,并通过邮件或其他方式发送给相应的研发人员。表2为表1的测试结果的excel表格,其中测试状态用pass(通过)和fail(失败)标识。表格2类名称方法名入口参数预期结果测试状态com.jd.easytest.service.userservicefindbyerpnamejiaoupasscom.jd.easytest.service.userservicefindbynamename,addraapasscom.jd.easytest.service.userserviceaddbynamemingmingbbpasscom.jd.easytest.service.usercasereadcountname0passcom.jd.easytest.service.usercaseaccessbynamename,addr0fail在上述实施例的方法中,如果测试数据中编写的入口参数和被测代码单元的入口参数不一致,可能导致程序异常中断或执行错误。因此有必要在调用每个方法前,对入口参数进行校验,并根据校验结果确定是否跳过该方法。例如,上表中的findbyname有两个入口参数,但是在被测代码中的findbyname中如果只有一个入口参数,则该方法的入参有误,跳过该方法的执行。在一个可选的实施例中,在测试数据中增加上一次执行时所使用的入口参数类型,比较本次入口参数和上一次的入口参数,如果个数或类型不一致,则跳过该方法的执行。表3是另一个示例性的测试数据。表格3类名称方法名入口参数预期结果上次入参com.jd.easytest.service.userservicefindbyerpnamejiaoustringcom.jd.easytest.service.userservicefindbynamename,addraastringcom.jd.easytest.service.userserviceaddbynamemingmingbbstringcom.jd.easytest.service.usercasereadcountname0stringcom.jd.easytest.service.usercaseaccessbynamename,addr0string,string其中,方法findbyname上次测试时的入口参数包括1个string类型的入参,本次入口参数却有两个,因此,本次测试不执行该方法。图3是根据本发明实施例的用于白盒测试的系统的结构图,包括接收模块301、生成模块302和输出模块303。接收模块301读取测试数据,其中测试数据包括被测代码单元的标 识、入口参数和预期结果。被测代码单元为函数或类的方法。生成模块302根据被测代码单元的标识和入口参数生成被测代码单元的测试代码。如上述所述,面向对象的编程语言设计时,根据类名称构造类的实例化对象,然后生成调用实例化对象中的每个方法的测试代码。过程化设计语言时,生成调用每个函数的代码,其中,将入口参数代入到对应的函数中。输出模块303用于根据测试代码的执行结果和预期结果的比对,输出被测代码单元的测试状态。在一个优选的实施例中,根据测试结果生成测试报告,将测试报告通过邮件或其他方式发送给研发人员。在一个可选的实施例中,上述系统包括一个校验模块,校验模块在生成测试代码前,对被测代码单元的入口参数进行校验。检验方法有多种。例如,将上一次测试的入口参数和本次测试的入口参数进行比对,判断是否一致,如果一致,则继续生成测试代码,如果不一致,则跳过该待测代码单元的测试。图4是根据本发明实施例的使用白盒测试系统的测试效果比对。左图是传统的测试流程,右图是使用白盒测试系统的测试流程。在左图中,测试人员需要编写测试数据和测试代码,并将测试数据和测试代码组装在一起,执行组装后的测试代码,得到测试报告。在右图上,测试人员只需要编写测试数据,然后使用白盒测试系统进行测试,即可以得到一个完整的测试报告。白盒测试的系统不依赖于开发代码,可以用于测试不同的研发项目。本发明实施例提供的用于白盒测试的系统解除了测试代码对开发代码的依赖,测试代码和被测代码单元实现松耦合,使测试环境更加的独立、易于维护和使用。测试人员可以不编写测试代码实现多个测试用例,因此,减少测试成本,提高测试效率。测试系统生成的测试报告直接发送给研发人员,并在其中增加对错误的描述,对于问题的追踪起到积极效果。系统的各个模块或单元可以通过硬件、固件或软件实现。软件例如包括采用java、c/c++/c#、sql等各种编程语言形成的编码程序。虽然 在方法以及方法图例中给出本发明实施例的步骤以及步骤的顺序,但是所述步骤实现规定的逻辑功能的可执行指令可以重新组合,从而生成新的步骤。所述步骤的顺序也不应该仅仅局限于所述方法以及方法图例中的步骤顺序,可以根据功能的需要随时进行调整。例如将其中的某些步骤并行或按照相反顺序执行。根据本发明的系统和方法可以部署在单个或多个服务器上。例如,可以将不同的模块分别部署在不同的服务器上,形成专用服务器。或者,可以在多个服务器上分布式部署相同的功能单元、模块或系统,以减轻负载压力。所述服务器包括但不限于在同一个局域网以及通过internet连接的多个pc机、pc服务器、刀片机、超级计算机等。以上所述仅为本发明的优选实施例,并不用于限制本发明,对于本领域技术人员而言,本发明可以有各种改动和变化。凡在本发明的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1