CN105468505B - 覆盖率测试方法及覆盖率测试装置 - Google Patents
覆盖率测试方法及覆盖率测试装置 Download PDFInfo
- Publication number
- CN105468505B CN105468505B CN201410394793.XA CN201410394793A CN105468505B CN 105468505 B CN105468505 B CN 105468505B CN 201410394793 A CN201410394793 A CN 201410394793A CN 105468505 B CN105468505 B CN 105468505B
- Authority
- CN
- China
- Prior art keywords
- function
- code
- script
- coverage rate
- execution
- 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.)
- Active
Links
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明提供一种覆盖率测试方法及覆盖率测试装置,该覆盖率测试方法包括:检测执行函数的执行操作,并获取执行函数对应的脚本函数的函数位置、操作码以及操作码偏移;对脚本函数的函数位置、操作码以及操作码偏移进行记录,并生成执行函数表;以及在检测操作完毕后,将执行函数表与自定义函数表进行对比,获取软件代码的覆盖率。本发明还提供一种覆盖率测试装置,本发明的覆盖率测试方法及覆盖率测试装置通过设置自定义函数表与执行函数表进行对比,以生成代码覆盖率,并可通过自定义函数表有效的兼容各种软件代码,整个测试过程简单。
Description
技术领域
本发明涉及软件测试领域,特别是涉及一种软件代码的覆盖率测试方法及覆盖率测试装置。
背景技术
在C/C++软件开发的质量保证体系中,覆盖率(软件中代码的运行比率)测试通常是一种有效发现问题的手段,通过代码覆盖率的分析,可以快速定位到哪些代码是没有运行的,从而构造相应的测试案例来覆盖这些代码,以发现软件设计中的错误。
目前软件代码覆盖率测试广泛使用的是开源gcov工具,gcov工具是集成在gcc(GNU Compiler Collection,GUN编译器套件)中的一个检测代码覆盖率的工具,它通过编译阶段(即将源代码编译成可执行代码),在源代码中插入探针函数(插入探针函数也称为插桩,用来标识代码的运行次数),来记录代码是否运行,并根据记录的运行信息分析出软件代码行、函数、分支的覆盖情况。
但是使用gcov工具进行软件代码的覆盖率测试具有以下几个缺点:
一、gcov工具需要在检测代码时插入探针函数,因此该软件发布时,需要对软件代码进行重新编译,以将探针函数去除,因此该覆盖率测试的过程较为复杂。
二、由于虚拟机执行的软件代码需要了解虚拟机转换机制才能进行很好的编译,因此对于虚拟机执行的非编译类的软件代码无法进行探针函数的插入操作,进而无法进行软件代码的覆盖率测试。
故现有的覆盖率测试方法的测试过程较为复杂,且不能对所有的软件代码均进行有效的覆盖率测试。
发明内容
本发明实施例提供一种测试过程简单,且可对所有软件代码均可进行有效的覆盖率测试的覆盖率测试方法及覆盖率测试装置,以解决现有的覆盖率测试方法及覆盖率测试装置的测试过程复杂,且不能对所有的软件代码均进行有效的覆盖率测试的技术问题。
为解决上述问题,本发明提供的技术方案如下:
本发明实施例提供一种覆盖率测试方法,其包括:
检测执行函数的执行操作,并获取所述执行函数对应的脚本函数的函数位置、操作码以及相应的操作码偏移;
对所述执行函数对应的脚本函数的函数位置、所述操作码以及所述操作码偏移进行记录,并生成执行函数表;以及
在所述检测操作完毕后,将所述执行函数表与所述自定义函数表进行对比,获取软件代码的覆盖率;其中所述自定义函数表包括所述软件代码的所有脚本函数的函数位置、操作码、操作码偏移以及函数名。
本发明实施例还提供一种覆盖率测试装置,其包括:
执行函数获取模块,用于检测执行函数的执行操作,并获取所述执行函数对应的脚本函数的函数位置、操作码以及相应的操作码偏移;
参数记录模块,用于对所述执行函数对应的脚本函数的函数位置、所述操作码以及所述操作码偏移进行记录,并生成执行函数表;以及
覆盖率获取模块,用于在所述检测操作完毕后,将所述执行函数表与所述自定义函数表进行对比,获取软件代码的覆盖率;其中所述自定义函数表包括所述软件代码的所有脚本函数的函数位置、操作码、操作码偏移以及函数名。
相较于现有技术的覆盖率测试方法及覆盖率测试装置,本发明的覆盖率测试方法及覆盖率测试装置通过设置自定义函数表与执行函数表进行对比,以生成代码覆盖率,并可通过自定义函数表有效的兼容各种软件代码,整个测试过程简单;解决了现有的覆盖率测试方法及覆盖率测试装置的测试过程复杂,且不能对所有的软件代码均进行有效的覆盖率测试的技术问题。
附图说明
图1为本发明的覆盖率测试方法的第一优选实施例的流程图;
图2为本发明的覆盖率测试方法的第二优选实施例的流程图;
图3为本发明的覆盖率测试装置的第一优选实施例的结构示意图;
图4为本发明的覆盖率测试装置的第二优选实施例的结构示意图;
图5为本发明的覆盖率测试方法的具体实施例的流程图。
具体实施方式
请参照图式,其中相同的组件符号代表相同的组件,本发明的原理是以实施在一适当的运算环境中来举例说明。以下的说明是基于所例示的本发明具体实施例,其不应被视为限制本发明未在此详述的其它具体实施例。
在以下的说明中,本发明的具体实施例将参考由一部或多部计算机所执行之作业的步骤及符号来说明,除非另有述明。因此,其将可了解到这些步骤及操作,其中有数次提到为由计算机执行,包括了由代表了以一结构化型式中的数据之电子信号的计算机处理单元所操纵。此操纵转换该数据或将其维持在该计算机之内存系统中的位置处,其可重新配置或另外以本领域技术人员所熟知的方式来改变该计算机之运作。该数据所维持的数据结构为该内存之实体位置,其具有由该数据格式所定义的特定特性。但是,本发明原理以上述文字来说明,其并不代表为一种限制,本领域技术人员将可了解到以下所述的多种步骤及操作亦可实施在硬件当中。
如本申请所使用的术语“组件”、“模块”、“系统”、“接口”、“进程”等等一般地旨在指计算机相关实体:硬件、硬件和软件的组合、软件或执行中的软件。例如,组件可以是但不限于是运行在处理器上的进程、处理器、对象、可执行应用、执行的线程、程序和/或计算机。通过图示,运行在控制器上的应用和该控制器二者都可以是组件。一个或多个组件可以有在于执行的进程和/或线程内,并且组件可以位于一个计算机上和/或分布在两个或更多计算机之间。
而且,要求保护的主题可以被实现为使用标准编程和/或工程技术产生软件、固件、硬件或其任意组合以控制计算机实现所公开的主题的方法、装置或制造品。本文所使用的术语“制造品”旨在包含可从任意计算机可读设备、载体或介质访问的计算机程序。当然,本领域技术人员将认识到可以对该配置进行许多修改,而不脱离要求保护的主题的范围或精神。
尽管没有要求,但是在“计算机可读指令”被一个或多个电子设备执行的通用背景下描述实施例。计算机可读指令可以经由计算机可读介质来分布(下文讨论)。计算机可读指令可以实现为程序模块,比如执行特定任务或实现特定抽象数据类型的功能、对象、应用编程接口(API)、数据结构等等。典型地,该计算机可读指令的功能可以在各种环境中随意组合或分布。
本文提供了实施例的各种操作。在一个实施例中,所述的一个或多个操作可以构成一个或多个计算机可读介质上存储的计算机可读指令,其在被电子设备执行时将使得计算设备执行所述操作。描述一些或所有操作的顺序不应当被解释为暗示这些操作必需是顺序相关的。本领域技术人员将理解具有本说明书的益处的可替代的排序。而且,应当理解,不是所有操作必需在本文所提供的每个实施例中存在。
而且,本文所使用的词语“优选的”意指用作实例、示例或例证。奉文描述为“优选的”任意方面或设计不必被解释为比其他方面或设计更有利。相反,词语“优选的”的使用旨在以具体方式提出概念。如本申请中所使用的术语“或”旨在意指包含的“或”而非排除的“或”。即,除非另外指定或从上下文中清楚,“X使用A或B”意指自然包括排列的任意一个。即,如果X使用A;X使用B;或X使用A和B二者,则“X使用A或B”在前述任一示例中得到满足。
而且,尽管已经相对于一个或多个实现方式示出并描述了本公开,但是本领域技术人员基于对本说明书和附图的阅读和理解将会想到等价变型和修改。本公开包括所有这样的修改和变型,并且仅由所附权利要求的范围限制。特别地关于由上述组件(例如元件、资源等)执行的各种功能,用于描述这样的组件的术语旨在对应于执行所述组件的指定功能(例如其在功能上是等价的)的任意组件(除非另外指示),即使在结构上与执行本文所示的本公开的示范性实现方式中的功能的公开结构不等同。此外,尽管本公开的特定特征已经相对于若干实现方式中的仅一个被公开,但是这种特征可以与如可以对给定或特定应用而言是期望和有利的其他实现方式的一个或多个其他特征组合。而且,就术语“包括”、“具有”、“含有”或其变形被用在具体实施方式或权利要求中而言,这样的术语旨在以与术语“包含”相似的方式包括。
本发明实施例的覆盖率测试方法可应用在游戏服务器中,对游戏服务器中的游戏虚拟引擎脚本进行覆盖率测试。游戏虚拟引擎脚本是指游戏开发人员按照虚拟引擎开发商提供的Unreal Script语法编写的游戏脚本,该游戏脚本能够实现游戏对局的逻辑功能,如游戏中玩家的移动、开火、房间模式以及技能等。当然该覆盖率测试方法以及覆盖率测试装置可应用在各种电子设备或各种功能的服务器中。
请参照图1,图1为本发明的覆盖率测试方法的第一优选实施例的流程图。本优选实施例的覆盖率测试方法包括:
步骤S101,检测执行函数的执行操作,并获取执行函数对应的脚本函数的函数位置、操作码以及操作码偏移;
步骤S102,对执行函数对应的脚本函数的函数位置、操作码以及操作码偏移进行记录,并生成执行函数表;
步骤S103,在检测操作完毕后,将执行函数表与自定义函数表进行对比,获取软件代码的覆盖率。
下面详细说明本优选实施例的覆盖率测试方法的各步骤的具体流程。
在步骤S101中,检测执行函数的执行操作,这里的执行函数是指服务器(如游戏服务器)提供的运行实际代码的各种函数(如执行游戏中的人物的跳的动作或任务的跑的动作)。该执行函数通过运行预设的脚本函数来实现服务器中的各种代码操作。这里的脚本函数是指代码开发人员为了完成服务器中的各种代码操作而设置的函数,该脚本函数支持代码开发人员设计的所有的代码操作,因此脚本函数应覆盖所有的执行函数,而执行函数一般不能完全覆盖脚本函数。
随后获取执行函数对应的脚本函数的函数位置、操作码以及操作码偏移。函数位置是指脚本函数的字节码的存储位置,操作码是指脚本函数的字节码的具体操作代码,即一个字节码可包括多个操作码,操作码偏移是指某个操作码在字节码中的位置。随后转到步骤S102。
在步骤S102中,对执行函数对应的脚本函数的函数位置、操作码以及操作码偏移进行记录,并生成执行函数表;即使用执行函数表记录执行函数的函数位置、操作码以及操作码偏移。通过不断检测执行函数的执行操作,可使用执行函数表记录下所有执行函数的函数位置、操作码以及操作码偏移。随后转到步骤S103。
在步骤S103中,通过反复执行步骤S101和步骤S102,完成了执行函数的执行操作的检测,同时也生成了包含所有执行函数的函数位置、操作码以及操作码偏移的执行函数表。将执行函数表和自定义函数表进行对比,获取软件代码的覆盖率,其中自定义函数表包括软件代码的所有脚本函数的函数位置、操作码、操作码偏移以及函数名。由于自定义函数表可覆盖所有的脚本函数,因此通过执行函数表与自定义函数表的对比,可获取该软件代码的覆盖率。
这样即完成了本优选实施例的覆盖率测试方法的覆盖率测试过程。
本优选实施例的覆盖率测试方法通过设置自定义函数表与执行函数表进行对比,以生成代码覆盖率,并可通过自定义函数表有效的兼容各种软件代码,整个测试过程简单。
请参照图2,图2为本发明的覆盖率测试方法的第二优选实施例的流程图。本优选实施例的覆盖率测试方法包括:
步骤S201,在软件运行过程中,获取软件代码的所有脚本函数的函数位置以及函数名;
步骤S202,根据脚本函数的函数位置,获取脚本函数的字节码;
步骤S203,对脚本函数的字节码进行解析操作,获取脚本函数的操作码以及操作码偏移;
步骤S204,将软件代码中的脚本函数的操作码、操作码偏移、函数名以及函数位置保存为自定义函数表;
步骤S205,检测执行函数的执行操作,并获取执行函数对应的脚本函数的函数位置、操作码以及操作码偏移;
步骤S206,对执行函数对应的脚本函数的函数位置、操作码以及操作码偏移进行记录,并生成执行函数表;
步骤S207,在检测操作完毕后,将执行函数表与自定义函数表进行对比,获取软件代码的覆盖率;
步骤S208,以源码为单元,对脚本函数对应的软件代码的覆盖率进行统计;
下面详细说明本优选实施例的覆盖率测试方法的各步骤的具体流程。
在步骤S201中,在软件运行过程中,获取软件代码的所有脚本函数的函数位置以及函数名;具体可包括:
一、软件运行时,获取与软件代码对应的全局对象表和全局名字表,其中全局对象表包括软件代码中的对象的对象位置。全局对象表管理软件代码中的所有对象,无论是类、函数还是actor都是通过对象来进行管理的。全局名字表包括软件代码中的所有对象的对象名以及实例类别,全局名字表中的对象与全局对象表中的对象一一对应。
二、根据全局名字表中所有对象的实例类别,获取全局名字表中所有脚本函数的函数名,以及全局对象表中所有脚本函数的函数位置;如将实例类名为“UFunction”的对象判断为函数对象。随后转到步骤S202。
在步骤S202中,根据脚本函数的函数位置,获取脚本函数的字节码,这里的字节码为该脚本函数的具体代码,可包括多个操作码。随后转到步骤S203。
在步骤S203中,对脚本函数的字节码进行偏移解析,将字节码切割为对应的操作码以及操作码偏移,并根据操作码以及相应的操作码偏移生成用于表示执行操作的源码。随后转到步骤S204。
在步骤S204中,将软件代码中的脚本函数的操作码、操作码偏移、函数名、函数位置以及源码保存为自定义函数表,优选的,为了防止脚本函数重名,还可将脚本函数的类名加入到自定义函数表中。生成的自定义函数表如表1所示。
表1
随后转到步骤S207。
在步骤S205中,检测执行函数的执行操作,具体可包括:
一、在函数解析表(Gnative函数)的所有执行函数中设置相应的跳转函数(HOOK函数),即通过修改函数解析表的所有执行函数的前5个字节,实现跳转函数的跳转操作。其中函数解析表用于查找执行函数对应的脚本函数的函数位置、操作码以及相应的操作码偏移。
二、通过跳转函数的跳转操作,检测执行函数的执行操作。随后转到步骤S206。
在步骤S206中,通过跳转函数对执行函数对应的脚本函数的函数位置、操作码以及操作码偏移进行记录,并生成执行函数表;即使用执行函数表记录执行函数的函数位置、操作码以及操作码偏移。通过不断检测执行函数的执行操作,可使用执行函数表记录下所有执行函数的函数位置、操作码以及操作码偏移。同时参数记录模块的跳转单元跳转回所述函数解析表,以对所述执行函数进行执行操作。随后转到步骤S207。
在步骤S207中,通过反复执行步骤S205和步骤S206,完成了执行函数的执行操作的检测,同时也生成了包含所有执行函数的函数位置、操作码以及操作码偏移的执行函数表。将执行函数表和自定义函数表进行对比,获取软件代码的覆盖率。具体可包括:
判断执行函数表是否记录有脚本函数的所有操作码及相应的操作码偏移;
如执行函数表记录有脚本函数的所有操作码及相应的操作码偏移,则判断脚本函数对应的软件代码已被覆盖,如执行函数表并未记录有脚本函数的所有操作码及相应的操作码偏移,则判断脚本函数对应的软件代码未被覆盖。如表2所示的脚本函数对应的软件代码已被覆盖,表3所示的脚本函数对应的软件代码未被覆盖。由于自定义函数表可覆盖所有的脚本函数,因此通过执行函数表与自定义函数表的对比,可获取该软件代码的覆盖率。随后转到步骤S208。
表2
表3
在步骤S208中,以源码为单元,对脚本函数对应的软件代码的覆盖率进行统计,由于源码(或反编译源码)便于代码开发人员理解,代码开发人员可根据该统计结果快速的对相应的源码进行修正,进一步提高了测试效率。
这样即完成了本优选实施例的覆盖率测试方法的覆盖率测试过程。
本优选实施例的覆盖率测试方法在第一优选实施例的基础上,通过跳转函数以及源码的设置进一步提高了覆盖率测试的效率。
本发明还提供一种覆盖率测试装置,请参照图3,图3为本发明的覆盖率测试装置的第一优选实施例的结构示意图。本优选实施例的覆盖率测试装置30包括执行函数获取模块31、参数记录模块32以及覆盖率获取模块33。执行函数获取模块31用于检测执行函数的执行操作,并获取执行函数对应的脚本函数的函数位置、操作码以及操作码偏移;参数记录模块32用于执行函数对应的脚本函数的函数位置、操作码以及操作码偏移进行记录,并生成执行函数表;覆盖率获取模块33用于在检测操作完毕后,将执行函数表与自定义函数表进行对比,获取软件代码的覆盖率,其中自定义函数表包括软件代码的所有脚本函数的函数位置、操作码、操作码偏移以及函数名。
本优选实施例的覆盖率测试装置30使用时,首先执行函数获取模块31检测执行函数的执行操作,这里的执行函数是指服务器(如游戏服务器)提供的运行实际代码的各种函数(如执行游戏中的人物的跳的动作或任务的跑的动作)。该执行函数通过运行预设的脚本函数来实现服务器中的各种代码操作。这里的脚本函数是指代码开发人员为了完成服务器中的各种代码操作而设置的函数,该脚本函数支持代码开发人员设计的所有的代码操作,因此脚本函数应覆盖所有的执行函数,而执行函数一般不能完全覆盖脚本函数。
随后执行函数获取模块31获取执行函数对应的脚本函数的函数位置、操作码以及操作码偏移。函数位置是指脚本函数的字节码的存储位置,操作码是指脚本函数的字节码的具体操作代码,即一个字节码可包括多个操作码,操作码偏移是指某个操作码在字节码中的位置。
然后参数记录模块32对执行函数对应的脚本函数的函数位置、操作码以及操作码偏移进行记录,并生成执行函数表;即使用执行函数表记录执行函数的函数位置、操作码以及操作码偏移。通过不断检测执行函数的执行操作,可使用执行函数表记录下所有执行函数的函数位置、操作码以及操作码偏移。
最后执行函数获取模块31完成了执行函数的执行操作的检测,同时参数记录模块32也生成了包含所有执行函数的函数位置、操作码以及操作码偏移的执行函数表。覆盖率获取模块33将执行函数表和自定义函数表进行对比,获取软件代码的覆盖率,其中自定义函数表包括软件代码的所有脚本函数的函数位置、操作码、操作码偏移以及函数名。由于自定义函数表可覆盖所有的脚本函数,因此通过执行函数表与自定义函数表的对比,可获取该软件代码的覆盖率。
这样即完成了本优选实施例的覆盖率测试装置30的覆盖率测试过程。
本优选实施例的覆盖率测试装置通过设置自定义函数表与执行函数表进行对比,以生成代码覆盖率,并可通过自定义函数表有效的兼容各种软件代码,整个测试过程简单。
请参照图4,图4为本发明的覆盖率测试装置的第二优选实施例的结构示意图。本优选实施例的覆盖率测试装置40包括执行函数获取模块41、参数记录模块42、覆盖率获取模块43、脚本函数获取模块44、字节码获取模块45、字节码解析模块46、自定义函数表生成模块47以及统计模块48。
执行函数获取模块41用于检测执行函数的执行操作,并获取执行函数对应的脚本函数的函数位置、操作码以及操作码偏移;参数记录模块42用于对执行函数对应的脚本函数的函数位置、操作码以及操作码偏移进行记录,并生成执行函数表;覆盖率获取模块43用于在检测操作完毕后,将执行函数表与自定义函数表进行对比,获取软件代码的覆盖率;其中自定义函数表包括软件代码的所有脚本函数的函数位置、操作码、操作码偏移以及函数名。
脚本函数获取模块44用于在软件运行过程中,获取软件代码的所有脚本函数的函数位置以及函数名;字节码获取模块45用于根据脚本函数的函数位置,获取脚本函数的字节码;字节码解析模块46用于对脚本函数的字节码进行解析操作,获取脚本函数的操作码以及操作码偏移;自定义函数表生成模块47用于将软件代码中的脚本函数的操作码、操作码偏移、函数名以及函数位置保存为自定义函数表。统计模块48用于以源码为单元,对脚本函数对应的软件代码的覆盖率进行统计。
其中脚本函数获取模块44包括参数表获取单元441以及脚本函数获取单元442。参数表获取单元441用于获取与软件代码对应的全局对象表和全局名字表,其中全局对象表包括软件代码中的所有对象的对象位置;全局名字表包括软件代码中的所有对象的对象名以及实例类别。脚本函数获取单元442用于根据全局名字表中所有对象的实例类别,获取全局名字表中所有脚本函数的函数名,以及全局对象表中所有脚本函数的函数位置。
其中执行函数获取模块41包括跳转函数设置单元411以及执行操作检测单元412;跳转函数设置单元411用于在函数解析表的所有执行函数中设置相应的跳转函数,其中函数解析表用于查找执行函数对应的脚本函数的函数位置、操作码以及相应的操作码偏移;执行操作检测单元412用于通过跳转函数的跳转操作,检测执行函数的执行操作。
其中参数记录模块42包括参数记录单元421以及跳转单元422;参数记录单元421用于通过跳转函数对脚本函数的函数位置、操作码以及相应的操作码偏移进行记录;跳转单元422用于跳转回函数解析表,以对执行函数进行执行操作。
其中覆盖率获取模块43包括判断单元431以及覆盖率获取单元432;判断单元431用于判断执行函数表是否记录有脚本函数的所有操作码及相应的操作码偏移;覆盖率获取单元432用于如执行函数表记录有脚本函数的所有操作码及相应的操作码偏移,则判断脚本函数对应的软件代码已被覆盖;否则判断脚本函数对应的软件代码未被覆盖。
本优选实施例的覆盖率测试装置40使用时,首先在软件运行过程中,脚本函数获取模块44获取软件代码的所有脚本函数的函数位置以及函数名;具体可包括:
一、软件运行时,脚本函数获取模块44的参数表获取单元441获取与软件代码对应的全局对象表和全局名字表,其中全局对象表包括软件代码中的对象的对象位置。全局对象表管理软件代码中的所有对象,无论是类、函数还是actor都是通过对象来进行管理的。全局名字表包括软件代码中的所有对象的对象名以及实例类别,全局名字表中的对象与全局对象表中的对象一一对应。
二、脚本函数获取模块44的脚本函数获取单元442根据全局名字表中所有对象的实例类别,获取全局名字表中所有脚本函数的函数名,以及全局对象表中所有脚本函数的函数位置;如将实例类名为“UFunction”的对象判断为函数对象。
随后字节码获取模块45根据脚本函数的函数位置,获取脚本函数的字节码,这里的字节码为该脚本函数的具体代码,可包括多个操作码。字节码解析模块46对脚本函数的字节码进行偏移解析,将字节码切割为对应的操作码以及操作码偏移,并根据操作码以及相应的操作码偏移生成表示执行操作的源码。自定义函数表生成模块47将软件代码中的脚本函数的操作码、操作码偏移、函数名、函数位置以及源码保存为自定义函数表,优选的,为了防止脚本函数重名,还可将脚本函数的类名加入到自定义函数表中。生成的自定义函数表如表1所示。
然后执行函数获取模块41检测执行函数的执行操作,具体可包括:
一、执行函数获取模块41的跳转函数设置单元411在函数解析表(Gnative函数)的所有执行函数中设置相应的跳转函数(HOOK函数),即通过修改函数解析表的所有执行函数的前5个字节,实现跳转函数的跳转操作。其中函数解析表用于查找执行函数对应的脚本函数的函数位置、操作码以及相应的操作码偏移。
二、执行函数获取模块41的执行操作检测单元412通过跳转函数的跳转操作,检测执行函数的执行操作。
随后参数记录模块42的参数记录单元421通过跳转函数对执行函数对应的脚本函数的函数位置、操作码以及操作码偏移进行记录,并生成执行函数表;即使用执行函数表记录执行函数的函数位置、操作码以及操作码偏移。通过不断检测执行函数的执行操作,可使用执行函数表记录下所有执行函数的函数位置、操作码以及操作码偏移。同时参数记录模块42的跳转单元422跳转回所述函数解析表,以对所述执行函数进行执行操作。
最后执行函数获取模块41完成了执行函数的执行操作的检测,同时参数记录模块42也生成了包含所有执行函数的函数位置、操作码以及操作码偏移的执行函数表。将执行函数表和自定义函数表进行对比,获取软件代码的覆盖率。具体可包括:
覆盖率获取模块43的判断单元431判断执行函数表是否记录有脚本函数的所有操作码及相应的操作码偏移;
如执行函数表记录有脚本函数的所有操作码及相应的操作码偏移,则覆盖率获取模块43的覆盖率获取单元432判断脚本函数对应的软件代码已被覆盖,如执行函数表并未记录有脚本函数的所有操作码及相应的操作码偏移,则覆盖率获取模块43的覆盖率获取单元432判断脚本函数对应的软件代码未被覆盖。如表2所示的脚本函数对应的软件代码已被覆盖,表3所示的脚本函数对应的软件代码未被覆盖。由于自定义函数表可覆盖所有的脚本函数,因此通过执行函数表与自定义函数表的对比,可获取该软件代码的覆盖率。
优选的,统计模块48以源码为单元,对脚本函数对应的软件代码的覆盖率进行统计,由于源码(或反编译源码)便于代码开发人员理解,代码开发人员可根据该统计结果快速的对相应的源码进行修正,进一步提高了测试效率。
这样即完成了本优选实施例的覆盖率测试装置40的覆盖率测试过程。
本优选实施例的覆盖率测试装置在第一优选实施例的基础上,通过跳转函数以及源码的设置进一步提高了覆盖率测试的效率。
下面通过一具体实施例说明本发明的覆盖率测试方法及覆盖率测试装置的具体工作流程。请参照图5,图5为本发明的覆盖率测试方法的具体实施例的流程图。该具体实施例包括:
步骤S501,测试人员启动游戏客户端;
步骤S502,将写好的DLL(Dynamic Link Library,动态链接库)或SO(ServiceObject,服务对象)注入到游戏客户端的游戏进程中;
步骤S503,通过注入的DLL或SO遍历游戏进程,获取内存的虚幻引擎的全局对象表和全局名字表;
步骤S504,通过全局对象表和全局名字表,获取脚本函数的函数名和函数位置;
步骤S505,获取脚本函数的字节码的地址,并获取该字节码对应的操作码以及操作码偏移,并将操作码反编译为源码,生成记录脚本函数的操作码、操作码偏移、函数名、函数位置以及源码的自定义函数表;
步骤S506,遍历GNative表(函数解析表),通过修改函数解析表中每个执行函数的头5位,以设置跳转函数;
步骤S507,测试人员运行软件代码,进行覆盖率测试;
步骤S508,通过调用跳转函数检测语句的执行操作;
步骤S509,所有语句的执行操作完毕后,生成执行函数表;
步骤S510,将执行函数表和自定义函数表进行对比,如自定义函数表中的脚本函数中的操作码及操作码偏移均被语句执行到,则该脚本函数认为被覆盖,否则认为该脚本函数未被覆盖,然后将对比结果进行展示。
步骤S511,根据对比结果,对软件代码进行补充测试,对未覆盖的脚本函数对应的执行函数再次进行测试。
步骤S512,将测试记录上传至后台服务器,后台服务器可通过前端客户端进行覆盖率的展示和分析,这样即完成软件代码的语句覆盖率测试。
本发明的覆盖率测试方法及覆盖率测试装置通过设置自定义函数表与执行函数表进行对比,以生成代码覆盖率,并可通过自定义函数表有效的兼容各种软件代码,整个测试过程简单;解决了现有的覆盖率测试方法及覆盖率测试装置的测试过程复杂,且不能对所有的软件代码均进行有效的覆盖率测试的技术问题。
本发明实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。上述提到的存储介质可以是只读存储器,磁盘或光盘等。上述的各装置或系统,可以执行相应方法实施例中的方法。
综上所述,虽然本发明已以优选实施例揭露如上,但上述优选实施例并非用以限制本发明,本领域的普通技术人员,在不脱离本发明的精神和范围内,均可作各种更动与润饰,因此本发明的保护范围以权利要求界定的范围为准。
Claims (12)
1.一种覆盖率测试方法,其特征在于,包括:
检测软件代码的执行函数的执行操作,并获取所述执行函数对应的脚本函数的函数位置、操作码以及操作码偏移;其中所述执行函数是指服务器提供的运行实际代码的各种函数;
对所述执行函数对应的脚本函数的函数位置、所述操作码以及所述操作码偏移进行记录,并生成执行函数表;其中所述脚本函数是指代码开发人员为了完成服务器中的各种代码操作而设置的函数;以及
在所述检测操作完毕后,将所述执行函数表与自定义函数表进行对比,获取所述软件代码的覆盖率;其中所述自定义函数表包括所述软件代码的所有脚本函数的函数位置、操作码、操作码偏移以及函数名;
所述检测软件代码的执行函数的执行操作的步骤包括:
在函数解析表的所有执行函数中设置相应的跳转函数,其中所述函数解析表用于查找所述执行函数对应的脚本函数的函数位置、操作码以及相应的操作码偏移;以及
通过所述跳转函数的跳转操作,检测所述执行函数的执行操作。
2.根据权利要求1所述的覆盖率测试方法,其特征在于,所述自定义函数表通过以下步骤生成:
在软件运行过程中,获取所述软件代码的所有所述脚本函数的函数位置以及函数名;
根据所述脚本函数的函数位置,获取所述脚本函数的字节码;
对所述脚本函数的字节码进行解析操作,获取所述脚本函数的操作码以及操作码偏移;以及
将所述软件代码中的所述脚本函数的操作码、操作码偏移、函数名以及函数位置保存为所述自定义函数表。
3.根据权利要求2所述的覆盖率测试方法,其特征在于,所述获取所述软件代码的所有所述脚本函数的函数位置以及函数名的步骤包括:
获取与所述软件代码对应的全局对象表和全局名字表,其中所述全局对象表包括所述软件代码中的所有对象的对象位置;所述全局名字表包括所述软件代码中的所有对象的对象名以及实例类别;以及
根据所述全局名字表中所有对象的实例类别,获取所述全局名字表中所有脚本函数的函数名,以及所述全局对象表中所有脚本函数的函数位置。
4.根据权利要求1所述的覆盖率测试方法,其特征在于,
所述对所述执行函数对应的脚本函数的函数位置、所述操作码以及所述操作码偏移进行记录的步骤包括:
通过跳转函数对所述执行函数对应的脚本函数的函数位置、所述操作码以及所述操作码偏移进行记录,并生成执行函数表;以及
跳转回所述函数解析表,以对所述执行函数进行执行操作。
5.根据权利要求1所述的覆盖率测试方法,其特征在于,所述将所述执行函数表与所述自定义函数表进行对比,获取所述软件代码的覆盖率的步骤包括:
判断所述执行函数表是否记录有所述脚本函数的所有操作码及相应的操作码偏移;以及
如所述执行函数表记录有所述脚本函数的所有操作码及相应的操作码偏移,则判断所述脚本函数对应的软件代码已被覆盖;否则判断所述脚本函数对应的软件代码未被覆盖。
6.根据权利要求5所述的覆盖率测试方法,其特征在于,所述自定义函数表还包括用于表示所述执行操作的源码,所述源码由所述操作码和相应的操作码偏移生成;
所述获取软件代码的覆盖率的步骤之后还包括:
以所述源码为单元,对所述脚本函数对应的软件代码的覆盖率进行统计。
7.一种覆盖率测试装置,其特征在于,包括:
执行函数获取模块,用于检测软件代码的执行函数的执行操作,并获取所述执行函数对应的脚本函数的函数位置、操作码以及操作码偏移;其中所述执行函数是指服务器提供的运行实际代码的各种函数;
参数记录模块,用于对所述执行函数对应的脚本函数的函数位置、所述操作码以及所述操作码偏移进行记录,并生成执行函数表;其中所述脚本函数是指代码开发人员为了完成服务器中的各种代码操作而设置的函数;以及
覆盖率获取模块,用于在所述检测操作完毕后,将所述执行函数表与自定义函数表进行对比,获取所述软件代码的覆盖率;其中所述自定义函数表包括所述软件代码的所有脚本函数的函数位置、操作码、操作码偏移以及函数名;
所述执行函数获取模块包括:
跳转函数设置单元,用于在函数解析表的所有执行函数中设置相应的跳转函数,其中所述函数解析表用于查找所述执行函数对应的脚本函数的函数位置、操作码以及相应的操作码偏移;以及
执行操作检测单元,用于通过所述跳转函数的跳转操作,检测所述执行函数的执行操作。
8.根据权利要求7所述的覆盖率测试装置,其特征在于,所述覆盖率测试装置还包括:
脚本函数获取模块,用于在软件运行过程中,获取所述软件代码的所有所述脚本函数的函数位置以及函数名;
字节码获取模块,用于根据所述脚本函数的函数位置,获取所述脚本函数的字节码;
字节码解析模块,用于对所述脚本函数的字节码进行解析操作,获取所述脚本函数的操作码以及操作码偏移;以及
自定义函数表生成模块,用于将所述软件代码中的所述脚本函数的操作码、操作码偏移、函数名以及函数位置保存为所述自定义函数表。
9.根据权利要求8所述的覆盖率测试装置,其特征在于,所述脚本函数获取模块包括:
参数表获取单元,用于获取与所述软件代码对应的全局对象表和全局名字表,其中所述全局对象表包括所述软件代码中的所有对象的对象位置;所述全局名字表包括所述软件代码中的所有对象的对象名以及实例类别;以及
脚本函数获取单元,用于根据所述全局名字表中所有对象的实例类别,获取所述全局名字表中所有脚本函数的函数名,以及所述全局对象表中所有脚本函数的函数位置。
10.根据权利要求7所述的覆盖率测试装置,其特征在于,所述参数记录模块包括:
参数记录单元,用于通过跳转函数对所述执行函数对应的脚本函数的函数位置、所述操作码以及所述操作码偏移进行记录,并生成执行函数表;以及
跳转单元,用于跳转回所述函数解析表,以对所述执行函数进行执行操作。
11.根据权利要求7所述的覆盖率测试装置,其特征在于,所述覆盖率获取模块包括:
判断单元,用于判断所述执行函数表是否记录有所述脚本函数的所有操作码及相应的操作码偏移;以及
覆盖率获取单元,用于如所述执行函数表记录有所述脚本函数的所有操作码及相应的操作码偏移,则判断所述脚本函数对应的软件代码已被覆盖;否则判断所述脚本函数对应的软件代码未被覆盖。
12.根据权利要求11所述的覆盖率测试装置,其特征在于,所述自定义函数表还包括用于表示所述执行操作的源码,所述源码由所述操作码和相应的操作码偏移生成;
所述覆盖率测试装置还包括:
统计模块,用于以所述源码为单元,对所述脚本函数对应的软件代码的覆盖率进行统计。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410394793.XA CN105468505B (zh) | 2014-08-12 | 2014-08-12 | 覆盖率测试方法及覆盖率测试装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410394793.XA CN105468505B (zh) | 2014-08-12 | 2014-08-12 | 覆盖率测试方法及覆盖率测试装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105468505A CN105468505A (zh) | 2016-04-06 |
CN105468505B true CN105468505B (zh) | 2018-12-28 |
Family
ID=55606236
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410394793.XA Active CN105468505B (zh) | 2014-08-12 | 2014-08-12 | 覆盖率测试方法及覆盖率测试装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105468505B (zh) |
Families Citing this family (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105912447B (zh) * | 2016-05-19 | 2018-05-25 | 南京科远自动化集团股份有限公司 | 一种嵌入式程序执行顺序的监控方法 |
CN107329888B (zh) * | 2017-05-31 | 2019-10-18 | 深圳前海微众银行股份有限公司 | 智能合约操作码覆盖率计算方法和系统 |
CN108108304A (zh) * | 2017-12-29 | 2018-06-01 | 北京奇艺世纪科技有限公司 | 一种测试覆盖率的检测方法及装置 |
CN108595327B (zh) * | 2018-04-16 | 2023-06-06 | 深圳市腾讯网络信息技术有限公司 | 应用执行脚本的方法、应用测试方法、装置和计算机设备 |
CN108829396B (zh) * | 2018-06-15 | 2022-02-01 | 腾讯科技(深圳)有限公司 | 脚本编译的方法、脚本执行的方法、相关装置及系统 |
CN109298865A (zh) * | 2018-09-13 | 2019-02-01 | 天津龙拳风暴科技有限公司 | 实现游戏技能可编程化的方法及装置 |
CN109684221A (zh) * | 2018-12-27 | 2019-04-26 | 江苏满运软件科技有限公司 | 测试代码覆盖率采集方法、系统、设备以及介质 |
CN109992511B (zh) * | 2019-03-25 | 2022-11-22 | 口碑(上海)信息技术有限公司 | 获取代码测试覆盖率的装置及方法 |
CN110399289B (zh) * | 2019-06-14 | 2023-10-20 | 平安科技(深圳)有限公司 | 应用程序测试的评价方法、装置、服务器及存储介质 |
CN110947182B (zh) * | 2019-11-26 | 2024-02-02 | 上海米哈游网络科技股份有限公司 | 事件应对方法、装置、游戏终端及介质 |
CN113094252B (zh) * | 2019-12-23 | 2023-09-29 | 腾讯科技(深圳)有限公司 | 测试用例生成方法、装置、计算机设备及存储介质 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP4458929B2 (ja) * | 2003-07-16 | 2010-04-28 | キヤノン株式会社 | プログラム間通信装置、プログラム間通信方法、コンピュータ読み取り可能な記録媒体およびプログラム |
CN102419731A (zh) * | 2011-12-08 | 2012-04-18 | 北京控制工程研究所 | C语言嵌入式软件插桩及动态测试覆盖率信息提取方法 |
CN103699476B (zh) * | 2012-09-27 | 2018-07-27 | 腾讯科技(深圳)有限公司 | 覆盖率测试方法及系统 |
-
2014
- 2014-08-12 CN CN201410394793.XA patent/CN105468505B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN105468505A (zh) | 2016-04-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105468505B (zh) | 覆盖率测试方法及覆盖率测试装置 | |
Amalfitano et al. | A general framework for comparing automatic testing techniques of Android mobile apps | |
CN106557413A (zh) | 基于代码覆盖率获取测试用例的方法和设备 | |
US9600403B1 (en) | Method and system for creating functional model of test cases | |
US9317400B2 (en) | Code coverage rate determination method and system | |
CN104956362B (zh) | 分析web应用程序的结构 | |
US20130291113A1 (en) | Process flow optimized directed graph traversal | |
CN106326107B (zh) | 基于仿真环境的非侵入式嵌入式软件异常处理验证方法 | |
Griebe et al. | A model-based approach to test automation for context-aware mobile applications | |
US20160378639A1 (en) | Debugging using program state definitions | |
CN104918119B (zh) | 基于iOS浏览器的视频处理方法及视频处理装置 | |
JP6904043B2 (ja) | 未知のプログラムバイナリのための入力発見 | |
CN103678115B (zh) | 在混合模式程序中检测源代码差错的位置的设备和方法 | |
Hesenius et al. | Automating UI tests for mobile applications with formal gesture descriptions | |
TWI617983B (zh) | 代碼覆蓋率處理方法 | |
Wen et al. | Pats: A parallel gui testing framework for android applications | |
US8141082B2 (en) | Node-based representation of multi-threaded computing environment tasks, and node-based data race evaluation | |
CN104090798A (zh) | 动静态结合的中断驱动程序数据竞争检测方法 | |
CN107622017B (zh) | 一种通用自动化软件测试的解析方法 | |
US20150220733A1 (en) | Apparatus and method for detecting a malicious code based on collecting event information | |
DeOrio et al. | Bridging pre-and post-silicon debugging with BiPeD | |
Griebe et al. | Towards automated UI-tests for sensor-based mobile applications | |
CN106557412A (zh) | 一种模糊测试的方法及装置 | |
Paydar et al. | An experimental study on flakiness and fragility of randoop regression test suites | |
CN115618363B (zh) | 漏洞路径的挖掘方法及相关设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |