首页> 中国专利> 一种使用脚本补丁的白盒测试系统及其测试方法

一种使用脚本补丁的白盒测试系统及其测试方法

摘要

本发明公开了一种使用脚本补丁的白盒测试系统及方法,利用脚本函数和补丁技术动态构造测试桩函数,实现测试桩函数的脚本化构造、脚本化执行,避免重复的编译、链接过程,提高测试效率。测试系统包括测试控制系统(10)和被测试系统(50);还包括通讯模块(20)、脚本模块(30)和测试模块(40);测试模块(40)包括补丁处理中心模块(41)、哑巴补丁函数群(42)和地址信息表(43);测试方法包括:根据被测试系统的需要动态增加脚本桩函数;增加脚本桩函数与被测试系统中函数的对应关系;采用补丁技术激活脚本桩函数,修改代码段的指令,实现执行过程从被测试系统到脚本桩函数的迁转,覆盖运行脚本桩函数或插入运行脚本桩函数。

著录项

  • 公开/公告号CN1471249A

    专利类型发明专利

  • 公开/公告日2004-01-28

    原文格式PDF

  • 申请/专利权人 华为技术有限公司;

    申请/专利号CN02126797.9

  • 发明设计人 董奎;程强;

    申请日2002-07-23

  • 分类号H04B17/00;

  • 代理机构

  • 代理人

  • 地址 518057 广东省深圳市南山区科技园科发路1号

  • 入库时间 2023-12-17 15:05:30

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-08-17

    未缴年费专利权终止 IPC(主分类):H04B17/00 授权公告日:20060719 终止日期:20170723 申请日:20020723

    专利权的终止

  • 2010-10-27

    专利权的转移 IPC(主分类):H04B17/00 变更前: 变更后: 登记生效日:20100908 申请日:20020723

    专利申请权、专利权的转移

  • 2006-07-19

    授权

    授权

  • 2004-04-07

    实质审查的生效

    实质审查的生效

  • 2004-01-28

    公开

    公开

说明书

技术领域

本发明涉及通信领域的测试技术,尤其涉及通信领域使用脚本补的白盒测试系统及其测试方法。

背景技术

在通信领域,为保证通信系统的可靠性,其中的软件研发过程必须包括测试阶段,以尽可能多地发现软件中的错误。

在现有技术中,白盒测试系统是常用的测试工具。在白盒测试系统中,需要用具体的编程语言编写测试所需要的众多驱动函数、桩函数,这些众多的驱动函数和桩函数构成测试代码。这些测试代码与被测代码一起经过编译、连接后生成可执行文件,然后通过该可执行文件的运行进行测试。测试过程中一旦需要修改测试代码,就需要再次进行将修改后的测试代码与被测代码一起重复编译、链接等过程。这种重复的编译、链接等过程会导致测试效率低下;且随着被测系统的不断增大、复杂度的不断提高,这样的重复操作就会越多,最终导致测试的效率就会越低。

如图1所示是现有技术中直接用编程语言构造测试桩函数进行软件测试的过程示意图,首先用具体的编程语言构造测试桩函数、编写成测试源代码,然后将该测试源代码编译、与被测源代码链接,生成可执行系统进行测试。可见,在测试过程中要进行根据需要修改测试桩函数,重新编写成测试源代码,重复编译、链接等过程,直至完成测试,显然,测试效率不高。

如图2所示是用格式化语言描述桩函数进行软件测试的过程示意图,该系统与图1所示系统的不同之处在于能提供一种格式化的桩描述方法,用户只需要按照一定的格式对桩函数进行描述,由系统根据用户的描述转换为具体的C语言函数,然后编译、与被测试系统链接,生成可执行系统。这样的系统虽然提供脚本化的桩函数描述手段,但最终还是将脚本描述转化为具体的C语言函数,还是存在重复编译、链接的问题,从而决定这样的操作方法的效率还是比较低。

上述两种测试系统的缺点在于:测试过程中无法避免重复的编译、链接过程,导致测试效率比较低;对异常测试用例构造将更加困难。另外,如图1所示的系统中还存在众多测试代码,这些测试代码的维护需要一定的成本。随着测试技术的发展,迫切需要提高测试效率。

