一种基于调试器的单元测试系统及方法与流程

文档序号:18074082发布日期:2019-07-03 04:05阅读:253来源:国知局
一种基于调试器的单元测试系统及方法与流程

本发明涉及计算机软件检测技术领域,更具体地涉及一种基于调试器的单元测试系统及方法。



背景技术:

单元测试是持续集成活动中对软件工程质量的重要保证体系,但对于目前普遍存在的C、C++等静态语言编写的工程而言,由于C、C++等静态链接系统难以方便的进行运行时代码逻辑控制,目前普遍存在的对C、C++代码进行单元测试的系统,均需要在项目早期即做好充分文件体系及调用链规划,以方便的独立代码逻辑。

对大量的已有代码资产而言,在之前开发的代码没有充分准备的情况下,使用现有C、C++单元测试手段加入单元测试需要大量的配置变更,而这些配置变更本身,是无法被单元测试进行保障的。因而任何引入的变更都可能造成难以察觉的质量问题。



技术实现要素:

为了解决上述技术问题,提供了根据本发明的一种基于调试器的单元测试系统及方法。

根据本发明的第一方面,提供了一种基于调试器的单元测试系统。该系统包括:测试定义模块,用于定义包括元数据信息、单元测试对象、单元测试内容的执行脚本;翻译模块,用于解析执行脚本,将所述执行脚本转换产生操纵脚本、工作指示代码序列和引导脚本;以及执行模块,用于载入所述引导脚本的相应功能,载入执行脚本序列,通过基于执行操纵脚本、工作指示代码序列进行单元测试,调用测试的返回值与预置量进行比较判断,得出测试是否成功的结论;

所述执行模块包括:

载入单元,用于初始化测试环境,载入所述引导脚本的相应功能,载入执行脚本序列;

执行单元,用于使用调试器功能,基于所述操纵脚本中的操纵指令序列依据设定的单元测试流程执行单元测试,将返回值和数据变量值存入内存和寄存器中;

判断单元,用于通过基于内存和寄存器中的返回值和数据变量,与测试失败条件预置量进行比较,通过结果通讯管道将测试结果返回给引导脚本,若成功,输出成功标识,若失败,输出失败标识,并向所述结果通讯管道中输出用户定义字符串的测试结果;

其中,所述预置量包括测试目标内部函数预期返回值、预期测试目标内部数据变量、动态加载模块函数调用预期返回值、外部脚本调用预期返回值;

清理单元,用于基于所述执行脚本中定义的测试后环境清理的执行逻辑进行测试后环境清理。

在一些实施例中,所述执行脚本定义包括测试控制指令、目标测试对象信息、测试执行步骤、测试环境、测试失败条件预置量、测试结果、测试前环境准备、测试后环境清理的执行逻辑。

在一些实施例中,所述单元测试对象包括:目标程序的单元、文件、动态加载的组件、格式溢出代码。

在一些实施例中,所述测试定义模块还用于定义插桩代码。

在一些实施例中,所述测试定义模块包括:

词法解析单元,用于将所述执行脚本解析为标记序列,同时清洗源程序,清理包括注释、空格、空行的信息;

语法分析单元,用于根据脚本定义,将所述标记序列组织为语法树。

在一些实施例中,所述翻译模块包括:

元数据解析单元,用于基于所述执行脚本解析元数据信息;

对象解析单元,用于基于所述执行脚本解析目标测试对象的绝对路径,建立工作指示代码序列并写入相应加载指令;

内容解析单元,用于基于所述执行脚本解析单元测试内容,产生操纵脚本和引导脚本。

在一些实施例中,所述内容解析单元包括:

逻辑生成子单元,用于建立引导脚本,所述引导脚本包括测试前环境准备、测试后环境清理、调用调试器进行单元测试、判定调试器进行的单元测试是否成功并向调用者反馈结论的逻辑;

代码生成子单元,用于建立调试器操纵脚本,所述操纵脚本用于设定单元测试流程及被测试系统代码调用,生成包括目标被测试系统的函数的调用、动态分配结构体和类、指定变量名、指定全部变量状态、提供结果判断及安插桩代码模式的操纵指令序列。

在一些实施例中,所述单元测试流程包括顺序流程、分支流程、循环流程。

