一种基于任务栈分析的动态测试函数覆盖率获取方法与流程

文档序号:13735932阅读:145来源:国知局

本发明属于计算机软件测试领域,具体涉及一种基于任务栈分析的动态测试函数覆盖率获取方法。



背景技术:

在做动态测试时,测试的函数覆盖率常被用于衡量测试好坏的指标,较高的覆盖率说明测试充分,测试结果能够反应软件质量,较低的覆盖率说明测试用例设计不足或不合理,程序中的相当一部分函数单元没有测到,测试结果不能全面软件质量,需要修改测试用例设计。

当前动态测试的函数覆盖率获取方法主要是在源代码或目标文件中插装,在函数入口处插入一些操作,这些操作在函数调用时,会返回函数信息用于统计覆盖率,但这种方法不可避免的要对程序进行修改,意味着测试的程序与原来的程序存在差异,容易让人产生质疑这种情况下得到的测试结果是否还能反映程序本身的执行结果,也就是说破坏了测试结果的客观性。



技术实现要素:

为解决现有技术存在的问题,本发明提出了一种动态测试函数覆盖率的获取方法,该方法无需修改程序源代码或目标文件,保证在获取函数覆盖率的同时,测试结果的客观性。

本发明的基本原理是:通过监视操作系统为程序分配的任务栈,在函数调用或返回时获取信号并解析任务栈得到函数信息,统计调用的不同函数个数,根据程序目标文件代码段中的函数总数和动态测试过程中调用的不同函数个数计算得到函数覆盖率。

基于上述原理,本发明的技术方案为:

所述一种基于任务栈分析的动态测试函数覆盖率获取方法,其特征在于:监视函数调用或函数返回发生时产生的任务栈变化;当监视到任务栈变化时,解析任务栈,获取函数调用信息,统计调用的不同函数个数;根据程序目标文件代码段中的函数总数和动态测试过程中调用的不同函数个数计算得到函数覆盖率。

进一步的优选方案,所述一种基于任务栈分析的动态测试函数覆盖率获取方法,其特征在于:监视任务栈变化的过程为:在任务的栈顶地址-1和栈帧基地址+1处加入监视点;当触发监视点后,发出信号,获取任务栈变化,并在新的栈顶内存地址-1和栈帧基地址+1处加入监视点。

进一步的优选方案,所述一种基于任务栈分析的动态测试函数覆盖率获取方法,其特征在于:解析任务栈,获取函数调用信息,统计调用的不同函数个数的过程为:

通过寄存器获取当前函数的栈帧基指针,栈帧基指针地址的内存中存放上一个主调函数的栈帧基指针,栈帧基指针地址-1处是当前函数入口地址,同一个函数的入口地址相同;建立已调用函数表,根据栈基指针循环解析任务栈,每得到一个函数入口地址,查询已调用函数表,判断函数入口地址在表中是否存在,若不存在,则将该函数入口地址记入该表。

进一步的优选方案,所述一种基于任务栈分析的动态测试函数覆盖率获取方法,其特征在于:计算得到函数覆盖率的过程为:程序目标文件代码段中的函数总数是n,动态测试过程中调用的不同函数个数是n,动态测试的函数覆盖率η=n/n×100%。

所述一种基于任务栈分析的动态测试函数覆盖率获取方法,其特征在于:包括以下步骤:

步骤1:读取程序目标文件,获取其代码段中的函数总数,计为n;

步骤2:在外部监视程序中建立已调用函数表,存储已调用函数的入口地址;

步骤3:外部监视程序在任务栈栈顶地址-1和栈帧基地址+1处加入监视点;所述任务栈为操作系统给程序目标文件分配的任务栈;

步骤4:在程序目标文件执行过程中,当函数调用或返回时,触发监视点,发出信号给外部监视程序,得知任务栈变化;

步骤5:外部监视程序在新的栈顶内存地址-1和栈帧基地址+1处加入监视点;

步骤6:获取当前函数的栈帧基指针;

步骤7:读取步骤6中栈帧基指针指向的内存空间内存储的函数入口地址;

步骤8:在外部监视程序中查询已调用函数表,判断函数入口地址在已调用函数表中是否存在;若存在,则对已调用函数表不做任何操作,若不存在,将该函数入口地址记入已调用函数表;

步骤9:重复步骤4至步骤8,直至动态测试结束;而后在外部监视程序中读取已调用函数表中的记录条数n,计算动态测试的函数覆盖率η=n/n×100%。

有益效果

本发明无需修改程序源代码或目标文件,保证在获取函数覆盖率的同时,测试结果的客观性。

本发明的附加方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。

具体实施方式

下面详细描述本发明的实施例,所述实施例是示例性的,旨在用于解释本发明,而不能理解为对本发明的限制。

本发明的基本原理是通过监视操作系统为程序分配的任务栈,在函数调用或返回时获取信号并解析任务栈得到函数信息,统计调用的不同函数个数,根据程序目标文件代码段中的函数总数和动态测试过程中调用的不同函数个数计算得到函数覆盖率。

基于上述原理,本实施例中的基于任务栈分析的动态测试函数覆盖率获取方法,包括以下步骤:

步骤1:读取程序目标文件,获取其代码段中的函数总数,计为n。

步骤2:在外部监视程序中建立已调用函数表,存储已调用函数的入口地址。

步骤3:外部监视程序在任务栈栈顶地址-1和栈帧基地址+1处加入监视点;所述任务栈为操作系统给程序目标文件分配的任务栈。

步骤4:在程序目标文件执行过程中,当函数调用或返回时,触发监视点,发出信号给外部监视程序,得知任务栈变化;函数调用发生时,任务栈增长,触发栈顶地址-1处监视点;函数返回发生时,任务栈出栈,触发栈帧基地址+1处监视点。

步骤5:外部监视程序在新的栈顶内存地址-1和栈帧基地址+1处加入监视点。

步骤6:通过读操作系统所运行的硬件中寄存器ebp获取当前函数的栈帧基指针。

步骤7:读取步骤6中栈帧基指针指向的内存空间内存储的函数入口地址。

步骤8:在外部监视程序中查询已调用函数表,判断函数入口地址在已调用函数表中是否存在;若存在,则对已调用函数表不做任何操作,若不存在,将该函数入口地址记入已调用函数表。

步骤9:重复步骤4至步骤8,直至动态测试结束;而后在外部监视程序中读取已调用函数表中的记录条数n,该数目即动态测试过程中调用的不同函数个数,计算动态测试的函数覆盖率η=n/n×100%。

尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在不脱离本发明的原理和宗旨的情况下在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。



技术特征:

技术总结
本发明提出一种基于任务栈分析的动态测试函数覆盖率获取方法,通过监视操作系统为程序分配的任务栈,在函数调用或返回时获取信号并解析任务栈得到函数信息,统计调用的不同函数个数,根据程序目标文件代码段中的函数总数和动态测试过程中调用的不同函数个数计算得到函数覆盖率。该方法无需修改程序源代码或目标文件,保证在获取函数覆盖率的同时,测试结果的客观性。

技术研发人员:魏磊;谢前国;高向征;邢蔚明;刘祎理;丁争;白明洋
受保护的技术使用者:中国航空工业集团公司洛阳电光设备研究所
技术研发日:2017.09.12
技术公布日:2018.02.16
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1