发明内容

本发明要解决的是现有测试系统和测试方法在测试过程中因无法避免重复的编译、链接过程而导致测试效率比较低的技术问题。

一种使用脚本补丁的白盒测试系统,包括测试控制系统和被测试系统,其特征在于,还包括通讯模块、脚本模块和测试模块;所述测试模块包括补丁处理中心、哑巴补丁函数群和地址信息表;

所述地址信息表用于记录动态获得的所述被测试系统中的函数的地址信息;所述哑巴补丁函数群是一系列的哑巴函数;所述通讯模块通过socket或串口通讯联接所述测试控制系统;所述脚本模块通过通讯模块接收测试控制系统发出的测试指令和脚本桩函数,解释执行测试指令;所述补丁处理中心调用所述脚本模块的相应接口,根据所述测试指令实现所述脚本桩函数的执行;

所述被测试系统与所述通讯模块、所述脚本模块、所述测试模块一起编译、链接成为可执行系统用于运行。

所述通讯模块、所述脚本模块和所述测试模块不随被测试系统的不同而改变;

当所述测试控制模块与系统脱离时,所述被测试系统能够独立运行,所述通讯模块、所述脚本模块和所述测试模块处于不影响所述被测试系统运行的休眠状态。

一种使用脚本补丁的白盒测试方法,包括如下步骤:

①根据被测试系统的需要动态增加脚本桩函数;

②增加所述脚本桩函数与所述被测试系统中函数的对应关系;

③采用补丁技术激活所述脚本桩函数,修改代码段的指令,实现执行过程从所述被测试系统到所述脚本桩函数的迁转,覆盖运行所述脚本桩函数或者插入运行所述脚本桩函数。

上述使用脚本补丁的白盒测试方法,在所述步骤③中覆盖运行脚本桩函数的过程包括如下步骤:

a1、当所述被测试系统中的A函数调用处于补丁状态的B函数时,不执行所述B函数,直接跳转到与所述B函数对应的哑巴补丁函数;

a2、所述哑巴补丁函数调用所述脚本模块的对应接口,执行对应的脚本桩函数,并将所述脚本桩函数的返回值传递给所述哑巴补丁函数;

a3、所述哑巴补丁函数将所述脚本桩函数的返回值返回给A函数。

上述使用脚本补丁的白盒测试方法,其步骤③中插入运行脚本桩的过程包括如下步骤:

b1、当所述被测试系统中的A函数调用处于补丁状态的B函数时,不执行所述B函数,直接跳转到与所述B函数对应的哑巴补丁函数;

b2、所述哑巴补丁函数调用所述脚本模块的对应接口,执行对应的脚本桩函数,并将脚本桩函数的返回值传递给所述哑巴补丁函数;

b3、恢复所述B函数为未补丁状态;

b4、在所述哑巴补丁函数中直接调用所述B函数,获得并保存所述B函数的返回值;

b5、设置B函数为补丁状态;

b6、将所述B函数的返回值返回给所述A函数。

所述步骤a2或步骤b2是通过对类ESP寄存器的访问,将调用函数时的输入值影射为脚本实体,使所述脚本桩函数能够访问、修改所述A函数调用所述B函数时传入的参数来实现的。

本发明采用了上述技术方案后,由于采用了补丁技术、脚本语言技术,通过脚本函数来构造测试过程中需要的各种类型的桩函数,而脚本语言技术具备直接编写、直接起作用的特点,避免了反复的编译、链接过程,从而提高测试效率。与现有技术相比,通过该技术能够灵活用脚本语言构造桩函数,保证不修改被测试系统的情况下动态修改桩函数,灵活决定桩函数的返回值,同时实现测试脚本与被测试系统的相对独立,减少了测试代码维护的成本。本发明还可以用于市场已经运行系统的错误诊断和紧急修补。本发明经过仿真、模拟,并且在镜像测试工具中使用,经实践证明可靠可行。

附图说明

图1是直接用编程语言构造测试桩函数进行软件测试的过程示意图;

图2是用格式化语言描述桩函数进行软件测试的过程示意图;

图3是本发明的白盒测试系统的结构示意框图;

