CN106560797A - 一种基于调试器的单元测试系统及方法 - Google Patents

一种基于调试器的单元测试系统及方法 Download PDF

Info

Publication number
CN106560797A
CN106560797A CN201610714662.4A CN201610714662A CN106560797A CN 106560797 A CN106560797 A CN 106560797A CN 201610714662 A CN201610714662 A CN 201610714662A CN 106560797 A CN106560797 A CN 106560797A
Authority
CN
China
Prior art keywords
script
test
unit
code
sequence
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.)
Granted
Application number
CN201610714662.4A
Other languages
English (en)
Other versions
CN106560797B (zh
Inventor
李林哲
吴宇生
关墨辰
张栗伟
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Antiy Electronic Equipment Co Ltd
Original Assignee
Beijing Antiy Electronic Equipment Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Antiy Electronic Equipment Co Ltd filed Critical Beijing Antiy Electronic Equipment Co Ltd
Priority to CN201610714662.4A priority Critical patent/CN106560797B/zh
Publication of CN106560797A publication Critical patent/CN106560797A/zh
Application granted granted Critical
Publication of CN106560797B publication Critical patent/CN106560797B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3628Software debugging of optimised code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3644Software debugging by instrumenting at runtime

Abstract

本发明公开了一种基于调试器的单元测试系统,包括:测试定义模块,用于定义包括元数据信息、单元测试对象、单元测试内容的执行脚本;翻译模块,用于解析执行脚本,将所述执行脚本转换产生操纵脚本、工作指示代码序列和引导脚本;以及执行模块,用于载入所述引导脚本的相应功能,载入执行脚本序列,通过基于执行操纵脚本、工作指示代码序列进行单元测试,调用测试的返回值与预置量进行比较判断,得出测试是否成功的结论。本发明所述技术方案克服了C、C++等静态链接系统难以方便的进行运行时代码逻辑控制的问题。

Description

一种基于调试器的单元测试系统及方法
技术领域
本发明涉及计算机软件检测技术领域,更具体地涉及一种基于调试器的单元测试系统及方法。
背景技术
单元测试是持续集成活动中对软件工程质量的重要保证体系,但对于目前普遍存在的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)写入breakmain语句,在主函数前加入中断,并写入开始执行的语句。
代码生成子单元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寄存器等方式,直接执行文件中某段已知的,且已经加载到内存中的shellcode代码。当命中上述断点时,该溢出行为为成功。
进一步的,本发明描述的系统及方法可以与其他动态监控设施协同工作,在已知格式溢出代码位置时,可以在适当位置直接使用调试器提供的jump指令,设置pc寄存器等方式,直接执行文件中某段已知的,且已经加载到内存中的shellcode代码,供其他动态监控设施分析该段代码功能。
本发明描述的系统详细说明在执行过程中,动态的变更软件系统的执行流;并有能力对各工程组成代码单元的输入进行控制,并根据配置,判定其代码单元的输出是否符合预期。通过本发明即使在初期完全不进行配置变更,也能通过引入的简单的动态代码执行流更改及流程变更手段进行质量保证活动。同时其建立的质量保证系统能在变更目标代码产出流程后,自动的在配置变更过程中进行质量保证,从而在引入本系统前及引入本系统后,均可以对软件产品的质量建立一定程度的保证。同时,有通过中断关键系统调用、函数库的执行,并通过汇总而直接汇报恶意代码的功能。
至此已经结合优选实施例对本发明进行了描述。应该理解,本领域技术人员在不脱离本发明的精神和范围的情况下,可以进行各种其它的改变、替换和添加。因此,本发明的范围不局限于上述特定实施例,而应由所附权利要求所限定。

Claims (20)

