计算机程序的测试方法及装置的制造方法

文档序号:10686981阅读:423来源:国知局
计算机程序的测试方法及装置的制造方法
【专利摘要】本申请公开了测试方法,包括:创建中间函数和至少一个测试用例,其中,每一测试用例包括与至少一个被测函数对应的至少一个基于类的模拟函数;在被测计算机程序中注入与至少一个被测函数相关的跳转指令;当运行测试用例时,生成该测试用例中模拟函数所属类的对象指针;当一被测函数被调用时,通过执行与该被测函数相关的所述跳转指令而调用中间函数;当中间函数被调用时,通过执行中间函数,确定该被测函数对应的模拟函数的地址及其所属类的对象指针并调用该模拟函数;当模拟函数被调用时,与被测函数之间进行交互,获得被测函数的返回值;基于返回值确定测试结果。本申请还公开了相应的测试装置。采用该方法和装置能够提高测试性能。
【专利说明】
计算机程序的测试方法及装置
技术领域
[0001] 本申请涉及信息技术(IT)领域,尤其涉及计算机程序的测试方法及装置。
【背景技术】
[0002] 在软件开发过程中,需要对编写的计算机程序逻辑进行测试。在一些情况下,会使 用诸如Mock等测试工具来模拟计算机程序准备应用的环境中真实对象的行为,通过模拟这 种真实对象的行为来与被测计算机程序进行交互,进而能判断计算机程序的逻辑是否正 确。这种测试工具主要是用来模拟那些在应用环境中不容易构造(如HttpServletRequest 必须在Servlet容器中才能构造出来)或者比较复杂的对象(如JDBC中的ResultSet对象)。
[0003] 但是,目前这类测试工具具有一定的局限性,只能针对计算机程序中类的虚函数 进行模拟操作(如Mock操作)。

【发明内容】

