一种软件单元测试函数打桩方法与流程
本发明涉及一种软件单元测试函数打桩方法,属于软件测试。
背景技术:
1、在软件单元测试中,函数打桩是一种常用的技术,用于模拟和控制函数的行为,以便在测试环境中隔离待测代码和其依赖的外部组件或模块。打桩的主要目的是为了在测试过程中替换实际的函数调用,从而提供可预测的返回值或行为,以便测试代码的特定部分而不依赖于外部系统或复杂的依赖关系。
2、在测试过程中,用一个桩函数替换掉实际的函数。桩函数通常是一个轻量级的替代函数,能够模拟实际函数的行为,但其实现通常更加简单,并且可以预先设定返回值或行为。这样,测试人员可以在不依赖实际函数实现的情况下,对待测代码进行测试。
3、然而,随着编程语言和软件架构的演进,函数打桩技术面临着新的挑战。特别是在c++等支持面向对象特性的语言中,传统的打桩方法往往难以处理命名空间、类成员函数、抽象类以及模板等复杂语言特性。以自动化单元与集成测试工具sunwiseaunit为例,其现有的c语言函数打桩方案在面对c++代码时显得力不从心——无法有效处理成员函数打桩、抽象类接口模拟以及模板类或函数的动态实例化等场景。这一技术瓶颈严重制约了工具在现代c++项目中的适用性,亟需一种能够适应c++语言特性的新型函数打桩方法,以完善sunwiseaunit对c++语言的全面支持。
4、目前,函数打桩的方法主要有两种:
5、1)基于二进制库替换或修改函数地址的方式。专利cn202010789767公开了一种函数打桩方法和装置,该方法编译存储含有桩函数的桩函数库,并记录桩函数库在编译后的函数地址;使应用程序以动态库的形式加载连接到应用程序的伪共享库和代理程序,使代理程序重载伪共享库,以此实现对应用程序中函数打桩。专利cn201510322979公开了一种linux内核单元测试动态打桩的方法,其内核打桩模块获取代码段的读写权限,修改调用指令的目标地址为桩函数地址,以此实现动态打桩。上述方法优势是可以对运行中的程序打桩,但是依赖于特定的编译器和平台,不同的平台需要进行定制开发,适用性较差。
6、2)基于源代码修改变换的方式。这种方法通过在源代码层面进行修改和变换来实现桩函数的替换,常见的单元测试框架或工具如google test、testbed、c++test等均采用这种方式进行打桩。由于在源码层面进行操作,该方法具有良好的跨平台支持和多编译器兼容性,具备较好的通用性和可移植性,因此在实际应用中非常广泛。尽管基于源代码修改变换的桩函数方法在支持跨平台和编译器方面表现优异,但现有的测试框架和工具在实际使用中仍存在一些不足:
7、(1)例如,google test采用c++编写,框架过于复杂,仅框架引入的代码膨胀即接近2mb,不适用嵌入式环境;
8、(2)对于c++test、testbed等国外商业工具,存在授权问题,且代码变换与其底层框架绑定,不利于在自研的单元测试工具中集成;
9、(3)另外在实际测试中存在打桩状态动态切换的需求,例如,运行某个用例时,对某个函数进行多次调用,并希望在某几次被调用时使用桩函数而其他情况下调用真实函数,现有工具通常无法支持。
技术实现思路
1、本发明解决的技术问题是:克服现有技术的不足,提出了一种软件单元测试函数打桩方法,在函数入口插入打桩判定代码,当打桩时直接跳转到对应的桩函数执行并返回结果,否则继续向下执行原被调用函数逻辑,最终基于打桩判定的结果实现函数动态打桩。
2、本发明的技术解决方案是:
3、一种软件单元测试函数打桩方法,包括:
4、定义桩行为类型aumockinfo,包括返回值指针、当前对象this指针、桩函数参数个数以及参数指针数组,完整描述桩函数的行为;统一桩函数接口,所述桩函数接口返回值仅包含一个aumockinfo指针类型的参数,桩函数所有行为均通过所述参数传递;定义相应的桩函数指针,所有桩函数通过桩函数指针方式调用;
5、建立桩函数映射表和桩函数打桩状态序列映射表;其中,桩函数映射表记录函数名字符串和桩函数指针的映射关系,桩函数打桩状态序列映射表记录函数名字符串和函数打桩状态序列的映射关系;
6、获取待测函数中的多个被调用函数,对每一个被调用函数分别进行如下处理:
7、若被调用函数以源码形式定义,则对所述被调用函数进行如下变换:在被调用函数入口处插入aumockinfo类型的变量定义,使用函数返回值、当前对象指针、参数列表初始化;再插入打桩判定语句,用于判定是否打桩,若打桩则跳转到桩函数中执行,否则执行源代码逻辑;
8、若被调用函数无源码或以库的形式提供,则生成对应的包装函数,并修改代码为调用包装函数;在包装函数入口处插入aumockinfo类型变量定义以及打桩判定语句,若打桩则跳转到桩函数中执行,否则调用原被调用函数。
9、进一步地,打桩判定语句的原型为:
10、if(aunitdomock(funcname,aumockinfo))
11、其中,funcname为函数完整名字符串,aumockinfo为指向桩函数行为变量的指针。
12、进一步地,根据打桩判定语句,判定是否打桩,具体为:
13、在打桩判定语句aunitdomock中,先判断桩函数映射表中是否包含被调用函数名:若包含,则表示打桩,再通过桩函数映射表获取桩函数指针来调用桩函数;否则不打桩,执行被调用函数原始逻辑;
14、若判定为打桩,进一步查询桩函数打桩状态序列映射表是否包含该被调用函数名:若包含,表示该被调用函数在调用过程中存在打桩状态切换,根据被调用函数名获取对应的打桩状态序列,并结合当前调用次数确定当前的打桩状态;若不包含,则一直按打桩处理。
15、进一步地,进行打桩测试的方法为:
16、编写测试用例,先清空桩函数映射表和桩函数打桩状态序列映射表;在用例脚本中定义桩函数,桩函数无返回值,仅包含一个aumockinfo指针类型参数,桩函数中通过对参读写操作,实现桩函数行为模拟;在桩函数映射表中添加函数名和桩函数的映射关系,接着获取用例数据中该函数打桩状态序列,在桩函数打桩状态序列映射表中添加函数名和打桩状态序列映射关系,之后编写用例输入、调用待测函数以及设定预期结果;
17、执行用例脚本,完成测试。
18、进一步地,根据定义好的各被调用函数的桩函数,将函数名字符串与桩函数的映射关系添加到桩函数映射表中。
19、进一步地,根据当前测试用例的函数打桩状态及测试要求,若桩函数存在打桩状态切换,则将函数名字符串与打桩状态序列的映射关系添加到桩函数打桩状态序列映射表。
20、进一步地,若测试要求被调用函数进行动态打桩,则定义打桩状态序列;其中,当某次调用需执行真实函数时,将该次序列值设为0;若某次调用需执行桩函数时,将该次序列值设为1。
21、一种计算机可读存储介质,所述的计算机可读存储介质存储有计算机程序,所述的计算机程序被处理器执行时实现上述方法的步骤。
22、一种电子设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述的计算机程序时实现上述方法的步骤。
23、一种计算机程序产品,包括计算机程序/指令,该计算机程序/指令被处理器执行时实现上述方法的步骤。
24、本发明与现有技术相比的优点在于:
25、(1)本发明通过在桩函数映射表中绑定函数名和桩函数指针映射关系,以及在用例中通过修改函数指针映射关系灵活绑定不同桩函数逻辑的方法,解决了不同测试用例间桩函数无法隔离的问题,实现灵活打桩的目的。
26、(2)本发明通过代码变换、对库函数添加包装函数以及在包装函数中添加打桩判断的方法,解决了无法对库函数打桩的问题,实现了对源码函数及库函数的统一打桩支持。
27、(3)本发明通过在桩函数打桩状态序列映射表中绑定函数名和打桩状态序列映射关系,以及在脚本中设定打桩状态序列,解决了在同一个用例中桩函数被多次调用无法支持某几次调用打桩、其它情况下不打桩的问题,实现了运行时打桩状态动态切换的功能,满足了复杂时序及交互场景下的测试需求。
版权声明:本站专利文献数据主要来源于国家知识产权局等公开渠道,由 技术新讯 进行整理汇编。页面设计及数据汇编的著作权归本站所有。全部内容仅供个人学习、科研评估与技术交流参考,严禁用于任何商业用途(包括但不限于直接生产制造、技术转让、倒卖数据等)。
免责条款:专利技术具有时效性,本站不对资料的绝对准确性、完整性和可实施性提供任何明示或暗示的担保。因参考本站内容造成的直接或间接损失,本站不承担相关法律责任。若您认为本站内容有侵权问题,请及时提供权属证明与我们联系,本站将在核实后依法处理。反馈意见:yyfuon@163.com