图4是本发明的白盒测试系统的测试流程图;

图5是本发明的白盒测试系统采用插入方式使用脚本补丁的详细流程图;

图6是本发明的白盒测试系统运行流程示意图。

具体实施方式

如图3所示是本发明的白盒测试系统的结构示意框图,包括测试控制系统10;通讯模块20;脚本模块30;测试模块40和被测试系统50。被测试系统50与通讯模块20、脚本模块30、测试模块40一起编译、链接成为可执行系统。通讯模块20和测试控制系统10通过socket或串口通讯联接,接收测试指令、脚本桩函数。通讯模块20、脚本模块30、测试模块40是固定的,不因为被测试系统的不同而改变。

本发明采用补丁技术、脚本语言技术,通过脚本函数来构造测试过程中需要的各种类型的桩函数,测试控制系统10简单地说就是用户操作界面,用户可以在此编写脚本桩函数,然后发送到通讯模块20,同时接收通讯模块20的消息,并将该消息显示给用户。测试控制系统10向通讯模块20发起连接请求,连接成功后,测试控制系统10和通讯模块20就进入交互状态。通讯模块20和脚本模块30是两个独立的任务,通过消息队列进行通讯,通讯模块20收到测试控制系统10的测试指令后就通过消息队列将指令传送给脚本模块30,脚本模块30负责解释执行该测试指令;脚本桩函数的传送方式也可以与指令的传送方式相同,脚本桩函数由通讯模块20从测试控制模块10中导入,存在脚本模块30中。

测试模块40包括补丁处理中心模块41;哑巴补丁函数群42;地址信息表43。

哑巴补丁函数群42包括一系列的哑巴函数,当一个打补丁后被测函数被调用时,首先跳转到对应的哑巴补丁函数中,然后该哑巴补丁函数直接调用补丁处理中心模块41接口,告诉补丁中心41一个函数进入补丁,需要执行对应的脚本函数。

所谓哑巴补丁函数,主要用于充当被补丁函数与脚本处理中心41之间的桥梁,通过修改被补丁函数的代码指令,直接跳转(JMP)到对应的哑巴补丁函数,哑巴补丁函数根据被补丁函数的返回值类型,决定调用脚本处理中心的不同接口,将补丁号和ESP寄存器的地址告诉补丁处理中心,补丁处理中心41通过补丁号可以正确调用对应的脚本补丁函数;通过访问类ESP寄存器的适当地址可以将调用被补丁函数时传入的参数解析出来,从而保证传入的参数可以被脚本补丁函数所使用。

地址信息表43用于记录被测试系统50中函数的地址信息,该地址信息是在编译、链接后的测试过程中动态获得的。具体获得办法包括如下步骤:

       Extern**函数1(***);

       Extern**函数2(***);

     ......

       Extern**函数n(***);

       Addressinf[]={(unsigned long)函数1,(unsigned long)函数2,...,

                           unsigned long}函数n}

上述代码中Extern是引用被测试系统50中的每个函数,是地址信息表43构造的基础,Addressinf[]是地址信息表43。

补丁处理中心模块41调脚本模块30的相应接口,实现脚本桩函数的执行。补丁处理中心模块41主要包含两个函数:

    unsigned long mirrorProcssPatchUlong(unsigned long patchId,unsigned long

                            espAddr)

    double mirrorProcssPatch Double(unsigned long patchId,unsigned long

                            espAddr)。

上述C语言函数中的参数patchId表示当前的脚本补丁序列号(ID)。参数espAddr表示当前的类esp寄存器的值。这两个函数的功能是在该函数中调用的第ID个脚本补丁对应的脚本桩函数,并获得脚本桩函数的返回值。

单纯用一个脚本函数代替被测系统50中具体C语言函数的运行,该脚本函数称之为脚本补丁。如果一个函数本身不存在,而用一个脚本函数代替之完成一定的功能,则该脚本函数称之为脚本桩。脚本补丁与脚本桩的关联在于,脚本桩的实现依赖脚本补丁技术,通过脚本桩可以灵活构造各种类型的返回值,主要用于测试;脚本补丁可以广泛应用于BUG修改、错误诊断。其实脚本桩、脚本函数补丁是同样一个内容,只是应用的场合不同,习惯名称的不同,脚本桩的概念主要应用在测试领域,脚本函数补丁的概念主要应用在BUG的定位。