1.一种基于调试器的单元测试系统,其特征在于,包括:
测试定义模块,用于定义包括元数据信息、单元测试对象、单元测试内容的执行脚本;
翻译模块,用于解析执行脚本,将所述执行脚本转换产生操纵脚本、工作指示代码序列和引导脚本;以及
执行模块,用于载入所述引导脚本的相应功能,载入执行脚本序列,通过基于执行操纵脚本、工作指示代码序列进行单元测试,调用测试的返回值与预置量进行比较判断,得出测试是否成功的结论。
2.根据权利要求1所述的系统,其特征在于,所述执行脚本定义包括测试控制指令、目标测试对象信息、测试执行步骤、测试环境、测试失败条件预置量、测试结果、测试前环境准备、测试后环境清理的执行逻辑。
3.根据权利要求1所述的系统,其特征在于,所述单元测试对象包括:目标程序的单元、文件、动态加载的组件、格式溢出代码。
4.根据权利要求1所述的系统,其特征在于,所述测试定义模块,还用于定义插桩代码。
5.根据权利要求1所述的系统,其特征在于,所述测试定义模块包括:
词法解析单元,用于将所述执行脚本解析为标记序列,同时清洗源程序,清理包括注释、空格、空行的信息;
语法分析单元,用于根据脚本定义,将所述标记序列组织为语法树。
6.根据权利要求1所述的系统,其特征在于,所述翻译模块包括:
元数据解析单元,用于基于所述执行脚本解析元数据信息;
对象解析单元,用于基于所述执行脚本解析目标测试对象的绝对路径,建立工作指示代码序列并写入相应加载指令;
内容解析单元,用于基于所述执行脚本解析单元测试内容,产生操纵脚本和引导脚本。
7.根据权利要求6所述的系统,其特征在于,所述内容解析单元包括:
逻辑生成子单元,用于建立引导脚本,所述引导脚本包括测试前环境准备、测试后环境清理、调用调试器进行单元测试、判定调试器进行的单元测试是否成功并向调用者反馈结论的逻辑;
代码生成子单元,用于建立调试器操纵脚本,所述操纵脚本用于设定单元测试流程及被测试系统代码调用,生成包括目标被测试系统的函数的调用、动态分配结构体和类、指定变量名、指定全部变量状态、提供结果判断及安插桩代码模式的操纵指令序列。
8.根据权利要求1至7任一项所述的系统,其特征在于,所述执行模块包括:
载入单元,用于初始化测试环境,载入所述引导脚本的相应功能,载入执行脚本序列;
执行单元,用于使用调试器功能,基于所述操纵脚本中的操纵指令序列依据设定的单元测试流程执行单元测试,将返回值和数据变量值存入内存和寄存器中;
判断单元,用于通过基于内存和寄存器中的返回值和数据变量,与测试失败条件预置量进行比较,通过结果通讯管道将测试结果返回给引导脚本,若成功,输出成功标识,若失败,输出失败标识,并向所述结果通讯管道中输出用户定义字符串的测试结果;
其中,所述预置量包括测试目标内部函数预期返回值、预期测试目标内部数据变量、动态加载模块函数调用预期返回值、外部脚本调用预期返回值;
清理单元,用于基于所述执行脚本中定义的测试后环境清理的执行逻辑进行测试后环境清理。
9.根据权利要求8所述的系统,其特征在于,所述单元测试流程包括顺序流程、分支流程、循环流程。
10.根据权利要求8所述的系统,其特征在于,所述执行单元包括:用于使用操纵指令序列安插桩代码。
11.一种基于调试器的单元测试方法,其特征在于,包括:
定义包括元数据信息、单元测试对象、单元测试内容的执行脚本;
通过解析所述执行脚本,将所述执行脚本转换产生操纵脚本、工作指示代码序列和引导脚本;以及
载入所述引导脚本的相应功能,载入执行脚本序列,通过基于执行操纵脚本、工作指示代码序列进行单元测试,调用测试的返回值与预置量进行比较判断,得出测试是否成功的结论。
12.根据权利要求11所述的方法,其特征在于,所述执行脚本定义包括测试控制指令、目标测试对象信息、测试执行步骤、测试环境、测试失败条件预置量、测试结果、测试前环境准备、测试后环境清理的执行逻辑。
13.根据权利要求11所述的系统,其特征在于,所述单元测试对象包括:目标程序的单元、文件、动态加载的组件、格式溢出代码。
14.根据权利要求11所述的方法,其特征在于,还包括,定义插桩代码。
15.根据权利要求11所述的方法,其特征在于,还包括:
将所述执行脚本解析为标记序列,同时清洗源程序,清理包括注释、空格、空行的信息;
根据脚本定义,将所述标记序列组织为语法树。
16.根据权利要求11所述的方法,其特征在于,所述解析执行脚本包括:
基于所述执行脚本解析元数据信息;
基于所述执行脚本解析目标测试对象的绝对路径,建立工作指示代码序列并写入相应加载指令;
基于所述执行脚本解析单元测试内容,产生操纵脚本和引导脚本。
17.根据权利要求16所述的方法,其特征在于,所述解析单元测试内容包括:
建立引导脚本,所述引导脚本包括测试前环境准备、测试后环境清理、调用调试器进行单元测试、判定调试器进行的单元测试是否成功并向调用者反馈结论的逻辑;
建立调试器操纵脚本,所述操纵脚本用于设定单元测试流程及被测试系统代码调用,生成包括目标被测试系统的函数的调用、动态分配结构体和类、指定变量名、指定全部变量状态、提供结果判断及安插桩代码模式的操纵指令序列。
18.根据权利要求11至17任一项所述的方法,其特征在于,还包括:
初始化测试环境,载入所述引导脚本的相应功能,载入执行脚本序列;
使用调试器功能,基于所述操纵脚本中的操纵指令序列依据设定的单元测试流程执行单元测试,将返回值和数据变量值存入内存和寄存器中;
通过基于内存和寄存器中的返回值和数据变量,与测试失败条件预置量进行比较,通过结果通讯管道将测试结果返回给引导脚本,若成功,输出成功标识,若失败,输出失败标识,并向所述结果通讯管道中输出用户定义字符串的测试结果;
其中,所述预置量包括测试目标内部函数预期返回值、预期测试目标内部数据变量、动态加载模块函数调用预期返回值、外部脚本调用预期返回值;
基于所述执行脚本中定义的测试后环境清理的执行逻辑进行测试后环境清理。
19.根据权利要求18所述的方法,其特征在于,所述单元测试流程包括顺序流程、分支流程、循环流程。
20.根据权利要求18所述的方法,其特征在于,还包括:使用操纵指令序列安插桩代码。
CN201610714662.4A 2016-08-24 2016-08-24 一种基于调试器的单元测试系统及方法 Active CN106560797B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610714662.4A CN106560797B (zh) 2016-08-24 2016-08-24 一种基于调试器的单元测试系统及方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610714662.4A CN106560797B (zh) 2016-08-24 2016-08-24 一种基于调试器的单元测试系统及方法

