CN1318976C - 软件测试方法及其系统 - Google Patents
软件测试方法及其系统 Download PDFInfo
- Publication number
- CN1318976C CN1318976C CNB200410048146XA CN200410048146A CN1318976C CN 1318976 C CN1318976 C CN 1318976C CN B200410048146X A CNB200410048146X A CN B200410048146XA CN 200410048146 A CN200410048146 A CN 200410048146A CN 1318976 C CN1318976 C CN 1318976C
- Authority
- CN
- China
- Prior art keywords
- function
- function unit
- address
- pile
- subfunction
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明提供了一种软件测试方法,包括设置步骤和测试步骤,所述设置步骤包括:为每个函数单元分别设置函数地址表和套子函数;为每个函数单元编写桩函数;将套子函数的地址跳转偏移和桩函数的地址分别记录到对应的函数单元的函数地址表中;所述测试步骤:被测函数单元运行到调用其他函数单元的调用指令时,跳转到该被调函数单元的函数地址表;根据函数地址表中记录的套子函数的地址跳转偏移,跳转运行对应的套子函数;根据函数地址表中记录的桩函数地址,调用执行对应的桩函数后返回到该被测函数单元的调用指令处继续后续测试。相应地,本发明还提供了一种软件测试系统。本发明可以降低软件测试过程的额外开销,并提高软件测试效率和测试灵活性。
Description
技术领域
本发明涉及测试技术领域,尤其涉及一种软件测试的方法及其系统。
背景技术
在现有很多通信或计算机设备中,或由多相通信或计算机设备组成的通信系统或计算机网络中,有很多数据的处理过程、设备的操作及控制都是由运行在所述设备或系统或网络中的软件来完成。可见,在将软件正式安装并运行在所述的设备或系统或网络中之前,对软件进行严格而全面的测试以保证其正常运行是非常重要的。
在现有技术中,软件测试主要分为三种类型:系统测试、集成测试和单元测试。其中的单元测试就是对整个软件程序中的每个基本组成单元分别进行的测试,所谓“单元”是指具有明确的功能、明确的与其他“单元”部分的接口定义、可清晰的与其他“单元”划分开的程序段。
与其他两种测试类型相比,单元测试重点在于发现软件程序设计或实现的逻辑错误,检查软件程序的健壮性,一般是对软件程序设计或实现中所描述的具体设计单元进行测试。单元测试具体有:黑盒测试技术和白盒测试技术,其中又以白盒测试技术应用更为广泛。所谓白盒测试技术即是:在分析被测试单元内部的结构后,通过对被测试单元的输入输出用例进行构造,达到对被测试单元内程序测试路径的最大覆盖。
在实际的测试中,由于通常被测试单元本身不是一个独立的程序,也不是一个完整的可运行的软件系统,所以利用单元测试进行测试,就得为每个被测试单元开发桩函数(stub)。所述“桩函数”是指用于替代被测试单元调用的一个程序段,桩函数在被调用时,会做一些少量的数据操作后返回给调用它的被测试单元。对于整个测试系统来说,桩函数是额外的开销,是必须开发用于软件测试使用但又不能和最终软件程序一起提交的编程开销。
随着软件测试技术的发展,软件测试技术迫切需要提供一种高效的桩函数构造手段,以尽量减少软件测试的额外开销。
在现有软件测试技术中,大多是使用静态桩技术来实现桩函数,即需要测试人员首先用具体的编程语言编写测试所需要的桩函数,然后同被测试单元的代码一起进行编译及链接生成可执行文件,然后运行所述可执行文件,以获取测试结果。这样,当测试人员发现需要修改被测试单元的代码时,就需要进行重复编译及链接等过程,当被测系统复杂庞大时,这样的重复编译及链接操作就会越频繁,最终将严重导致测试效率的越低。
参照图1,该图是现有技术中使用桩函数进行软件测试的简单处理过程示意图;如该图所示,A函数和B函数均为被测试软件系统中的函数单元,A函数为被测函数单元,且B函数被A函数调用,则A函数被测试的过程如下:
被测试A函数调用B函数时,B函数将跳转到哑巴函数群20中对应的哑巴函数;
该哑巴函数调用补丁处理中心10的接口,通知补丁处理中心10有一个函数进入,需要执行对应的桩函数。调用桩函数可以采用对ESP寄存器(ESP寄存器为用来保存调用栈指针的寄存器)的访问,根据调用桩函数时的输入值定位到对应的桩函数,这里以调用到桩函数C为例进行说明。
这样,桩函数C可以替换B函数对A函数调用B函数时输入的参数进行处理,完成A函数的测试。
但是上述采用桩函数的方式对被测软件系统进行测试的过程主要存在如下不足:
在由B函数调用对应桩函数C的调用过程中,需要对B函数添加保护程序代码,并要求修改正在运行的被测程序中某些代码段的内容,因此增加了测试之外的额外开销,影响了被测软件系统的性能;
被测A函数只能在运行之前调用相应的桩函数,而在运行之后不能再调用相关桩函数,这样在测试过程中就不能对测试的返回值进行控制处理,测试的灵活性较差;
同时由于一般情况下,桩函数都是用脚本语言(如python语言、TCL语言等)编写的函数,而被测函数单元却是用高级语言(如C、C++或者pascal语言等)编写的函数,在软件测试过程中,被调用的桩函数首先需要编译成高级语言,再对被测函数输入的参数进行处理,从而降低了测试效率。
发明内容
本发明要解决的技术问题是提出一种软件测试方法及其系统,以降低软件测试过程的额外开销,并提高软件测试的灵活性。
为解决上述问题,本发明提出了一种软件测试方法,用于对被测软件系统中的每个函数单元进行测试,包括:
设置步骤:
1)为每个函数单元分别设置函数地址表和套子函数;
2)为每个函数单元编写桩函数;
3)将套子函数的地址跳转偏移和桩函数的地址分别记录到对应的函数单元的函数地址表中;
测试步骤:
4)被测函数单元运行到调用其他函数单元的调用指令时,跳转到该被调函数单元的函数地址表;
5)根据该函数地址表中记录的套子函数的地址跳转偏移,跳转运行对应的套子函数;
6)套子函数根据函数地址表中记录的桩函数地址,调用执行对应的桩函数后返回到该被测函数单元的调用指令处继续后续测试。
其中步骤2)中所述桩函数包括用于对输入测试参数进行分析处理的前插桩函数和用于对测试结果参数进行分析处理的后插桩函数。
则所述步骤6)进一步包括:
套子函数根据函数地址表中记录的前插桩函数地址,调用执行前插桩函数;并
根据函数地址表中记录的后插桩函数地址,调用执行后插桩函数。
其中所述步骤3)中还包括分别将每个函数单元的地址记录到对应的函数地址表中的步骤。
则所述步骤6)中还包括套子函数根据被调函数单元的函数地址表中记录的函数单元地址,调用执行被调函数单元的步骤。
其中所述步骤6)进一步包括:
套子函数根据函数地址表中记录的前插桩函数地址,调用执行前插桩函数;并
根据该被调函数单元的函数地址表中记录的函数单元地址,调用执行被调函数单元;及
根据函数地址表中记录的后插桩函数地址,调用执行后插桩函数。
其中所述步骤1)中在将每个函数单元的源代码形式编译链接成目标代码形式的过程中为每个函数单元设置套子函数和函数地址表;并在步骤3)中将套子函数的地址跳转偏移和对应的函数单元的地址记录到所述函数地址表中。
其中所述步骤3)在将对应的桩函数的源代码编译链接成可执行的目标代码进行存储后,将桩函数的存储位置地址记录到所述函数地址表中。
其中所述步骤2)中利用高级语言编写桩函数。
相应地,本发明还提出了一种软件测试系统,包括:
测试控制模块,用于对所述测试系统进行初始化,并在初始化过程中为每个函数单元设置函数地址表和套子函数;
编译链接模块,与所述测试控制模块连接,用于将外界输入的测试指令编译链接成可执行的目标代码,并将为每个函数单元编写的桩函数源代码编译链接成可执行的目标代码后存储;
地址表管理模块,与所述测试控制模块连接,用于管理为每个函数单元设置的函数地址表,并在函数地址表中记录对应的函数单元地址、套子函数地址跳转偏移和桩函数的地址;
套子函数管理模块,与所述测试控制模块连接,用于管理为每个函数单元设置的套子函数,并在测试过程中根据函数地址表记录的地址信息,控制相应的套子函数调用执行相关的桩函数或函数单元。
本发明软件测试方法及其系统能够达到如下的有益效果:
A.通过为每个函数单元设置套子函数和函数地址表,从而可以实现套子函数根据函数地址表中记录的各个函数地址信息,调用执行被调函数单元对应的桩函数,因此就避免了由被调函数单元调用相应桩函数所需的额外保护代码,降低了测试过程中的额外开销;
B.由于本发明使用每个函数单元的套子函数对相应桩函数进行调用,因此可以实现对多个桩函数分别进行调用执行的目的,如可以为每个函数单元分别设置前插桩函数和后插桩函数,以实现对测试输入参数和测试结果参数进行分析控制的目的,因此提高了测试的灵活性;
C.由于本发明采用高级语言对每个函数单元的桩函数进行编写,因此在软件测试过程中,不用对桩函数进行编译后再使其对测试输入参数和测试结果参数进行分析,因此提高了软件测试的效率。
附图说明
图1是现有技术中使用桩函数进行软件测试的简单处理过程示意图;
图2是本发明软件测试系统的结构组成示意图;
图3是本发明软件测试方法使用插入桩方式对函数单元进行测试的过程示意图;
图4是本发明软件测试方法使用覆盖桩方式对函数单元进行测试的过程示意图。
具体实施方式
由于一个完整的软件程序可以从组成结构上划分为多个函数单元,而软件测试过程就可以对软件程序中的每个函数单元分别进行测试,现有技术的白盒测试就是采用这种分别对每个函数单元进行测试以完成对被测软件系统进行逻辑测试的目的。
而单元测试技术在对每个函数单元进行测试的过程中,一般不能对被测函数单元进行单独测试,而是要依赖被测函数单元调用其他函数单元的功能来实现,但是当被调函数单元的功能没有编写完善时,则会影响到被测函数单元的测试结果,造成测试结果的不准确。
所以为了在被调函数单元的功能没有编写完善的情况下,仍能保证对被测函数单元进行准确性测试,这时就需要由测试人员预先为每个函数单元编写桩函数,以使用编写的桩函数替换被调函数单元,来完成对被测函数单元的测试,而被编写了桩函数的函数单元这里定义为被打桩函数。
本发明软件测试方法及其系统正是基于函数单元测试技术,提出为软件系统中的每个函数单元设置套子函数,由套子函数来完成对函数单元的桩函数进行调用执行,同时使用套子函数对桩函数进行调用的方式还可以扩展桩函数功能,使软件测试过程更为灵活。
本发明软件测试方法及其系统提出的套子函数功能如下:
套子函数是对桩函数功能的扩充,通过对函数单元前后插入桩函数的办法来达到对函数单元的控制,套子函数可以调用执行被打桩函数,同时可以实现如下插入桩函数的功能:在被打桩函数前运行前插桩函数,以获得对被打桩函数接收的测试参数的控制;在被打桩函数后运行后插桩函数,以获得对被打桩函数的输出和返回值的控制;在套子函数里也可以实现不调用被打桩函数,直接调用执行相应的桩函数,以实现覆盖桩的功能。另外,套子函数也可以直接针对被测函数单元,在桩函数里面添加任意功能的代码,实现对被测函数单元的功能进行扩展,以对被测函数单元的运行性能做准确分析,并对被测函数单元运行所使用的内存资源进行监控。由此可见,套子函数的设置可以实现丰富灵活的对函数单元进行测试的目的。
下面结合附图对本发明软件测试方法及其系统的具体实施过程作进一步的详细描述。
参照图2,该图是本发明软件测试系统的结构组成示意图;图中由被测软件系统1和软件测试系统2两大部分组成。其中被测软件系统1中的函数单元A为被测函数单元,函数单元A在被测过程中会调用函数单元B,则测试人员会预先为函数单元B编写桩函数,并将编写的桩函数的源代码形式编译链接成可执行的目标代码形式存储在内存中;则这时函数单元B就是前述定义的被打桩函数单元。软件测试系统2主要包括测试控制模块100、编译链接模块200、地址表管理模块300和套子函数管理模块400,各个模块之间的联系及其作用如下:
测试控制模块100,用于对整个软件测试系统2进行初始化处理,以完成为被测软件系统1中的每个函数单元分别设置函数地址表和套子函数;测试控制模块100主要负责软件测试系统2的初始化,即接受外界的测试指令和测试人员编写的测试代码,在测试时是测试运行的发起者。处理软件测试系统的初始化主要是指负责将被测软件系统1的源代码编译链接成可执行的目标代码,即成为可执行的被测系统,在此对被测软件系统进行编译链接的过程中同时给被测软件系统1中的每个函数单元(函数单元是否被打桩,在此并不确定,所以这个地方指被测软件系统1中的所有函数单元)装置上各自的套子函数。同时还要在此过程中为每个函数单元配置上一个函数地址表,以记载和对应函数单元相关的每个函数在内存中的地址信息,其中每个套子函数410由后续的套子函数管理模块400来管理,而每个函数地址表310由地址表管理模块300来管理,测试控制模块100通过调用地址表管理模块300和套子函数管理模块400提供的应用程序接口(API,Application ProgrammingInterface)来实现对整个软件测试系统2的初始化。
测试过程举例来说明:假设被测软件系统中有函数单元myFunc,其调用了函数单元funcA,现在对函数单元myFunc进行测试,就需要对函数单元funcA进行编写桩函数,那么funcA就是被打桩函数单元,用户对其编写桩函数测试代码,写了两个桩函数,即桩函数funcA_before(指插在函数单元funcA之前运行的桩函数,即前插桩函数)和桩函数funcA_after(指插在函数单元funcA之后运行的桩函数,即后插桩函数),测试控制模块100获取这两个桩函数的源代码文本后就调用套子函数管理模块400的API进行处理。
编译链接模块200,与测试控制模块100进行逻辑连接,用于将外界输入的测试指令编译链接成可执行的目标代码,并将测试人员为每个函数单元编写的桩函数的源代码编译链接成可执行的目标代码后存储在内存在内存中;其编译链接过程既是目标代码(object)的导入过程:这个过程可以实现桩函数的动态导入,类似于windows的动态链接库(Dynamic-Link Library)技术。编译链接模块200将测试人员编写好的桩函数源代码或测试指令编译链接成目标代码,然后动态导入到正在运行的被测软件系统1中。
地址表管理模块300,与测试控制模块100进行逻辑连接,用于管理为每个函数单元设置的函数地址表310,并在函数地址表310中记录对应的函数单元地址、套子函数地址跳转偏移和每个桩函数的地址;本发明所提到的套子函数技术的实现主要依赖这个函数地址表。函数地址表310的设计是给每个被测函数单元分别分配一个表项所组成的,采用一字节对齐方式,每个函数地址表310的具体结构如下:
函数地址表项数据结构 | ||
域名称 | 占用字节数 | 说明 |
push_or_jmp_codel | 1 | 这里填入跳转指令或者压栈指令的机器码 |
Ul User Insert Proc BeforeCall_or_called function | 4 | 如果push_or_jmp_codel域填入压栈指令,则此处就填入前插桩函数的地址;如果push_or_jmp_codel域填入跳转指令,则此处就填入被打桩函数单元的地址跳转偏移 |
push_code2 | 1 | 填入压栈指令的机器码 |
Ul Called Funo Address | 4 | 填入被打桩函数单元的地址 |
push_code3 | 1 | 填入压栈指令的机器码 |
Ul User Insert Proc After Call | 4 | 填入后插桩函数的地址 |
jmp_code | 1 | 填入跳转指令的机器码 |
Ul Shell Func Addr | 4 | 填入套子函数的地址跳转偏移 |
下面结合上面的函数地址表310结构说明地址表管理模块300填写每个函数地址表项的过程:
在测试控制模块100进行系统初始化的过程中,会为被测软件系统中的每个函数单元分配一个函数地址表310,如以被测软件系统中的函数单元funcA(假设它是后来测试过程中被打桩的函数单元)为例,后续在对被测软件系统进行编译链接的过程中将函数单元funcA的地址替换为funcA的函数地址表310的地址(因为被测软件系统的编译链接是由测试人员来接管的,测试控制模块100对被测软件系统进行初始化操作时会做这个工作),这样就使得在测试过程中,当运行到本来应该调用函数单元funcA的指令时,就会跳转运行该函数单元funcA的函数地址表310中的相应指令;同时将函数单元funA的真实地址填入函数地址表310的ul Called Func Address域,并且将funcA的函数地址表310的头两项内容先缺省设置为跳转到funcA的地址的机器指令。然后在函数地址表310的最后一项填入funcA的套子函数的地址,套子函数的地址由后续套子函数管理模块400提供,该函数地址表310的其余项内容暂时不填。这些步骤做完后,也实现了利用函数地址表310对函数funcA装上相应套子函数的目的,只是缺省时套子函数还是执行原函数单元funcA(因为缺省函数地址表310的头两个域的机器指令就是跳转到函数单元funcA的原来地址)。
而在对被测软件系统进行测试的过程中,如果测试人员需要对函数单元funcA进行打桩(即为funcA编写桩函数),而且为其写好的前插桩函数funcA_before和后插桩函数funcA_after两个插桩函数已经由后续的套子函数管理模块400处理好了,则将funcA的函数地址表310的剩余内容依次填入,并将该函数地址表310的push_or_jmp_codel域改为压栈指令,相应的Ul UserInsert Proc Before Call_or_calledfunction域改成前插桩函数funcA_before的地址。
这样基于上述的处理,在被测软件系统中运行到调用函数单元funcA的调用指令时就会跳转运行funcA的函数地址表310,进而根据函数地址表310中记录的funcA的套子函数的地址信息,跳转运行funcA的套子函数。
套子函数管理模块400,与测试控制模块100逻辑连接,用于管理为每个函数单元设置的套子函数410,并在测试过程中根据函数地址表记录的各个地址信息,控制相应的套子函数调用执行与被测函数单元调用的函数单元相关的桩函数或调用执行被测函数单元调用的函数单元。套子函数管理模块400负责管理每个套子函数410,并负责管理供套子函数410调用的各个桩函数。套子函数管理模块400在得到测试控制模块100传来的桩函数源代码后就调用编译链接模块200的接口,从而获取经过编译链接模块200处理后的桩函数的目标代码,并将桩函数的目标代码存放在内存中,后续套子函数410会根据函数地址表中的相应桩函数地址记录信息去相应内存位置调用执行对应的桩函数。
后续,当测试人员要对存储在内存中的桩函数进行编辑操作(包括修改桩函数代码,删除桩函数,增加桩函数等)时,测试控制模块100就会调用套子函数管理模块400,套子函数管理模块400则负责动态更新桩函数的目标代码。
套子函数管理模块400能够实现使每个套子函数410对相应的桩函数进行调用执行,因为在funcA的函数地址表中运行调用funcA的套子函数指令之前已经将前插桩函数funcA_before、函数单元funcA和后插桩函数funcA_after的地址依次压栈了(即已经记录在函数地址表中),所以这些地址信息就是套子函数利用的参数,套子函数利用地址表中记录的各个地址信息就可以很方便的对各个函数段(包括桩函数和被调用的函数单元)进行调用执行。同时,套子函数还可以访问堆栈,获取本来传给被调函数单元funcA(即被打桩的函数单元)的参数。
通过上述对本发明软件测试系统的具体描述,已经能够看出相应于本发明软件测试系统的测试方法的大体实施过程,请参照图3,该图是本发明软件测试方法使用插入桩方式对函数单元进行测试的过程示意图;图中假设对被测软件系统中的函数单元MyFunc进行测试,在测试过程中,函数单元MyFunc将调用函数单元FuncA,则使用本发明软件测试方法实现对函数单元MyFunc进行测试的过程如下:
步骤S1至步骤S3的过程为对软件测试系统进行初始化的阶段。
步骤S1,由测试控制模块为函数单元FuncA配置函数地址表;
步骤S2,由测试控制模块为函数单元FuncA配置套子函数;
步骤S3,由测试控制模块控制编译链接模块将被测软件系统中的每个被测函数单元的源代码编译链接成目标代码,使得被测软件系统和软件测试系统运转起来;
步骤S4至步骤S12为对函数单元进行测试的过程。
步骤S4,由测试控制模块控制编译链接模块动态导入测试人员为函数单元FuncA编写的前插桩函数funcA_before和后插桩函数funcA_after,以将前插桩函数funcA_before和后插桩函数funcA_after的源代码编译链接成目标代码形式存储在内存的相应位置上;在桩函数导入之后,将函数单元FuncA的函数地址表填写完全,其中包括函数单元FuncA的地址、函数单元FuncA的套子函数的地址、函数单元FuncA的前插桩函数funcA_before的地址和函数单元FuncA的后插桩函数funcA_after的地址;
步骤S5,在调用函数单元FuncA的调用指令处设置地址跳转偏移,以使在函数单元FuncA被调用时,跳转到函数单元FuncA的函数地址表;
步骤S6,在对函数单元MyFunc进行测试的过程中,当函数单元MyFunc调用函数单元FuncA时,会跳转运行函数单元FuncA的函数地址表中的相应机器指令;
步骤S7,funcA的函数地址表中的相应机器指令会指示跳转运行funcA的套子函数;
步骤S8,跳转运行到funcA的套子函数后,funcA的套子函数先执行测试人员编写的前插桩函数funcA_before,在前插桩函数funcA_before里可以编写实现任意功能代码,例如用前插桩函数funcA_before修改传给函数单元funcA的参数和funcA的运行环境,具体内容由测试人员在前插桩函数funcA_before中自行定制;
步骤S9,在函数单元funcA的函数地址表中调用执行原函数单元funcA,执行函数单元funcA原来的代码;
步骤S10,对函数单元funcA执行完成后返回到funcA的套子函数;
步骤S11,由函数单元funcA的套子函数继续调用执行测试人员编写的后插桩函数funcA_after;同理,在后插桩函数funcA_after中可以对函数单元funcA运行的返回值和输出结果进行操作,例如可以对函数单元funcA的运行结果进行读取和修改等操作;同时用户也可以在后插桩函数funcA_after里编写实现任意功能的代码,具体编写何种功能的代码也由测试人员在后插桩函数funcA_after中自行定制;
步骤S12,函数单元funcA的套子函数对funcA的后插桩函数调用执行完成后,返回到被测函数单元myfunc调用函数单元funcA的调用指令处,继续执行后续的测试。
上例只是以插入桩的方式描述了使用套子函数技术对函数单元进行测试的过程,下面再以覆盖桩的方式描述本发明使用套子函数技术对被测函数单元进行测试的过程。请参照图4,该图是本发明软件测试方法使用覆盖桩方式对函数单元进行测试的过程示意图;其处理过程如下:
其中步骤S20至步骤S27的处理过程同图3中的步骤S1至步骤S8的处理过程,这里不再重复赘述;在步骤S27中由函数单元FuncA的套子函数对FuncA的前插桩函数funcA_before进行调用执行后,将不再去调用执行原函数单元FuncA中的代码,而是直接执行步骤S28,由函数单元funcA的套子函数继续调用执行测试人员为函数单元FuncA编写的后插桩函数funcA_after;再在步骤S29中返回到被测函数单元myfunc调用函数单元funcA的调用指令处,继续执行后续的测试。这个处理过程中套子函数并不调用执行原函数单元funcA,只是执行测试人员编写的桩函数代码,然后直接返回到被测函数单元MyFunc的调用指令处,从而实现了桩函数对原函数单元funcA运行的完全替代,即覆盖桩过程。
本发明软件测试方法及其系统提出用高级语言(如C语言。C++语言或pascal语言)编写桩函数,由于被测软件系统中的函数单元和桩函数都是用高级语言编写的函数,所以在测试过程中,不用再将桩函数编译成高级语言后再进行测试,所以提高了测试的效率。
本发明使用套子函数技术对函数单元进行测试可以提高测试的灵活性,主要体现在如下方面:
(1)可以测试函数单元的性能:如可以在函数单元的前插桩函数中和后插桩函数中分别打上时间戳,以统计被测函数单元的运行时间;
(2)可以对函数单元所使用的内存资源进行监控:如可以在函数单元的前插桩函数中设置打开内存监控的开关,同时在后插桩函数中设置关闭内存监控的开关,这样可以实现原函数单元在被测过程中对内存的申请和释放分别做记录,以分析是否有内存泄漏发生。
(3)在套子函数里编写相应功能的代码可以实现对函数单元属性的获取(如函数单元的被测次数,函数单元接收的测试参数,函数单元的返回值等):
如在软件测试过程中,可以统计某个函数单元的运行次数,只需要给这个函数单元装上套子函数,然后在该函数单元的前插桩函数中编写一个计数器即可;
也可以使用函数单元的套子函数访问堆栈的指针,由此可以得到在栈中保存的各类参数,由此分析栈中的数据,以得到函数单元调用的栈信息;
函数单元运行后的返回值一般都保存在特定寄存器里,例如X86体系结构的函数单元前4字节的返回值是保存在EAX寄存器中,PPC体系结构的函数单元的返回值是保存在r3和r4寄存器中,这样本发明就可以在函数单元的后插桩函数中编写相应功能的代码以得到对函数单元运行后的返回值的访问和控制。
(4)使用套子函数技术可以实现对函数单元功能的扩展:如测试人员只需要在函数单元的前插桩函数和后插桩函数中编写实现各种功能的代码,即可实现对原函数单元功能的扩展。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (10)
1、一种软件测试方法,用于对被测软件系统中的每个函数单元进行测试,其特征在于,包括如下步骤:
设置步骤:
1)为每个函数单元分别设置函数地址表和套子函数;
2)为每个函数单元编写桩函数;
3)将套子函数的地址跳转偏移和桩函数的地址分别记录到对应的函数单元的函数地址表中;
测试步骤:
4)被测函数单元运行到调用其他函数单元的调用指令时,跳转到该被调函数单元的函数地址表;
5)根据函数地址表中记录的套子函数的地址跳转偏移,跳转运行对应的套子函数;
6)套子函数根据函数地址表中记录的桩函数地址,调用执行对应的桩函数后返回到该被测函数单元的调用指令处继续后续测试。
2、根据权利要求1所述的软件测试方法,其特征在于,步骤2)中所述桩函数包括用于对输入测试参数进行分析处理的前插桩函数和用于对测试结果参数进行分析处理的后插桩函数。
3、根据权利要求2所述的软件测试方法,其特征在于,所述步骤6)进一步包括:
套子函数根据函数地址表中记录的前插桩函数地址,调用执行前插桩函数;并
根据函数地址表中记录的后插桩函数地址,调用执行后插桩函数。
4、根据权利要求2所述的软件测试方法,其特征在于,所述步骤3)中还包括分别将每个函数单元的地址记录到对应的函数地址表中的步骤。
5、根据权利要求4所述的软件测试方法,其特征在于,所述步骤6)中还包括套子函数根据被调函数单元的函数地址表中记录的函数单元地址,调用执行被调函数单元的步骤。
6、根据权利要求4所述的软件测试方法,其特征在于,所述步骤6)进一步包括:
套子函数根据函数地址表中记录的前插桩函数地址,调用执行前插桩函数;并
根据该被调函数单元的函数地址表中记录的函数单元地址,调用执行被调函数单元;及
根据函数地址表中记录的后插桩函数地址,调用执行后插桩函数。
7、根据权利要求4所述的软件测试方法,其特征在于,
所述步骤1)中在将每个函数单元的源代码形式编译链接成目标代码形式的过程中为每个函数单元设置套子函数和函数地址表;并
在步骤3)中将套子函数的地址跳转偏移和对应的函数单元的地址记录到所述函数地址表中。
8、根据权利要求1所述的软件测试方法,其特征在于,所述步骤3)在将对应的桩函数的源代码编译链接成可执行的目标代码进行存储后,将桩函数的存储位置地址记录到所述函数地址表中。
9、根据权利要求1所述的软件测试方法,其特征在于,所述步骤2)中利用高级语言编写桩函数。
10、一种软件测试系统,用于对被测软件系统中的每个函数单元进行测试,其特征在于,包括:
测试控制模块,用于对所述测试系统进行初始化,并在初始化过程中为每个函数单元设置函数地址表和套子函数;
编译链接模块,与所述测试控制模块连接,用于将外界输入的测试指令编译链接成可执行的目标代码,并将为每个函数单元编写的桩函数源代码编译链接成可执行的目标代码后存储;
地址表管理模块,与所述测试控制模块连接,用于管理为每个函数单元设置的函数地址表,并在函数地址表中记录对应的函数单元地址、套子函数地址跳转偏移和桩函数的地址;
套子函数管理模块,与所述测试控制模块连接,用于管理为每个函数单元设置的套子函数,并在测试过程中根据函数地址表记录的地址信息,控制相应的套子函数调用执行相关的桩函数或函数单元。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB200410048146XA CN1318976C (zh) | 2004-06-16 | 2004-06-16 | 软件测试方法及其系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB200410048146XA CN1318976C (zh) | 2004-06-16 | 2004-06-16 | 软件测试方法及其系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1710547A CN1710547A (zh) | 2005-12-21 |
CN1318976C true CN1318976C (zh) | 2007-05-30 |
Family
ID=35706792
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB200410048146XA Expired - Fee Related CN1318976C (zh) | 2004-06-16 | 2004-06-16 | 软件测试方法及其系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN1318976C (zh) |
Families Citing this family (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100388195C (zh) * | 2006-02-22 | 2008-05-14 | 北京金山软件有限公司 | 一种64位视窗操作系统下获取函数参数的方法及系统 |
CN101334753B (zh) * | 2007-06-26 | 2012-03-07 | 中兴通讯股份有限公司 | 一种单元测试方法及其装置 |
CN103294457B (zh) * | 2012-02-27 | 2017-02-01 | 百度在线网络技术(北京)有限公司 | 动态替换主程序中c/c++函数的方法及装置 |
US9063759B2 (en) | 2012-03-28 | 2015-06-23 | International Business Machines Corporation | Optimizing subroutine calls based on architecture level of called subroutine |
CN103049378A (zh) * | 2012-12-18 | 2013-04-17 | 惠州市亿能电子有限公司 | 一种无需仿真器的程序调试方法 |
CN103019944A (zh) * | 2013-01-10 | 2013-04-03 | 曙光信息产业(北京)有限公司 | 基于代码注入方式的测试方法和装置 |
CN104834590B (zh) * | 2014-02-11 | 2018-11-23 | 腾讯科技(深圳)有限公司 | 软件测试方法和系统 |
CN105677297B (zh) * | 2014-11-18 | 2018-05-04 | 龙芯中科技术有限公司 | 套锁实现方法及装置 |
CN104572482B (zh) * | 2014-12-19 | 2017-11-17 | 北京华为数字技术有限公司 | 一种过程变量的存储方法及装置 |
CN105808421A (zh) * | 2014-12-31 | 2016-07-27 | 中兴通讯股份有限公司 | 一种实现白盒测试的方法和测试控制端 |
CN105630679B (zh) * | 2015-12-23 | 2019-04-23 | 北京奇虎科技有限公司 | 代码测试的方法及装置 |
CN106095416B (zh) * | 2016-06-01 | 2020-10-09 | 腾讯科技(深圳)有限公司 | 一种在应用程序中的跳转处理方法、装置及智能终端 |
CN112269735A (zh) * | 2020-10-20 | 2021-01-26 | 深圳市前海手绘科技文化有限公司 | 一种测试脚本自动生成方法 |
CN112181851B (zh) * | 2020-10-27 | 2023-07-28 | 北京字跳网络技术有限公司 | 软件测试方法、设备及存储介质 |
CN115617687B (zh) * | 2022-10-31 | 2023-08-25 | 清华大学 | 程序插桩方法、装置、设备和存储介质 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1369714A (zh) * | 2001-07-18 | 2002-09-18 | 中国人民解放军第二炮兵工程学院技术开发中心 | 大规模集成电路边界扫描测试系统 |
US6523169B1 (en) * | 1996-12-04 | 2003-02-18 | Siemens Aktiengesellschaft | Method for testing system components of an object-oriented program |
US6668340B1 (en) * | 1999-12-10 | 2003-12-23 | International Business Machines Corporation | Method system and program for determining a test case selection for a software application |
CN1471249A (zh) * | 2002-07-23 | 2004-01-28 | 华为技术有限公司 | 一种使用脚本补丁的白盒测试系统及其测试方法 |
US6708324B1 (en) * | 1999-06-24 | 2004-03-16 | Cisco Technology, Inc. | Extensible automated testing software |
CN1503136A (zh) * | 2002-11-21 | 2004-06-09 | 深圳市中兴通讯股份有限公司 | 一种嵌入式软件测试方法 |
-
2004
- 2004-06-16 CN CNB200410048146XA patent/CN1318976C/zh not_active Expired - Fee Related
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6523169B1 (en) * | 1996-12-04 | 2003-02-18 | Siemens Aktiengesellschaft | Method for testing system components of an object-oriented program |
US6708324B1 (en) * | 1999-06-24 | 2004-03-16 | Cisco Technology, Inc. | Extensible automated testing software |
US6668340B1 (en) * | 1999-12-10 | 2003-12-23 | International Business Machines Corporation | Method system and program for determining a test case selection for a software application |
CN1369714A (zh) * | 2001-07-18 | 2002-09-18 | 中国人民解放军第二炮兵工程学院技术开发中心 | 大规模集成电路边界扫描测试系统 |
CN1471249A (zh) * | 2002-07-23 | 2004-01-28 | 华为技术有限公司 | 一种使用脚本补丁的白盒测试系统及其测试方法 |
CN1503136A (zh) * | 2002-11-21 | 2004-06-09 | 深圳市中兴通讯股份有限公司 | 一种嵌入式软件测试方法 |
Also Published As
Publication number | Publication date |
---|---|
CN1710547A (zh) | 2005-12-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1318976C (zh) | 软件测试方法及其系统 | |
CN103064720B (zh) | 简档导向的jit代码生成 | |
CN100461197C (zh) | 一种恶意代码自动分析系统及方法 | |
KR950006619B1 (ko) | 번역 코드 실행용의 개선된 에러 기록 방법 및 시스템 | |
CN101739339B (zh) | 一种基于程序动态依赖关系的软件故障定位方法 | |
CN100541445C (zh) | 一种程序调测系统及方法 | |
US20080127113A1 (en) | Method and system for implementing watchpoints | |
US20230004368A1 (en) | Multi-chip compatible compiling method and device | |
CN109976760A (zh) | 一种图形语言的交叉编译方法及交叉编译器 | |
CN101084485A (zh) | 用于改善片上仿真系统中高级语言的仿真速度的装置和方法 | |
CN103778061A (zh) | 数组越界错误的自动检测和校正方法 | |
CN103885770A (zh) | 单片机从可执行文件找回汇编文件的实现方法 | |
CN104156311B (zh) | 一种基于cpu模拟器的嵌入式c语言目标码级单元测试方法 | |
US20100162217A1 (en) | Debugging System Using Static Analysis | |
CN103019787A (zh) | 函数调用关系确定方法、热补丁升级方法及装置 | |
CN115617687B (zh) | 程序插桩方法、装置、设备和存储介质 | |
CN103399814A (zh) | 自动化测试的方法及装置 | |
US20200143061A1 (en) | Method and apparatus for tracking location of input data that causes binary vulnerability | |
CN101980546B (zh) | 智能网平台、业务执行方法和分析业务异常的方法 | |
CN112882718A (zh) | 编译处理方法、装置、设备及存储介质 | |
CN107526679A (zh) | 自动化测试框架、基于其上的自动化测试方法、存储介质和计算机设备 | |
US6519768B1 (en) | Instruction translation method | |
US20070277165A1 (en) | Debugging Interpreted Input | |
JPH0748182B2 (ja) | プログラム・エラー検出方法 | |
CN113836023B (zh) | 一种基于体系结构交叉检查的编译器安全性测试方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20070530 Termination date: 20160616 |
|
CF01 | Termination of patent right due to non-payment of annual fee |