本发明的技术同样可以用于市场已经运行系统的错误诊断和紧急修补。本发明的白盒测试系统代码量其实很小,大约只有2万行C代码,完全可以驻留到市场产品中。当市场产品发现问题时,再将测试控制模块10于该系统连接,通过脚本补丁诊断BUG原因,然后用一个脚本函数,替代错误函数的运行,从而避免错误。没有和测试控制模块10连接时,系统的所有模块都可以处于休眠状态,不对产品系统构成任何影响。

图4是本发明的白盒测试系统的测试流程图,图中A函数、B函数均为被测试系统50中的C语言函数,具体关系为:B函数被A函数调用。测试过程中,需要用脚本函数替换B函数的运行,从而在脚本函数中灵活构造返回值给A函数。

图4中步骤1.2.表示:在控制系统10中增加脚本桩函数,并通过通讯模块20传递给脚本模块30;

图4中步骤3.4.5.表示:通过控制系统10和通讯模块20在测试模块40的补丁处理中心模块41中增加脚本桩函数与被测试系统对应函数的对应关系;

图4中步骤6.7.表示:采用通用的补丁技术,由控制系统10通过测试模块40激活脚本桩,修改代码段的指令,实现执行过程的迁转;

图4中步骤8.表示:当被测系统中的A函数调用B函数时,由于B函数被打补丁,直接JMP到哑巴补丁函数群42中对应的哑巴补丁函数;

图4中步骤9.10.表示:哑巴补丁函数调用补丁处理中心模块41对应接口,告诉补丁处理中心模块41,B函数补丁已经被触发;

图4中步骤11.12.表示:补丁处理中心模块41调用脚本模块30对应接口,执行对应的脚本桩函数,同时获得脚本桩函数的返回值;

图4中步骤13.14.表示:补丁处理中心模块41将脚本桩的返回值传递给哑巴补丁函数,然后哑巴补丁函数直接将该值返回给A函数,从而实现了用脚本桩函数代替B函数的运行。

上述步骤描述了脚本补丁即覆盖运行脚本桩的运行过程,通过在图4中步骤13.14.中间添加其他操作,可以实现插入脚本桩或脚本补丁的测试运行过程,所谓插入脚本桩就是在运行B函数前,执行脚本函数,然后再继续运行B函数,插入脚本补丁广泛应用于对函数输入参数的合法性判断。

图5是采用插入方式使用脚本补丁的详细流程图,其具体步骤1.--13.和图4相同,下面详细介绍步骤14.--17.:

图5中步骤14.表示:恢复函数B为未补丁状态;

图5中步骤15.表示:调用B函数,获得并保存B函数的返回值,(调用B函数时,要对ESP寄存器做适当处理,以保证B函数能够正确获得A函数调用时传入的参数)。

图5中步骤16.表示:恢复函数B为补丁状态

图5中步骤17.表示:将图5中步骤15.得到的B函数的返回值,直接返回给A函数。

上述步骤14-17的操作过程简单、明了,实现该操作过程可能有多种操作技巧,例如怎么调整ESP寄存器,怎么保证B函数能够正确获得A函数调用时传入的参数,怎么保存B函数的返回值等。插入方式使用脚本补丁时,这些参数的传入与返回值的获得方法的不同,都属于本发明的保护范围。

图6是本发明的白盒测试系统运行流程示意图,更加形象地描述了本发明的思路。在测试过程中,B函数被打补丁;当被测试系统中的A函数调用B函数时,直接跳转到对应的哑巴函数,该哑巴函数调用哑巴补丁中心41对应接口,通过该接口调用脚本系统30对应接口,执行对应的脚本桩函数C,同时获得脚本桩函数C的返回值,补丁中心41将脚本桩的返回值传递给哑巴函数,然后哑巴补丁函数直接将该值返回给A函数,从而实现了用脚本桩函数C代替B函数的运行。