Publications (2)

Publication Number Publication Date
CN106560797A true CN106560797A (zh) 2017-04-12
CN106560797B CN106560797B (zh) 2019-07-02

Family

ID=58485650

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610714662.4A Active CN106560797B (zh) 2016-08-24 2016-08-24 一种基于调试器的单元测试系统及方法

Country Status (1)

Country Link
CN (1) CN106560797B (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107807841A (zh) * 2017-10-18 2018-03-16 中国平安人寿保险股份有限公司 服务器模拟方法、装置、设备及可读存储介质
CN111025166A (zh) * 2019-12-27 2020-04-17 深圳市新威尔电子有限公司 用于电池检测系统的调试器
CN112035370A (zh) * 2020-09-04 2020-12-04 常州新途软件有限公司 一种单元测试代码自动生成系统及其生成方法

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1477800A (zh) * 2002-08-20 2004-02-25 华为技术有限公司 镜像测试方法
CN102346235A (zh) * 2011-07-11 2012-02-08 北京北大众志微系统科技有限责任公司 一种面向硬件设备功能的自动测试系统及方法
CN102841841A (zh) * 2011-06-20 2012-12-26 阿里巴巴集团控股有限公司 一种测试中的断言处理方法及系统
US20150007141A1 (en) * 2009-06-11 2015-01-01 Accenture Global Services Limited Assessment system for choosing maintenance approaches for gui-directed test scripts
CN105144088A (zh) * 2012-12-13 2015-12-09 微软技术许可有限责任公司 元数据与源代码的关联以及基于其的应用和服务

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1477800A (zh) * 2002-08-20 2004-02-25 华为技术有限公司 镜像测试方法
US20150007141A1 (en) * 2009-06-11 2015-01-01 Accenture Global Services Limited Assessment system for choosing maintenance approaches for gui-directed test scripts
CN102841841A (zh) * 2011-06-20 2012-12-26 阿里巴巴集团控股有限公司 一种测试中的断言处理方法及系统
CN102346235A (zh) * 2011-07-11 2012-02-08 北京北大众志微系统科技有限责任公司 一种面向硬件设备功能的自动测试系统及方法
CN105144088A (zh) * 2012-12-13 2015-12-09 微软技术许可有限责任公司 元数据与源代码的关联以及基于其的应用和服务

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107807841A (zh) * 2017-10-18 2018-03-16 中国平安人寿保险股份有限公司 服务器模拟方法、装置、设备及可读存储介质
CN107807841B (zh) * 2017-10-18 2020-10-09 中国平安人寿保险股份有限公司 服务器模拟方法、装置、设备及可读存储介质
CN111025166A (zh) * 2019-12-27 2020-04-17 深圳市新威尔电子有限公司 用于电池检测系统的调试器
CN112035370A (zh) * 2020-09-04 2020-12-04 常州新途软件有限公司 一种单元测试代码自动生成系统及其生成方法

Also Published As

Publication number Publication date
CN106560797B (zh) 2019-07-02

Similar Documents

Publication Publication Date Title
CN104407973B (zh) 一种自动化单元测试的实现方法及装置
CA2244293C (en) A process and apparatus for tracing software entities in a distributed system
CN100541445C (zh) 一种程序调测系统及方法
US6898784B1 (en) Method and system for forming skeletons for generating verification systems
US7055136B2 (en) Configurable debug system with dynamic menus
EP3745256A1 (en) External code integrations within a computing environment
US20090150420A1 (en) Generating debug information
CN104932973B (zh) 一种版本兼容测试方法和装置
US20060253739A1 (en) Method and apparatus for performing unit testing of software modules with use of directed automated random testing
CN107608677A (zh) 一种编译处理方法、装置及电子设备
CN110222318B (zh) 基于xml的数据生成工具开发方法
WO2011133030A1 (en) Improved embedded system performance
JPH02272645A (ja) プログラム・デバツグ支援方法
JP2000181725A (ja) 実行可能なコ―ドを改変し、追加機能を付与するための方法およびシステム
US20070061641A1 (en) Apparatus and method for generating test driver
WO2019005228A1 (en) AUTOMATED ADAPTATION OF A SOURCE CODE IN ORDER TO INJECT FUNCTIONS BETWEEN VERSIONS OF A PLATFORM
CN110673837B (zh) 代码修复方法及装置、电子设备、计算机可读存储介质
CN110209389B (zh) 一种基于xml的数据生成工具开发系统
CN107665167B (zh) 程序调试方法、装置及程序开发设备
CN106560797A (zh) 一种基于调试器的单元测试系统及方法
CN112529206A (zh) 一种模型运行方法和系统
WO2018184359A1 (zh) 支付终端应用仿真方法、移动终端和可读存储介质
US10496379B2 (en) Facilitated production of code for software testing
US20070277165A1 (en) Debugging Interpreted Input
US8798971B2 (en) System and method for using a truth table graphical function in a statechart

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
CB02 Change of applicant information

Address after: 100080 Beijing city Haidian District minzhuang Road No. 3, Tsinghua Science Park Building 1 Yuquan Huigu a

Applicant after: Beijing ahtech network Safe Technology Ltd

Address before: 100080 Zhongguancun Haidian District street, No. 14, layer, 1 1415-16

Applicant before: Beijing Antiy Electronic Installation Co., Ltd.

CB02 Change of applicant information
GR01 Patent grant
GR01 Patent grant