[0004] 本申请提出了一种计算机程序的测试方法,包括:创建中间函数和至少一个测试 用例,其中,每一测试用例包括与至少一个被测函数对应的至少一个基于类的模拟函数;在 被测计算机程序中注入与至少一个被测函数相关的跳转指令;当运行一测试用例时,生成 该测试用例中模拟函数所属类的对象指针;当至少一个被测函数中的任一者被调用时,通 过执行与该被测函数相关的跳转指令而调用中间函数;当中间函数被调用时,通过执行中 间函数,确定该被测函数对应的模拟函数的地址及其所属类的对象指针并调用对应的模拟 函数;当模拟函数被调用时,通过执行模拟函数,与被测函数之间进行交互,并获得被测函 数的返回值;基于返回值确定测试结果。
[0005] 本申请还提出了一种计算机程序的测试装置,包括:配置模块,创建中间函数和至 少一个测试用例,其中,每一测试用例包括与至少一个被测函数对应的至少一个基于类的 模拟函数;在被测计算机程序中注入与至少一个被测函数相关的跳转指令;测试用例模块, 包括至少一个测试用例;当运行一测试用例时,生成该测试用例中模拟函数所属类的对象 指针;跳转模块,当至少一个被测函数中的任一者被调用时,通过执行与该被测函数相关的 跳转指令而调用中间函数;中间函数模块,包括中间函数;当中间函数被调用时,通过执行 中间函数,确定该被测函数对应的模拟函数的地址及其所属类的对象指针并调用对应的模 拟函数;测试用例模块,当模拟函数被调用时,通过执行模拟函数,与被测函数之间进行交 互,并获得被测函数的返回值;测试结果模块,基于返回值确定测试结果。
[0006] 采用上述本申请提供的方法和装置,能利用中间函数来获得被测函数对应的模拟 函数的地址和对象指针进而能够调用该模拟函数,而模拟函数不必继承自任何其它类,也 就是说,本测试方案能够利用模拟函数对各类被测函数进行测试,提高了测试的性能。
【附图说明】
[0007] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现 有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本 发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可 以根据这些附图获得其他的附图。
[0008] 图1为本申请一实例的方法流程图;
[0009] 图2为本申请一实例的中间函数的处理流程图;
[0010] 图3为本申请一实例的中间函数的处理流程图;
[0011]图4A~4B为本申请实例的实现框图;
[0012]图5为本申请一实例的装置结构图。
【具体实施方式】
[0013] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完 整地描述,显然,所描述的实施例仅是本发明一部分实施例,而不是全部的实施例。基于本 发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实 施例,都属于本发明保护的范围。
[0014] 为了描述上的简洁和直观,下文通过描述若干代表性的实施例来对本发明的方案 进行阐述。实施例中大量的细节仅用于帮助理解本发明的方案。但是很明显,本发明的技术 方案实现时可以不局限于这些细节。为了避免不必要地模糊了本发明的方案,一些实施方 式没有进行细致地描述,而是仅给出了框架。下文中,"包括"是指"包括但不限于","根 据……"是指"至少根据……,但不限于仅根据……"。下文中没有特别指出一个成分的数量 时,意味着该成分可以是一个也可以是多个,或可理解为至少一个。
[0015] 本申请提出了一种计算机程序的测试方法,该方法可应用于各种计算设备,比如: 手机、平板等各种手持设备、可穿戴设备、PC机等。这些计算设备可基于各种操作系统平台, 比如:诸如Windows等的X86系统,或者诸如Linux、安卓(Android)等的ARM系统。
[0016] 如图1所示,该方法包括如下步骤:
[0017] 步骤101:创建中间函数和至少一个测试用例,其中,每一测试用例包括与至少一 个被测函数对应的至少一个基于类的模拟函数。
[0018] 这里,如果使用的测试工具是Mock工具(如GoogleMock等),所述模拟函数为Mock 函数,该Mock函数为Mock类的成员函数。
[0019] 在一些实例中,会实现一个Mock类,在该Mock类之下会声明至少一个Mock函数,每 个Mock函数对应一个被测函数,用于与对应的Mock函数进行Mock操作,而该Mock类不必继 承自任何其它类。然而,在使用现有的Mock工具时,Mock类必须继承自被测程序中某个虚基 类的虚方法,在被测程序调用该虚基类的该虚方法时才会调用到Mock类的实现中(某个 Mock函数)。其中,在创建测试用例时,会声明Mock类的对象,这样测试用例运行时会生成 Mock类的对象指针(如this指针)。
[0020] 步骤102:在被测计算机程序中注入与至少一个被测函数相关的跳转指令。这里, 被测计算机程序中包括用于实现各种功能逻辑的至少一个被测函数。
[0021] 在一些实例中,所注入的跳转指令可以是钩子(Hook)函数,目的是为了在调用某 被测函数时,Hook到另外一个函数。
[0022] 上述步骤是预先的处理,当开始针对该被测计算机程序中的某个或某些被测函数 进行测试时,会运行对应的测试用例,这样,该方法还包括以下步骤:
[0023] 步骤103:当运行一测试用例时,生成该测试用例中各模拟函数所属类的对象指 针。
[0024] 步骤104:当上述任一被测函数被调用时,通过执行与该被测函数相关的跳转指令 而调用上述中间函数。
[0025]在一些实例中,当一被测函数被调用时,通过上述的跳转指令可以Hook到步骤101 中创建的中间函数。
[0026] 步骤105:通过执行该中间函数,确定该被测函数对应的模拟函数的地址及其所属 类的对象指针并调用该模拟函数。这里,中间函数可以由汇编程序实现。
[0027] 这里,当要对一被测函数进行测试时,会调用该被测函数,同时会运行相应的测试 实例(其包括该被测函数对应的模拟函数),所以,本步骤中,中间函数能够确定对应的模拟 函数的地址及其对象指针。
[0028] 步骤106:当该被测函数对应的模拟函数被调用时,该模拟函数与该被测函数之间 进行交互,并获得该被测函数的返回值,即进行模拟操作(比如:Mock操作)。
[0029] 步骤107:基于步骤106中获得的返回值确定测试结果。这里,基于被测函数的返回 值,可以确定Mock操作中传给被测函数的参数值对被测函数的影响,进而能够确定被测函 数的逻辑是否有问题以及有何种问题,即得到测试结果。
[0030] 在上述实例中,模拟函数所属的类不必继承自任何其它类,通过跳转指令能够调 用到中间函数来获取模拟函数所属类的对象指针进而调用模拟函数,从而可以针对各种被 测函数进行测试,具有更广泛的适应性,改善了测试效率及性能。
[0031] 在一些实例中,上述步骤101中,测试用例还包括至少一个参数准备函数,用于获 取该测试用例中各模拟函数所需的参数。此时,上述步骤103中,当运行一测试用例时,进一 步通过执行其中的参数准备函数来获取其中各模拟函数所需的参数;上述步骤105中,当中 间函数被调用后,可进一步通过该中间函数的执行读取此参数准备函数获取的该被测函数 对应的模拟函数所需的参数,以供调用该模拟函数之用。这里,参数准备函数中会声明针对 哪个模拟函数,也就是说是准备哪个模拟函数所需的参数。
[0032]在一些实例中,考虑针对不同类型的模拟函数,参数准备的处理会有不同,上述步 骤101中,可以进一步根据模拟函数的类型创建相应类型的参数准备函数,测试用例中包括 的参数准备函数与其中模拟函数的类型相应。也就是说,会创建多个类型的参数准备函数。 在创建测试用例时,根据其中模拟函数的类型而采用相应类型的参数准备函数。
[0033]在一些实例中,所述模拟函数的类型为其调用约定的类型。这里,函数调用约定主 要约束了两点:参数传递顺序、调用堆栈由谁(调用函数或被调用函数)清理。比如:可以有 以下几种类型:
[0034] Dcdecl方式的函数,其调用约定为:所有参数从右到左依次入栈,这些参数由调 用者清除,称为手动清栈。具体所示:调用方的函数调用_>被调用函数的执行_>被调用函数 的结果返回_>调用方清除调整堆栈。
[0035] 2)stdcall方式的函数,其调用约定为:所有参数从右到左依次入栈,如果是调用 类成员的话,最后一个入栈的是this指针。具体所示:调用方的函数调用_>被调用函数的执 行_>被调用方清除调整堆栈_>被调用函数的结果返回。
[0036] 3)thiscall方式的函数,其调用约定为:把this指针放在特定寄存器中,该寄存器 由编译器决定。VC使用ecx,Borland的C++编译器使用eax。返回方式和stdcall方式相当。
[0037] 在一些实例中,可以给出以下表格中列出的四种参数准备函数。
[0038]
[0039] 在一些实例中,通过执行中间函数来确定该被测函数对应的模拟函数的地址及其 所属类的对象指针的处理,具体包括:
[0040] 1)找到调用该被测函数的指令的下一条指令的地址;通过该下一条指令的地址找 到该被测函数的地址。
[0041] 2)根据该被测函数的地址确定对应的模拟函数的地址和对象指针。
[0042] 其中,上述参数准备函数获取的所述参数、所确定的模拟函数的地址和对象指针 被放入堆栈。
[0043] 进一步的,在堆栈中保存该模拟函数的返回值,并做栈平衡。
[0044] 这里,上述地址、参数和对象指针可以从堆栈中读取到。堆栈是计算机为程序开辟 的一块内存区域。其中,栈(stack)用来保存状态数据,其访问顺序是后进先出(LIF0)。例 如:过程或函数的地址,参数,有时候还包括局部变量;堆(heap)用来保存那些在运行时才 知道其存在与大小的数据;程序能够从堆中分配内存给这些元素;在用完之后,应该释放掉 这些内存。
[0045] 在一些实例,该方法的测试环境基于X86系统,可进一步包括如下处理:
[0046] 将所确定的对象指针传入预设的用于传递对象指针的寄存器,并根据该被测函数 对应的模拟函数所需的参数的个数做堆栈调整,以使能够基于该寄存器和当前堆栈调用该 模拟函数并能读取到该模拟函数所需的参数。这里,所谓当前对象指针指的是当前要调用 的程序的对象指针。上述确定的对象指针被传入ECX寄存器。比如,在Windows系统中默认将 this指针保存在ECX寄存器中,这样,中间函数可以通过ECX寄存器读取到当前要调用的模 拟函数的this指针进而能够调用该模拟函数。
[0047] 在一些实例中,该方法的测试环境基于ARM系统(Linux系统、安卓系统)。可进一步 包括如下处理:
[0048] 1)将该模拟函数所需的参数传入预设的用于传递函数参数的寄存器组(比如:R1 ~R3寄存器,共三个寄存器);其中,如果所需的参数的个数多于该寄存器组的寄存器数量, 则将所需参数中未能传入该寄存器组的参数放入堆栈并作堆栈调整。
[0049] 2)将该对象指针传入用于传递对象指针的寄存器(比如:R0寄存器)。
[0050] 3)将该模拟函数的地址传入预设的用于保存当前要跳转的函数地址的寄存器(比 如:PC寄存器)。
[0051]图2示出了本申请一基于X86系统的中间函数的处理流程图。如图2所示,当中间函 数被调用时,执行如下步骤:
[0052]步骤201~202:将当前环境寄存器的参数压栈,预留16字节栈空间用于存储中间 变量。
[0053] 步骤203:确定当前被测函数对应的Mock函数(一种模拟函数),获得该Mock函数的 对象指针(即this指针)并传入ECX寄存器。
[0054]这里,考虑到可能同时存在多个函数被Mock (即同时有多个被测函数),此时中间 函数需要通过某种方法来计算得到应该使用哪个Mock对象的this指针作为当前被测函数 对应的Mock函数的this指针。而要计算应该使用哪个Mock对象的this指针,则需要知道被 测代码原本要调用的是哪个函数(这个函数唯一对应到一个Mock类的某个成员函数)。由于 call指令会将call指令的下一条指令的地址(call指令执行时EIP寄存器的值)push到栈上 (这是为了当函数返回时知道从哪里继续执行),所以可以通过该信息(即call指令的下一 条指令的地址)作为key(对于ARM系统,该信息为LR寄存器中的信息),记录要调用的被测函 数和对应的Mock函数的this指针。
[0055]步骤204:获得该Mock函数的地址及其所需的参数并放入堆栈。
[0056]步骤205:根据该Mock函数所需的参数的个数做堆栈调整,以使调用该Mock函数时 能读取到其所需的参数。
[0057] 步骤206:基于this指针、该Mock函数的地址和所需的参数调用该Mock函数。
[0058]步骤207:保存该Mock函数的返回值,做栈平衡并恢复寄存器。
[0059]图3示出了本申请一基于ARM系统的中间函数的处理流程图。如图3所示,当中间函 数被调用时,执行如下步骤:
[0060] 步骤301~302:将当前环境寄存器(R0-R12寄存器)的参数压栈,预留20字节栈空 间用于存储中间变量。
[0061 ] 步骤303 :确定当前被测函数对应的Mock函数,获得该Mock函数的对象指针(BP this指针)、该Mock函数的地址和所需的参数,并将其放入堆栈。
[0062]步骤304:判断该被测函数是否为对象函数(即该被测函数是否有this指针),如果 是,则执行步骤305;否则执行步骤308。
[0063]步骤305:判断该Mock函数所需的参数个数是否小于3,如果是,则执行步骤306;否 则执行步骤307。这里,用R0~R3寄存器来传递函数参数和this指针,其中,R0寄存器用于传 递this指针。
[0064]步骤306:从堆栈中读取参数并放入R1~R3寄存器,将该Mock函数的this指针传入 R0寄存器,之后执行步骤311。
[0065]步骤307:从堆栈中读取参数并放入R1~R3寄存器,将该Mock函数的this指针传入 R0寄存器,调整堆栈,将所需的参数中还未放入寄存器的参数(即剩余参数)压栈,之后执行 步骤311。
[0066] 步骤308:判断该Mock函数所需的参数个数是否小于4,如果是,则执行步骤309;否 则执行步骤310。
[0067]步骤309:从堆栈中读取参数(不包含之前压栈的R0的参数)并放入R1~R3寄存器, 将该Mock函数的this指针传入R0寄存器,之后执行步骤311。
[0068]步骤310:从堆栈中读取参数(不包含之前压栈的R0的参数)并放入R1~R3寄存器, 将该Mock函数的this指针传入R0寄存器,调整堆栈,将所需的参数中还未放入寄存器的参 数(即剩余参数)压栈。
[0069] 步骤311:将当前要跳转的函数地址(即步骤303确定的该Mock函数的地址)传入PC 寄存器。
[0070] 步骤312:基于PC寄存器中的函数地址、R0~R3寄存器(或者进一步包括堆栈)中该 Mock函数的thi s指针及所需的参数,调用该Mock函数。
[0071] 步骤313:保存该Mock函数的返回值,并向调用被测函数的调用函数返回返回值, 做栈平衡和寄存器恢复。这里,对于ARM系统而言,是由调用原函数(即本申请的被测函数) 的调用函数跳转到中间函数的,因此,中间函数需要向此调用函数返回返回值。
[0072]图4A和4B分别示出了本申请提供的测试方法应用于X86系统和ARM系统的实现框 图。如图4A和4B所示,被测程序(也称为被测代码)包括多个被测函数(被测函数1~被测函 数n),测试实例包括多个Mock函数(Mock函数1~Mock函数n)以及参数准备函数。这里,测试 实例可能有多个,每一测试实例中的参数准备函数也可能有多个。
[0073]如图4A所示的X86系统的实现中,被测函数被注入了跳转指令,当被测函数1被调 用函数调用时,被测函数1基于此跳转指令而调用中间函数(也称为Hook到中间函数),之后 被测函数1向调用函数返回返回值。之后,中间函数基于前述的各种方法,确定该被测函数1 对应的Mock函数1的对象指针和地址,通过测试实例中的参数准备函数获得了Mock函数1所 需的参数,进而能够调用Mock函数1,使得Mock函数1与被测函数1进行Mock操作并得到被测 函数1的返回值。基于被测函数1的各种返回值可以得到测试结果。
[0074]图4B所示的ARM系统的实现与图4A类似,区别主要在于对于中间函数的调用。在 ARM系统的实现中,调用被测函数的调用指令的跳转地址被修改成中间函数的地址,当被测 函数1被调用函数调用时,调用函数会基于该调用指令的跳转地址而调用中间函数,之后, 中间函数向调用函数返回返回值。
[0075]以下给出一个程序实例,其中包括:被测函数、Mock类以及测试用例,其中,Mock类 中声明了Mock函数,测试用例中声明了Mock类对象、对应的Mock函数及其参数准备函数、 Mock操作。
[0077]基于上述各方法实例,本申请还提出了一种计算机程序的测试装置,如图5所示, 该装置包括配置模块501、测试用例模块502、跳转模块503、中间函数模块504和测试结果模 块505。
[0078]在一些实例中,各模块的功能如下:
[0079] 配置模块501创建中间函数和至少一个测试用例,其中,每一测试用例包括与至少 一个被测函数对应的至少一个基于类的模拟函数;在被测计算机程序中注入与至少一个被 测函数相关的跳转指令。
[0080] 测试用例模块502,包括上述至少一个测试用例;当运行一测试用例时,生成其中 模拟函数所属类的对象指针。
[0081] 跳转模块503,述至少一个被测函数中的任一者被调用时,通过执行与该被测函数 相关的跳转指令而调用中间函数。
[0082]中间函数模块504,包括上述中间函数;当此中间函数被调用时,通过执行此中间 函数,确定上述被调用的被测函数对应的模拟函数的地址及其所属类的对象指针并调用该 对应的模拟函数。
[0083]测试用例模块502,当上述模拟函数被调用时,通过执行此模拟函数,与被测函数 之间进行交互,并获得该被测函数的返回值。
[0084]测试结果模块505,基于测试用例模块502获得的返回值确定测试结果。
[0085] 在一些实例中,上述测试用例进一步包括至少一个参数准备函数,用于获取该测 试用例中各模拟函数所需的参数。测试用例模块502,当运行一测试用例时,进一步通过执 行其中的参数准备函数来获取其中模拟函数所需的参数。中间函数模块504,进一步通过执 行上述中间函数,进一步读取上述参数准备函数获取的该被测函数对应的模拟函数所需的 参数。
[0086]在一些实例中,中间函数模块504确定模拟函数地址和对象指针的方法为:找到调 用该被测函数的指令的下一条指令的地址,通过此下一条指令的地址找到该被测函数的地 址,并根据该被测函数的地址确定对应的模拟函数的地址和对象指针。
[0087] 上述各个模块实现各种功能的具体方法及原理在前文均有描述,这里不再赘述。 上述各个模块可能位于一台计算设备,也可能分布在多个计算设备中。
[0088] 另外,在本申请各个实例中的装置及各模块可以集成在一个处理单元中,也可以 是各个模块单独物理存在,也可以两个或两个以上装置或模块集成在一个单元中。上述集 成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0089] 在一实施例中,上述的测试装置可运行在任一用于媒体推送控制的计算设备中, 并加载在该计算设备的存储器中。如图5所示,该计算设备除了包括上述控制装置中的各个 模块,还可包括:存储器511、处理器513、总线512、端口 514。处理器513和存储器511通过总 线512互联。处理器513可通过端口 514接收和发送数据以实现网络通信和/或本地通信。上 述各模块501~405可以是存储器501中存储的机器可执行指令模块。处理器503通过执行存 储器501中各模块501~505中包含的机器可执行指令,进而能够实现上述各模块501~505 的功能。
[0090] 另外,本申请的每个实例可以通过由数据处理设备如计算机执行的数据处理程序 来实现。显然,数据处理程序构成了本发明。此外,通常存储在一个存储介质中的数据处理 程序通过直接将程序读取出存储介质或者通过将程序安装或复制到数据处理设备的存储 设备(如硬盘和/或内存)中执行。因此,这样的存储介质也构成了本发明。存储介质可以使 用任何类型的记录方式,例如纸张存储介质(如纸带等)、磁存储介质(如软盘、硬盘、闪存 等)、光存储介质(如CD-ROM等)、磁光存储介质(如M0等)等。
[0091] 因此,本申请还提供了一种非易失性存储介质,其中存储有数据处理程序,该数据 处理程序用于执行本申请上述方法的任何一种实例。
[0092] 以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精 神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
【主权项】
1. 一种计算机程序的测试方法,其特征在于,所述方法包括: 创建中间函数和至少一个测试用例,其中,每一测试用例包括与至少一个被测函数对 应的至少一个基于类的模拟函数; 在所述被测计算机程序中注入与至少一个被测函数相关的跳转指令; 所述方法还包括: 当运行一测试用例时,生成该测试用例中所述模拟函数所属类的对象指针; 当所述至少一个被测函数中的任一者被调用时,通过执行与该被测函数相关的所述跳 转指令而调用所述中间函数; 当所述中间函数被调用时,通过执行所述中间函数,确定该被测函数对应的模拟函数 的地址及其所属类的对象指针并调用所述对应的模拟函数; 当所述模拟函数被调用时,通过执行所述模拟函数,与所述被测函数之间进行交互,并 获得所述被测函数的返回值;及 基于所述返回值确定测试结果。2. 根据权利要求1所述的方法,其中,所述测试用例进一步包括至少一个参数准备函 数,用于获取所述测试用例中各模拟函数所需的参数; 该方法还包括: 当运行一测试用例时,通过执行其中的所述参数准备函数来获取其中所述模拟函数所 需的参数; 通过执行所述中间函数,进一步读取所述参数准备函数获取的该被测函数对应的模拟 函数所需的参数。3. 根据权利要求2所述的方法,进一步包括:根据模拟函数的类型创建相应类型的参数 准备函数; 所述测试实例中包括的参数准备函数与其中模拟函数的类型相应。4. 根据权利要求3所述的方法,其中,所述模拟函数的类型为所述模拟函数的调用约定 的类型。5. 根据权利要求2所述的方法,其中,所述确定该被测函数对应的模拟函数的地址及其 所属类的对象指针,包括: 找到调用该被测函数的指令的下一条指令的地址; 通过所述下一条指令的地址找到该被测函数的地址;及 根据该被测函数的地址确定所述对应的模拟函数的地址和所述对象指针。6. 根据权利要求2所述的方法,其中,该方法的测试环境基于X86系统; 其中,所确定的所述对应的模拟函数的地址、所述对象指针、所需的参数被放入堆栈; 该方法进一步包括: 将所述对象指针传入预设的用于传递对象指针的寄存器;根据所述模拟函数所需的参 数的个数做堆栈调整。7. 根据权利要求2所述的方法,其中,该方法的测试环境基于ARM系统; 其中,所确定的所述对应的模拟函数的地址、所述对象指针、所需的参数被放入堆栈; 该方法进一步包括:将所述模拟函数所需的参数传入预设的用于传递函数参数的寄存 器组;其中,如果所需的参数的个数多于所述寄存器组的寄存器数量,则将所需参数中未能 传入所述寄存器组的参数放入堆栈并作堆栈调整; 将所述对象指针传入用于传递对象指针的寄存器;及 将所述模拟函数的地址传入预设的用于保存当前要跳转的函数地址的寄存器。8. 根据权利要求1至7任一项所述的方法,其中,所述模拟函数所属的类未继承自其它 类。9. 一种计算机程序的测试装置,其特征在于,所述装置包括: 配置模块,创建中间函数和至少一个测试用例,其中,每一测试用例包括与至少一个被 测函数对应的至少一个基于类的模拟函数;在所述被测计算机程序中注入与至少一个被测 函数相关的跳转指令; 所述装置还包括: 测试用例模块,包括所述至少一个测试用例;当运行一测试用例时,生成该测试用例中 所述模拟函数所属类的对象指针; 跳转模块,当所述至少一个被测函数中的任一者被调用时,通过执行与该被测函数相 关的所述跳转指令而调用所述中间函数; 中间函数模块,包括所述中间函数;当所述中间函数被调用时,通过执行所述中间函 数,确定该被测函数对应的模拟函数的地址及其所属类的对象指针并调用所述对应的模拟 函数; 所述测试用例模块,当所述模拟函数被调用时,通过执行所述模拟函数,与所述被测函 数之间进行交互,并获得所述被测函数的返回值;及 测试结果模块,基于所述返回值确定测试结果。10. 根据权利要求9所述的装置,其中,所述测试用例进一步包括至少一个参数准备函 数,用于获取所述测试用例中各模拟函数所需的参数; 所述测试用例模块,当运行一测试用例时,进一步通过执行其中的所述参数准备函数 来获取其中所述模拟函数所需的参数; 所述中间函数模块,进一步通过执行所述中间函数,进一步读取所述参数准备函数获 取的该被测函数对应的模拟函数所需的参数。11. 根据权利要求9或10所述的装置,其中,所述中间函数模块,找到调用该被测函数的 指令的下一条指令的地址;通过所述下一条指令的地址找到该被测函数的地址;及根据该 被测函数的地址确定所述对应的模拟函数的地址和所述对象指针。
【文档编号】G06F11/36GK106055481SQ201610389734
【公开日】2016年10月26日
【申请日】2016年6月2日
【发明人】江涛, 刘华星
【申请人】腾讯科技(深圳)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1