配合镜像测试技术(主要思想是将被测试系统实体(变量、函数)影射为脚本实体,从而通过对脚本实体的操作,达到对被测试系统实体操作的目的),通过对ESP寄存器的访问,可以将调用函数时的输入值影射为脚本实体,从而在脚本桩(脚本补丁)中同样可以访问、修改调用这些参数,例如图6脚本桩函数C同样能访问A函数调用B函数时传入的参数。

本发明可应用于各种被测试系统。

在以上描述中以C语言举例说明,并不表示对本发明应用范围的限制。

为了进一步帮助理解本发明,作为本发明的一个实施例,下面以C语言为例给出一个哑巴补丁函数dummyPatchFunc0 PROC的代码和描述:

   dummyPatchFunc0 PROC   push 0   call mpGetPatchedFuncType;获得被补丁函数的返回值的类型   add esp,4   push eax   pop functype0   push esp;将ESP寄存器,通过该值可以获得A调用B时,压入堆<!-- SIPO <DP n="7"> --><dp n="d7"/>  栈的参数push 0;补丁ID号.if functype0==0 call mirrorProcssPatchDouble.else call mirrorProcssPatchUlong.endifadd esp,8pushadpush 0call mpGetPatchType;获得补丁的类型add esp,4push eaxpop patchtype0popad.if patchtype0==0;覆盖补丁直接返回  ret.else;插入补丁 .if functype0==0   fstp qword ptr[dummy0].endifpush 0call mpResumeUnPatchState;将被补丁函数恢复为未补丁状态add esp,4mov funcaddr0,eaxpop oldeip0call funcaddr0;调用被补丁的函数push oldeip0<!-- SIPO <DP n="8"> --><dp n="d8"/>  pushad  push 0  call mpResumePatchState;恢复被补丁函数为补丁状态  add esp,4  popad.endifretdummyPatchFunc0 endpdummyPatchFunc1 PROCpush 1call mpGetPatchedFuncTypeadd esp,4push eaxpop functype1push esppush 1.if functype1==0   call mirrorProcssPatchDouble.else   call mirrorProcssPatchUlong.endifadd esp,8pushadpush 1call mpGetPatchTypeadd esp,4push eax<!-- SIPO <DP n="9"> --><dp n="d9"/>pop patchtype 1popad.if patchtype1==0  ret.else .if functype1==0   fstp qword ptr[dummy1]   .endif   push 1   call mpResumeUnPatchState   add esp,4   mov funcaddr1,eax   pop oldeip1   call funcaddr1   push oldeip1   pushad   push 1   call mpResumePatchState   add esp,4   popad.endifretdummyPatchFunc1 endpdummyPatchFunc2 PROCpush 2call mpGetPatchedFuncTypeadd esp,4<!-- SIPO <DP n="10"> --><dp n="d10"/>push eaxpop functype2push esppush 2.if functype2==0 call mirrorProcssPatchDouble.else call mirrorProcssPatchUlong.endifadd esp,8pushadpush 2call mpGetPatchTypeadd esp,4push eaxpop patchtype2popad.ifpatchtype2==0  ret .else  .if functype2==0  fstp qword ptr[dummy2].endifpush 2call mpResumeUnPatchStateadd esp,4mov funcaddr2,eaxpop oldeip2<!-- SIPO <DP n="11"> --><dp n="d11"/>   call funcaddr2   push oldeip2   pushad   push 2   call mpResumePatchState   add esp,4   popad.endifretdummyPatchFunc2 endpdummyPatchFunc3 PROCpush 3call mpGetPatchedFuncTypeadd esp,4push eaxpop functype3push esppush 3.if functype3==0   call mirrorProcssPatchDouble.else   call mirrorProcssPatchUlong.endifadd esp,8pushadpush 3call mpGetPatchType<!-- SIPO <DP n="12"> --><dp n="d12"/>add esp,4push eaxpop patchtype3popad.if patchtype3==0  ret .else  .if functype3==0   fstp qword ptr[dummy3]  .endif  push 3  call mpResumeUnPatchState  add esp,4  mov funcaddr3,eax  pop oldeip3  call funcaddr3  push oldeip3  pushad  push 3  call mpResumePatchState  add esp,4  popad.endifretdummyPatchFunc3 endp

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号