在一些实施例中,所述执行单元包括:用于使用操纵指令序列安插桩代码。

根据本发明的第二方面,提供了一种基于调试器的单元测试方法,包括:定义包括元数据信息、单元测试对象、单元测试内容的执行脚本;通过解析所述执行脚本,将所述执行脚本转换产生操纵脚本、工作指示代码序列和引导脚本;以及载入所述引导脚本的相应功能,载入执行脚本序列,通过基于执行操纵脚本、工作指示代码序列进行单元测试,调用测试的返回值与预置量进行比较判断,得出测试是否成功的结论;

所述方法还包括:

初始化测试环境,载入所述引导脚本的相应功能,载入执行脚本序列;

使用调试器功能,基于所述操纵脚本中的操纵指令序列依据设定的单元测试流程执行单元测试,将返回值和数据变量值存入内存和寄存器中;

通过基于内存和寄存器中的返回值和数据变量,与测试失败条件预置量进行比较,通过结果通讯管道将测试结果返回给引导脚本,若成功,输出成功标识,若失败,输出失败标识,并向所述结果通讯管道中输出用户定义字符串的测试结果;

其中,所述预置量包括测试目标内部函数预期返回值、预期测试目标内部数据变量、动态加载模块函数调用预期返回值、外部脚本调用预期返回值;

基于所述执行脚本中定义的测试后环境清理的执行逻辑进行测试后环境清理。

在一些实施例中,所述执行脚本定义包括测试控制指令、目标测试对象信息、测试执行步骤、测试环境、测试失败条件预置量、测试结果、测试前环境准备、测试后环境清理的执行逻辑。

在一些实施例中,所述单元测试对象包括:目标程序的单元、文件、动态加载的组件、格式溢出代码。

在一些实施例中,还包括:定义插桩代码。

在一些实施例中,还包括:

将所述执行脚本解析为标记序列,同时清洗源程序,清理包括注释、空格、空行的信息;

根据脚本定义,将所述标记序列组织为语法树。

在一些实施例中,解析所述执行脚本包括:

基于所述执行脚本解析元数据信息;

基于所述执行脚本解析目标测试对象的绝对路径,建立工作指示代码序列并写入相应加载指令;

基于所述执行脚本解析单元测试内容,产生操纵脚本和引导脚本。

在一些实施例中,所述解析单元测试内容包括:

建立引导脚本,所述引导脚本包括测试前环境准备、测试后环境清理、调用调试器进行单元测试、判定调试器进行的单元测试是否成功并向调用者反馈结论的逻辑;

建立调试器操纵脚本,所述操纵脚本用于设定单元测试流程及被测试系统代码调用,生成包括目标被测试系统的函数的调用、动态分配结构体和类、指定变量名、指定全部变量状态、提供结果判断及安插桩代码模式的操纵指令序列。

在一些实施例中,所述单元测试流程包括顺序流程、分支流程、循环流程。

在一些实施例中,还包括:使用操纵指令序列安插桩代码。

通过使用本发明的系统和方法,使用调试器作为中间手段,在执行过程中,动态的变更软件系统的执行流;可以方便的在现有C、C++代码基础上进行操作,无需直接改动现有代码即可增加自动化单元测试系统,以改善代码质量。对源码树结构无依赖,并能保证其引入过程没有对关键函数及数据结构造成影响。并有能力对各工程组成代码单元的输入进行控制,并根据配置,判定其代码单元的输出是否符合预期。

附图说明

为了更清楚地说明本发明的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为根据本发明实施例的基于调试器的单元测试系统的框图;

图2为根据本发明实施例的基于调试器的单元测试系统的测试定义模块的框图;

图3为根据本发明实施例的基于调试器的单元测试系统的翻译模块的框图;

图4为根据本发明实施例的翻译模块内容解析单元的框图;

图5为根据本发明实施例的基于调试器的单元测试系统的执行模块的框图;

图6为根据本发明实施例的基于调试器的单元测试方法的流程图;

图7为根据本发明实施例的结合系统和方法的UML序列图。

具体实施方式

下面参照附图对本发明的优选实施例进行详细说明,在描述过程中省略了对于本发明来说是不必要的细节和功能,以防止对本发明的理解造成混淆。虽然附图中显示了示例性实施例,然而应当理解,可以以各种形式实现本发明而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本发明的范围完整的传达给本领域的技术人员。

本发明实施例的基于调试器的单元测试系统支持如下几个方面的功能:

提供一种描述语言,用于描述测试的情况,并定义测试执行步骤及预期结果;

系统通过描述语言支持测试前环境预置、测试后环境清理功能;

系统通过描述语言支持测试失败条件,并输出用户定义字符串;

对每个单元测试而言,系统提供动态使用自定义桩代码替换原有代码的功能;

系统提供运行测试的功能,并能报告测试失败的用户定义字符串。

图1为根据本发明实施例的基于调试器的单元测试系统的框图。如图1所示,系统可以包括:测试定义模块1100、翻译模块1200、执行模块1300。

测试定义模块1100,用于定义包括元数据信息、单元测试对象、单元测试内容的执行脚本,其中,执行脚本可以定义包括测试控制指令、目标测试对象信息、测试执行步骤、测试环境、测试失败条件预置量、测试结果、测试前环境准备、测试后环境清理的执行逻辑。该目标测试对象信息包括但不限于类、函数和结构体等。

以上提到的单元测试对象包括但不限于目标程序的单元、文件、动态加载的组件、格式溢出代码。

具体的,元数据信息包括的配置信息如下:

a)执行脚本中定义的各单元测试所构成的集合的可读名称。

b)单元测试项本身的元数据信息及备注信息等。

具体的,单元测试目标测试对象的配置信息如下:

a)相对于配置脚本存放的目录,编译后的目标文件所放置的位置。

b)为了执行当前脚本定义的单元测试,需要执行的环境设置脚本。

其中,单元测试中的测试目标包括目标文件的完整路径,以及目标类型可以是二进制可执行或二进制动态库。

具体的,单元测试内容的配置信息如下:

a)单元测试包括流程。流程由测试步骤的顺序、分支、循环执行组成。

b)测试步骤可以为对目标被测试系统中函数的调用。

c)测试步骤可以为从目标被测试系统定义中动态分配获取一个结构体,填充结构体中各字段,并获取该结构体所存放的内存地址,可供下面调用函数时进行参数传递使用。

d)测试步骤可以为从目标被测试系统定义中动态分配一个类,调用其构造函数,并调用该类的内容,设置该类的属性等。

e)测试步骤可以包括指定一系列单元测试系统中变量的值,并可以将被测试系统中函数的调用结果、全局变量的当前状态、立即数等内容指定存放入内。

f)测试步骤可以包括指定被测试系统中,全局变量的当前状态。

g)对目标被测试系统中函数的调用需要指定该函数的函数名、函数的各参数所需要传递的值。

h)提供至少如下信息的结果判断手段:AssertEqual:对结构体、字段等内容而言,判断其是否与给定内容二进制层面上一致。对C++的类来说,通过其提供的operation==操作符,进行判定;

AssertNotEqual:对结构体、字段等内容而言,判断其是否与给定内容二进制层面不一致,对C++的类来说,若其提供的operation==操作符失败,则成功;

Fail:无理由失败。

进一步的,测试定义模块1100,还可以用于定义插桩代码。

i)提供安插桩代码的手段

可以要求在执行到该函数时直接返回;

可以要求使用某个源代码中的某个函数直接替换掉该函数的执行。

单元测试内容的配置信息中还包括测试执行语句,该测试执行语句包含有单元测试中涉及到用于分支、循环和语句块等的逻辑控制语句,其中语句包括结构初始化(用于进行类和对象等的初始化)、函数调用、结果赋值、Boolean运算、变量赋值(外围调试)、测试断言(AssertEqual、AssertNotEqual等)、桩代码等。

测试定义模块1100,还将用于将系统提供的描述语言通过编译原理所述词法解析、语法解析手段,解析出抽象语法树(AST)。

其中,该语法树涉及单元测试中包括元数据、测试目标文件、环境清理、测试执行语句、测试结果判定和环境准备等方面。

在一些实施例中,如图2所示的根据本发明实施例的基于调试器的单元测试系统的测试定义模块的框图,测试定义模块1100包括:词法解析单元1110、语法分析单元1120。

词法解析单元1110,用于将执行脚本解析为标记(Token)序列,同时清洗源程序,清理包括注释、空格、空行的信息。

语法分析单元1120,用于根据脚本定义,将标记(Token)序列组织为语法树。

翻译模块1200,将测试定义模块1100解析出的抽象语法树(AST),进行转换,将AST转换产生操纵脚本、工作指示代码序列和引导脚本。

具体的,用于转换为调试器能理解和识别的指令序列或指令集合,及操作系统和/或其他解析器(包括SHELL、PYTHON等解析器)能理解的辅助执行指令。

执行模块1300,用于载入引导脚本的相应功能,载入执行脚本序列,通过基于执行操纵脚本、工作指示代码序列进行单元测试,调用测试的返回值与预置量进行比较判断,得出测试是否成功的结论。

用于在构建过程中,在执行完需要的代码构建过程后,利用代码构建过程产生的结果二进制文件运行测试集合,确认单元测试结果,并报告必要的信息。

在一些实施例中,如图3所示的根据本发明实施例的基于调试器的单元测试系统的翻译模块的框图,翻译模块1200包括:元数据解析单元1210、对象解析单元1220、内容解析单元1230。

元数据解析单元1210,用于基于执行脚本解析元数据信息。

其中,元数据解析单元1210读取用户指定的脚本文件,解析其元数据信息,供编译使用。

对象解析单元1220,用于基于执行脚本解析目标测试对象的绝对路径,建立工作指示代码序列并写入相应加载指令。

其中,对象解析单元1220读取用户指定的脚本文件,找到其单元测试目标测试对象,并解析其绝对路径。

对于每一个测试提到的单元测试,执行测试步骤。

在当前目录下建立固定名称的临时文件夹,在内部建立工作指示代码序列,写入使得调试器加载目标测试对象所在绝对路径的文件的指令。

内容解析单元1230,用于基于执行脚本解析单元测试内容,产生操纵脚本和引导脚本。

在一些实施例中,如图4所示的根据本发明实施例的翻译模块内容解析单元的框图,内容解析单元1230包括:逻辑生成子单元1232、代码生成子单元1234。

逻辑生成子单元1232,用于建立引导脚本,引导脚本包括测试前环境准备、测试后环境清理、调用调试器进行单元测试、判定调试器进行的单元测试是否成功并向调用者反馈结论的逻辑。

进一步的引导脚本包括shell脚本或python等。

具体的,逻辑生成子单元1232具体的解析步骤如下:

a)使用调试器调用系统调用功能,在工作指示代码序列中使用调试器调用系统写入将输出、标准错误输出重定向到临时文件的代码。

b)生成一个以固定名称开头的引导shell脚本,内容为执行环境设置脚本,然后执行调试器并加载上面提到的工作指示代码序列,并将调试器的标准输入重定向到/dev/null,标准输出和标准错误输出重定向到/dev/null,最后写入单元测试项清理脚本调用的信息。

c)向工作指示代码序列中写入建立一个随机管道名的系统调用,并使用调试器调用系统调用,打开该管道。

d)同时在引导shell脚本中加入判断代码,循环读取单元测试开始、单元测试失败、单元测试成功信息,每个单元测试开始,都应当对应一个单元测试失败或单元测试成功信息,若没有对应上即连接断开,则视为失败,设置返回值为非0值,并退出。

e)写入break main语句,在主函数前加入中断,并写入开始执行的语句。

代码生成子单元1234,用于建立调试器操纵脚本,操纵脚本用于设定单元测试流程及被测试系统代码调用,生成包括目标被测试系统的函数的调用、动态分配结构体和类、指定变量名、指定全部变量状态、提供结果判断及安插桩代码模式的操纵指令序列。

一般的,代码生成子单元1234对每个单元测试项,均使用调试器调用系统调用功能,在工作指示代码序列中写入IO重定向的代码,以消除标准输入和标准输出对测试结果观察的影响。

特别的,代码生成子单元1234对每个单元测试项目,将向工作指示代码序列中写入建立结果通讯方式的代码。该结果通讯方式将反馈给逻辑生成子单元1232。

建立结果通讯方式将利用调试器调用系统调用(syscall)方式进行建立。

特别的,逻辑生成子单元1232对每个单元测试项,将生成从前所述结果通讯方式中读取该项单元测试结果的代码。

特别的,逻辑生成子单元1232对每个单元测试项,生成若无法从结果通讯方式中读取到该项单元测试结果的数据,即认定该项测试失败的代码。

特别的,代码生成子单元1234在完成当前其设置的单元测试项的全部设置后,将写入开始执行语句,以要求调试器开始执行所要求的设置。

具体的,代码生成子单元1234具体的解析步骤如下:

a)解析单元测试内容,并写入流程:

向管道中写入单元测试名,开始的信息。

单元测试包括流程。流程由测试步骤的顺序、分支、循环执行组成。顺序流程可以顺序生成代码;分支流程对应调试器脚本中的if/else语句;循环流程对应调试器脚本中的while语句。

对目标系统中函数的调用,生成使用调试器的call功能的代码。

被测试系统中的代码调用对应调试器提供的call语句。

结构体动态转换功能,产生如下代码序列:

i.使用调试器提供的sizeof功能,对给定的结构体名称;

ii.使用malloc功能,在被测试系统的堆上分配一块内存;

iii.指定该内存地址所对应的数据结构为给定结构体;

iv.生成填充这块结构体的内容的代码;

v.使用调试器提供的变量及赋值功能,将生成的这块结构体的内

存地址保存到变量中。

类动态分配及配置功能,产生如下代码序列:

i.对分配类,产生序列,在被测试系统中执行new函数,从被测试系统的堆上分配一个类,并调用其构造函数;

ii.对配置类public属性,使用调试器提供的print功能;

iii.对调用类函数,使用调试器提供的call功能。

指定单元系统变量名,并赋值:

i.若为函数调用结果,生成组合使用调试器的call功能和变量、变量赋值功能的代码;

ii.若为全局变量的当前状态,生成组合使用调试器的print功能和变量、变量赋值功能的代码;

iii.若为立即数,生成组合使用调试器的变量、变量赋值功能的代码。

指定目标被测试系统中全部变量的状态,生成组合使用调试器的call功能的代码。

提供结果判断手段:

i.若为Fail,生成写入之前创建的管道的代码,内容包括:当前测试的单元测试的集合名,单元测试名,用户自定义信息。

ii.若为AssertEqual

若为结构体,且有结构体由立即数指定,组合使用上面给出的结构体动态转换功能和函数调用功能,调用memcmp,获取结果,若不相等,则使用上面提到的Fail的功能,返回信息;

若为类,不支持类内容由立即数指定,对两个类产生使用函数调用operation==的代码,若结果不为true,则使用上面提到的Fail的功能;

若为普通类型,则直接使用==或memcmp对比内存。

iii.若为AssertNotEqual

产生与AssertEqual相类似的代码。

在各单元测试的末尾,若没失败,则生成写入管道的代码,表示当前的单元测试成功。

进一步的,单元测试对象定义了插桩代码时,安插桩代码:

i.若为直接返回的模式,使用调试器提供的break功能设置断点,并使用commands命令指定断点执行使用return功能,返回桩要求的值,并使用continue继续执行即可。

ii.若为安插桩代码的模式,使用调试器的break命令设置端口,并使用commands命令指定断点执行使用调试器的compile命令,编译待替换函数后,return函数的返回值。

b)当所有单元测试都转换完毕后,写入退出调试器的代码。

在一些实施例中,如图5所示的根据本发明实施例的基于调试器的单元测试系统的执行模块的框图,执行模块1300包括:载入单元1310、执行单元1320、判断单元1330、清理单元1340。

载入单元1310,用于初始化测试环境,载入引导脚本的相应功能,载入执行脚本序列。

执行单元1320,用于使用调试器功能,基于操纵脚本中的操纵指令序列依据设定的单元测试流程执行单元测试,将返回值和数据变量值存入内存和寄存器中。

判断单元1330,用于通过基于内存和寄存器中的返回值和数据变量,与测试失败条件预置量进行比较,通过结果通讯管道将测试结果返回给引导脚本,若成功,输出成功标识,若失败,输出失败标识,并向所述结果通讯管道中输出用户定义字符串的测试结果。

其中,预置量包括测试目标内部函数预期返回值、预期测试目标内部数据变量、动态加载模块函数调用预期返回值、外部脚本调用预期返回值。

清理单元1340,用于基于执行脚本中定义的测试后环境清理的执行逻辑进行测试后环境清理。

具体的,对于关键测试对象,执行模块1300将在识别代码生成完成后,调用其生成的引导脚本,包括shell脚本或python等,以该shell脚本或python的返回值为引擎的执行结果。

在一些实施例中,单元测试流程包括顺序流程、分支流程、循环流程。

在一些实施例中,执行单元1320用于使用操纵指令序列安插桩代码。

其中,安插桩代码方式包括:使用断点和,并在命中断点修改执行序列、时立即回退栈帧并返回特定返回值的方式;也包括使用断点,并在命中断点时修改执行序列,执行另一测试对象内置函数,并返回执行结果的方式;也包括使用断点,并在命中断点时使用调试器功能编译并执行提供函数模块,修改执行序列,并返回执行结果的方式。

图6为根据本发明实施例的基于调试器的单元测试方法的流程图,如图6所示,方法包括如下步骤:

S210,定义包括元数据信息、单元测试对象、单元测试内容的执行脚本,其中,执行脚本可以定义包括测试控制指令、目标测试对象信息、测试执行步骤、测试环境、测试失败条件预置量、测试结果、测试前环境准备、测试后环境清理的执行逻辑。该目标测试对象信息包括但不限于类、函数和结构体等。

以上提到的单元测试对象包括但不限于目标程序的单元、文件、动态加载的组件、格式溢出代码。

在一些实施例中,进一步的,定义执行脚本的同时还可以用于定义插桩代码。

其中,定义执行脚本包括将执行脚本解析为标记(Token)序列,同时清洗源程序,清理包括注释、空格、空行的信息;根据脚本定义,将所述标记(Token)序列组织为语法树。

S220,基于执行脚本解析元数据信息。

S230,基于执行脚本解析目标测试对象的绝对路径,建立工作指示代码序列并写入相应加载指令。

S240,基于执行脚本解析单元测试内容,产生操纵脚本和引导脚本。

具体的,用于建立引导脚本,引导脚本包括测试前环境准备、测试后环境清理、调用调试器进行单元测试、判定调试器进行的单元测试是否成功并向调用者反馈结论的逻辑;

建立调试器操纵脚本,操纵脚本用于设定单元测试流程及被测试系统代码调用,生成包括目标被测试系统的函数的调用、动态分配结构体和类、指定变量名、指定全部变量状态、提供结果判断及安插桩代码模式的操纵指令序列。

S250,初始化测试环境,载入引导脚本的相应功能,载入执行脚本序列。

S260,使用调试器功能,基于操纵脚本中的操纵指令序列依据设定的单元测试流程执行单元测试,将返回值和数据变量值存入内存和寄存器中。

S270,通过基于内存和寄存器中的返回值和数据变量,与测试失败条件预置量进行比较,通过结果通讯管道将测试结果返回给引导脚本,若成功,输出成功标识,若失败,输出失败标识,并向所述结果通讯管道中输出用户定义字符串的测试结果。

其中,预置量包括测试目标内部函数预期返回值、预期测试目标内部数据变量、动态加载模块函数调用预期返回值、外部脚本调用预期返回值。

S280,基于执行脚本中定义的测试后环境清理的执行逻辑进行测试后环境清理。

在一些实施例中,单元测试流程包括顺序流程、分支流程、循环流程。

在一些实施例中,还可以使用操纵指令序列安插桩代码。

图7为根据本发明实施例的结合系统与方法的UML序列图,如图7所示,方法包括如下流程:

S310,单元测试开始,接受到测试要求,测试定义模块1100启动测试控制指令,开始测试;

S320,翻译模块1200基于执行脚本进行解析,通过包括词法解析、语法解析、语义解析等解析方式解析出语法树,然后可以转换为调试器能理解和识别的指令序列或指令集合,及系统能理解的辅助执行指令,然后将转换完成的脚本信息返回至测试控制。

S330,测试控制开始运行,执行模块1300载入引导脚本的相应功能,载入执行脚本序列。

特别的,采用的loopn为一个可以自开启和自关闭的开关,这个开关用于在调试时脚本的自动执行和停止。

S340,执行模块1300使用调试器功能,基于操纵脚本中的操纵指令序列依据设定的单元测试流程执行单元测试,将返回值和数据变量值存入内存和寄存器中,其中,可以使用操纵指令序列安插桩代码。

通过基于内存和寄存器中的返回值和数据变量,与测试失败条件预置量进行比较,通过结果通讯管道将测试结果返回给脚本,通过脚本判断结果是否与预期返回值和预期变量相等得出测试成功和失败的结论,若成功,输出成功标识,若失败,输出失败标识,并向结果通讯管道中输出用户定义字符串的测试结果。

脚本将测试结论返回给测试控制,单元测试生命周期结束。

本发明有能力解决静态编译的C、C++代码的桩(stub)代码难题,使得C、C++代码的单元测试中,通过简单的stub代码,隔离问题的复杂性成为可能。

在另一个实施例中,一种基于调试器的单元测试系统及方法,还可以用于缓冲区溢出类安全漏洞存在的确认。

具体的,当本专利应用于该目的时,由测试定义模块1100定义要测试的目标,该目标可以为目标程序的一个文件或该目标程序提供的,可供动态加载的组件。

测试定义模块1100将写入判定确认具有安全问题的确认方法,以及定义溢出方式指定的地址。测试执行时,缓冲区溢出类安全漏洞将会执行到特定的,由溢出方式指定的地址,可以要求在执行到该特定地址时停止到调试器,并在此时指出漏洞确认存在;或者在某一指定的地址处停止,并通过判定某些内存地址的量值来指出漏洞确认存在或漏洞确认不存在;或者通过超时来指出漏洞确认不存在。

执行脚本可以指定调试器设置各寄存器,分配堆内存,及设定内存量,为下一步的待测试溢出代码调用做出准备。

最后执行脚本可以指定在函数表中通过特定调用一个已知的存在特定缓冲区溢出问题的函数;或者可以指定目标的指令入口,该指令入口的设置本质上可以通过直接设置pc寄存器实现;或通过调试器提供的jump指令跳转到指定内存地址。

在另一个实施例中,一种基于调试器的单元测试系统及方法,还可以用于调用格式溢出漏洞代码的确认。

具体的,当本专利应用于该目的时,由测试定义模块1100定义要测试的目标,该目标可以为格式溢出代码。当预先知道格式溢出代码功能时,例如:该格式溢出漏洞代码可能连接网络,则可由测试定义模块1100定义指定断点设置,测试执行时,编译出的调试器指示代码可以将指定断点设置在连接网络相关代码上,例如connect等函数。并使用调试器提供的jump指令、直接设置pc寄存器等方式,直接执行文件中某段已知的,且已经加载到内存中的shell code代码。当命中上述断点时,该溢出行为为成功。

进一步的,本发明描述的系统及方法可以与其他动态监控设施协同工作,在已知格式溢出代码位置时,可以在适当位置直接使用调试器提供的jump指令,设置pc寄存器等方式,直接执行文件中某段已知的,且已经加载到内存中的shell code代码,供其他动态监控设施分析该段代码功能。

本发明描述的系统详细说明在执行过程中,动态的变更软件系统的执行流;并有能力对各工程组成代码单元的输入进行控制,并根据配置,判定其代码单元的输出是否符合预期。通过本发明即使在初期完全不进行配置变更,也能通过引入的简单的动态代码执行流更改及流程变更手段进行质量保证活动。同时其建立的质量保证系统能在变更目标代码产出流程后,自动的在配置变更过程中进行质量保证,从而在引入本系统前及引入本系统后,均可以对软件产品的质量建立一定程度的保证。同时,有通过中断关键系统调用、函数库的执行,并通过汇总而直接汇报恶意代码的功能。

至此已经结合优选实施例对本发明进行了描述。应该理解,本领域技术人员在不脱离本发明的精神和范围的情况下,可以进行各种其它的改变、替换和添加。因此,本发明的范围不局限于上述特定实施例,而应由所附权利要求所限定。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1