自动生成可再现运行时问题的单元测试用例的方法和系统的制作方法

文档序号:6561938阅读:311来源:国知局
专利名称:自动生成可再现运行时问题的单元测试用例的方法和系统的制作方法
技术领域
本发明涉及计算机程序的测试及调试领域,更具体地,涉及一种用于 自动生成可再现运行时问题的计算机程序单元测试用例的方法和系统。
背景技术
软件产品例如IBM的软件产品的开发通常遵循这样的过程,开发团队 负责产品开发和单元测试,产品其他的^i测试工作则由专门的测试团队 来负责,B测试所发现的缺陷由开发团队来更正。单元测试是白盒测试, 主要目的是l^i代码逻辑,而验证测试则是黑盒测试,用来!Hit软件功能 和表现。在验证测试期间,可能会发现很多运行时问题,例如非期望的异常以 及不正确的或不正常的程序行为。由于测试团P人和开发团队是相互独立的, 验证测试环境和开发环境也不相同,验证测试中发现的缺陷往往只能通过 测试者的文字描述和软件本身记录的日志信息反馈给开发团队。由于测试 环境缺乏调试工具,而缺陷描述和日志信息又无法直接调试,这样开发团 队必须先根据缺陷描述重建测试环境来进行调试。这通常是非常繁瑣和低 效的过程。并且有时非常难以再现运行时问题并发现它们的原因。而且,当开发团队修正了当前发现的缺陷后或者开发了软件新的版本 后,因为加入了新的代码,测试团队仍然必须确保之前发现的并已《务正的 所有缺陷都仍然是被修正的,没有受到当前修改的影响,即进行所谓的回 归测试。虽然测试团队必须进行回归测试,但是如果开发团队已经能够提 前确保回归测试的正确性,那么测试团队则只要再做一次!HiE而已,无疑回归测试的效率将会大大提高。因为开发团队验证工具通常是单元测试用
例,所以就要求开发团队为每一个已发现的缺陷开发出能够發逸其是否被 修正的单元测试用例。但是由于前一个问题的原因,调试工作已然复杂, 根据缺陷开发单元测试用例往往也是很繁瑣的过程,常常被开发团队所忽 略。目前的测试自动化工具,例如Rational Robot和WinRunner等,仅仅针对测试团队和测试过程,其出发点是替代测试者重复的测试动作。它 们致力于通过记录和回放用户动作,例如键击和鼠标点击,而不是捕获内 部程序行为。它们生成脚本以模拟来自用户和运行时环境的输入。难以确 定必须记录多少用户交互以便再现问题。并且由于回放脚本中可能包含一 些不相关的动作,再现问题所需要的时间可能不是最佳的。单元测试目前已在软件开发过程中得到广泛使用。开发者可以在将程 序提交测试团队进行^^测试之前通过执行单元测试套件(test suite)来 迅速和简单地发现和消除缺陷。 一般来说,单元测试的成本远低于發江测试的成本。目前也存在几种技术和单元测试工具,例如JTest,能够帮助开发者生 成单元测试用例。然而,它们只是针对开发团队和开发过程,是根据对代 码的静态分析等手段而不是运行时上下文来生成测试用例的。但是单纯的 静态分析不能确定程序执行时各程序单元执行的上下文,不能利用运行时 上下文和状态创建出可再现运行时问题的测试用例。因此,它们都不能连 接测试过程和开发过程,来解决上述问题。因此,如果能够根据运行时刻的缺陷自动生成单元测试用例,以上两 个问题将得以有效的解决 一方面开发团队可以直接使用该测试用例进行 调试,省去重建测试环境的工作;另一方面开发团队还可以将此测试用例 加入单元测试过程,以确保回归测试的正确性。标题为"用于监^!^呈序执行的方法和装置"(Method And Apparatus For Monitoring The Execution Of A Program)的美国专利6,738,778 ^>开 了一种跟踪调试工具,它可以在程序中被调用,能够自动收集并打印程序 运行信息(如程序当前运行在哪个类的哪一行)。然而,此专利只是打印用于调试的跟踪信息,而不是生成单元测试用例。也不能主动发现程序运 行中的错误和异常,并以此触发生成单元测试用例的。标题为"用子在软件开发中集成自动软件测试"(Method For Integrating Automated Software Testing With Software Development)的 美国专利6,067,639公开了一种需要集成在开发过程中的自动化软件测试 方法。该方法需要软件开发者在开发阶段就同时开发一些测试操作对象 (Test Operation Object), 一个测试操作对象中实现对程序的某种操作 的调用。这样在测试时,软件测试者就可以编写自动测试程序或脚本,通 过调用这些被测试程序中的测试操作对象来自动化测试软件。由于这些对 象提供了统一的接口 (Interface),这样测试者就不需要为不同的测试环 境开发不同的自动测试程序或脚本。然而,该专利需要软件开发者才艮据统 一的接口开发测试操作对象,实际上相当于在开发测试用例,而不是自动 生成单元测试用例。并且,它要求开发者在开发程序时就一起开发测试操 作对象。从以上所述可见,本领域中显然需要一种能够根据运行时刻的缺陷自 动生成单元测试用例的方法和系统。发明内容为解决现有技术中由于无法在测试环境中生成单元测试用例而导致的 难以在调试时再现运行时问题及便利于回归测试的上述问题并带来其他益 处,而做出了本发明。才艮据本发明的一个方面,提供了一种用于自动生成可再现运行时问题 的计算机程序单元测试用例的方法,该方法包括以下步骤根据计算;^M呈 序中所关注的一个或多个目标程序单元和可能发生的运行时问题修改该程 序;测试执行该修改后的程序;以及根据在所述所关注的目标程序单元的 执行中出现的所述所关注的运行时问题自动生成单元测试用例。才艮据本发明的另 一个方面,提供了 一种用于自动生成可再现运4亍时问 题的计算机程序单元测试用例的方法,该包括以下步骤根据该计算初4呈 序的测试后生成的测试缺陷描述,确定缺陷的性质;5Ut生缺陷的程序羊元; 根据所确定的缺陷的性质;SJL生缺陷的程序单元〗务改该程序;测试执行该下文生成单元测试用例。根据本发明的另外一个方面,提供了一种计算机程序测试方法,该方 法包括以下步骤在所述程序中加入捕获代码和问J^检测代码,其中所述 捕获代码被配置为用于记录该程序中所关注的目标程序单元的执行路径及 执行上下文,而所述问题检测代码被配置为用于检测并记录该程序中所述 所关注的程序单元的执行所可能抛出的所关注的非期望异常以及所可能产 生的所关注的预定行为规则的逸良;以及测试执行经过所述加入的该程序, 以检测并记录所述所关注的非期望异常以及预定行为规则的违反。根据本发明的进一步的方面,还提供了一种用于自动生成可再现运行 时问题的计算机程序单元测试用例的系统,该系统包括修改模块,用于 根据计算机程序中所关注的一个或多个目标程序单元和可能发生的运行时 问题修改该程序;测试执行模块,用于测试执行所述被修改后的程序;以 及单元测试用例生成模块,用于根据在所述所关注的程序单元的执4亍中出 现的所述所关注的运行时问题自动生成单元测试用例。根据本发明的再一个方面,提供了一种计算机程序测试装置,该装置 包括修改模块,用于在所述程序中加入捕获代码和问题检测代码,所述 捕获代码被配置为用于记录该程序中所关注的目标程序单元的执行路径及 执行上下文,而所述问题检测代码被配置为用于检测并记录该程序中所述 所关注的程序单元的执行所可能抛出的所关注的非期望异常以及所可能产 生的所关注的预定行为规则的违反;以及测试执行模块,用于测试执行经 过所述加入的该程序,以检测并记录所关注的目标程序单元的执行中出现 的所述所关注的非期望异常以及预定行为规则的违反。根据本发明的另外一个方面,提供了一种包含计算机可读介质的计算 ^L^呈序产品,该计算机可读介质具有包含在其中的用于使得具有数据处理 能力的系统执行根据前述方法权利要求中任何一个的方法的步骤的程序指 令。从以上所述可见,本发明的主要目是帮助开发团队修正缺陷以及确保 回归测试的正确性,以此来提高软件开发和测试的效率。同时,由子本发 明可以定义产生测试用例的行为规则,因此也有可能在测试过程中发现尚 未表现出的潜在的缺陷,从而帮助开发团队或者测试团队发现缺陷。本发明所带来的主要益处包括可根据运行时上下文生成单元测试用例以再现运行时问题,这样,由 于排除了不相关的操作,再现运行时问题所需的执行时间大为减少,从而 便利了对程序的调试;开发者仅需要围绕所述单元测试用例工作,而无需创建B测试中的 复杂环境,从而大大节约了时间和努力;当施加了新的代码更新后,开发者可使用单元测试用例来简化对旧问 题的發江;以及有助于发现潜在的缺陷,即有助于对程序的發汪测试。


所附权利要求中阐述了被认为是本发明的特点的新颖特征。但是,通 过在结合附图阅读时参照下面对说明性实施例的详细说明将更好地理解发 明本身以及其优选使用模式、另外的目标以及优点,其中图1示出了根据本发明的实施例用于为计算枳應序自动生成可再现运 行时问题的单元测试用例的方法的示意性流程图;图2示出了根据本发明的实施例的用于检测非期望的异常的过程的示 意性流程图;图3示出了根据本发明的实施例的用于检测预定行为规则的违反的过程的示意性流程图;图4示出了在被测试程序的执行过程中一对象的交互过程的示意图; 图5示出了根据本发明的一个实施例的图1所示方法中根据问题列表
图;图6示出了根据本发明的另一个实施例的用于自动生成可再现运行时 问题的计算枳4呈序单元测试用例的方法的流程图;图7示出了根据本发明的实施例的用于自动生成可再现运行时问题的 计算机程序单元测试用例的系统的框图;以及图8示出了根据本发明的进一步的实施例的单元测试用例生成模块的 结构示意图。
具体实施方式
本发明公开了 一种可自动生成可再现程序运行时问题的单元测试用例 的方法和系统。该系统或方法使用加入的检测代码来检测预先确定的运行 时问题,例如非期望的异常和非正常的程序行为。同时,该系统或方法使 用加入的捕获代码来收集所确定对象的执行上下文和其执行路径。当在测 试过程中发生问题时,该系统或方法可生成该对象的单元测试用例。该单 元测试用例可通过以所记录的上下文重放该对象的执行路径来再现该问 题。下面参照附图描述本发明的实施例。然而,应当理解的是,本发明并 不限于所介绍的特定实施例。在附图及以下描述中所给出的大量细节只是 为了说明之用,以便使本领域的技术人员能充分理解本发明的基本思想和 实现本发明,而不构成对本发明的限制。图l示出了根据本发明的实施例用于为计算枳艰序例如Java程序自动 生成可再现运行时问题的单元测试用例的方法的一般步骤。在步骤101中,确定所关注的目标程序单元和可能发生的运行时问题。 对于面向对象的程序例如Java程序来说,所述目标程序单元为目标类。步 骤101优选地在开发环境中执行。该步骤既可以在GUI工具中进行,即用 户通过GUI工具确定目标类和运行时问题,而由GUI工具根据用户的确 定生成将提供给下一步骤的包含确定的目标类和运行时问题的配置信息; 也可以由用户手工进行,即由用户手工编制将提供给下一步骤的包含确定
的目标类和运行时问题的配置信息;也可以与将在下面描述的用于修改目 标程序的下一个步骤组合在一起,即在修改目标程序时确定所关注的目标 类和适衧时问题,也就是所关注的目标类和逸衧时问題休现在如何以及在 何处对目标程序进行修改中,并且在这种情况下,该方法中可以没有该确 定步骤101。
目标类是需要进行单元测试的类。目标类的所有对象将被跟踪以生成 单元测试用例。目标类可通过其限定名被确定。
所述运行时问题可以是非期望的异常或预定行为规则的违反。非期望 的异常是由对象方法抛出的未经检查的运行时异常,例如Java程序中的 java.lang.NullPointerExc印tion,即程序某处试图在一个null对象上调用 对象方法。它们往往是缺陷产生的原因。非期望的异常可以通过方法的限 定名和异常的类别来确定。预定的行为规则描述了所确定对象的正常行为, 包括正确的方法调用顺序、有效的方法参数和返回值等。
在一优选实施例中,在步骤101之前,还包括定义行为规则的步骤, 以便定义将在步骤101中确定的预定行为规则。该定义行为规则的步骤优 选地在开发环境中执行。 一种定义规则的方法是通过对每一条规则确定规 则模板、目标方法以及开发检验代码。规则模板是指预先定义好的一些模 式,例如"Never call <X〉 when <CONDITION>,,, "Never call <X> before <Y> of an object when 〈CONDITION〉,,等等。目标方法即是定义模板中的 "<X>" 、 "<Y>"具体是什么类的什么方法,如确定<义>是 java.lang.String.charAt(int),这决定了检验代码插入的位置。检验代码即 是在目标方法被调用的前后对方法的对象、参数、返回值等等实现模板中 的'^CONDITION〉,,检验。在本发明的一个优选实施例中,检验代码通过 继承一个规则抽象类来实现,如对于上述模板"Never call <X> when 〈CONDITION〉"需要继承AbstractNeverCallXRule类,并重载其中的 matchedX方法即可针对取得的上下文进行检验。规则的抽象类是模板的 一部分,通过它隐藏了模板的具体实现,从而开发规则时可以只专注于检 验代码的开发。
应指出,通过规则模板以;sj現则的抽象类来定义待确定的规则的方法
只是本发明的定义和确定规则的一种实现方式,本发明也可采用其他定义 和确定规则的古式,例如通过直接插入规则的拾验代码(定义和确定规则 的步骤隐含在插入检验代码的过程中)等等。
作为规则的示例,例如,Java全球化功能中可以有码点处理(Code Point Handling)、字符串处理(String Handling)、编码(Encoding)等 规贝'j。作为一个更具体的示例,java.Iang.Strmg.substring(mt beginlndex, int endlndex)方法用于从一个字符串中取出一段子字符串,它简单地从一 个16位的char类型数组char[中取出由beginlndex和endlndex限定的子 char[。然而由于有一些Unicode补充字符是由2个16位的char表示的 (Surrogate),比如字符"WD84(MDC00"表示一补充汉字,此外某些文 字中的组合字符,比如字符"入",也可以使用比如'、u004Uu0300"表示(字 符A和组合字符一瞥),所以在使用Strmg.substring时,4艮有可能取出 的子串含有不完整的字符表示。于是可以定义这样一^L则,在程序中使 用到的所有String.substring之前检验传入的参数和字符串本身,如果发现 beginlndex和endlndex正位于一个不完整的字符上,则会触发一个规则违 例。这条规则还可以定义得更宽,规定只要字符串含有多char表示的字符, 就不食巨直接4吏用substring方法,而不论beginlndex和endlndex是否会取 得不完整字符,因为它可导致潜在的缺陷。
在步骤102,才艮据确定的目标类和运行时问题修改目标程序,即在目 标程序中加入捕获代码(图1中的虚线框部分)和问题检测代码(图2和 图3中的虚线框部分)。优选地,步骤102在开发环境中执行。
在本发明的一优选实施例中,在编译后的Java字节码程序中,加入所 述捕获代码和问Jli检测代码。可使用字节码插入工具来修改目标程序的类 文件,以加入捕获代码和问题检测代码。但是在本发明的其他实施例中, 如下文中所述,提供了可以在源代码中被调用的方法,来人工或通过工具 加入所述捕获代码和问题检测代码以触发测试用例的生成。
捕获代码主要用于记录目标类对象的每一次外部方法调用以及所有方
法调用参数的值,作为目标类对象的执行路径和执行上下文。
有^艮多^"改字节码的方法可以捕捉方法调用的^lfc和结果,不管是插
入在方法调用的地方还是方法体内部。在JVM中,方法调用只有一个字 节码,传入方法的M就是在执行方法调用的字节码之前的JVM参数栈 中的所有对象,在该方法调用字节码执行完成之后,JVM参数栈会被清空 并填上返回值。因此一种简单的获得上下文的方法是替换此方法调用的字 节码,使其调用另一个对象的静态方法,此静态方法的参数和返回值类型 和原有方法基4^目同,只是^ltE多出一个this object。第二种方法是在 此调用字节码之前和之后插入字节码以获取栈中对象(参数)并恢复栈。 当然还有一种方法就是直接^^改目标方法本身的字节码,只需要修改一处。 使用直接修改目标方法时,对于某些没有办法静态修改的类,如JRE中的 类(String等),必须采用动态修改的方式,即在JVM栽入后进行修改。
此外,在一个完整的单元测试用例中,除被测试的目标类对象之外, 还存在着需要模拟的对象(mocked object)和其他无需模拟的对象,这些 是目标类对象的方法调用中的对象M。对于Java程序来说,无需才莫拟的 对象通常是某些Java API中的类,它们可被复制。可以确定需要被模拟的 对象,如果没有确定被模拟的对象类,那么所有不被识别为无需模拟的对 象将会被作为需要被模拟的对象对待。捕获代码还将被加入在对需要模拟 的对象的方法的调用的前后,以记录需要被模拟的对象在被测试对象的方 法中表现出的行为,即被调用的方法以及其返回值等数据。通过这两部分 的记录,可以使用已有的针对Java的模拟技术(例如JMock)来生成模 拟对象,进而生成单元测试用例。 一段实现捕获代码的伪码可以简单表示 如下
〃用于记录被测试对象的执行路径和上下文 class Captor一UnitTestObject { 〃该方法将被插入在目标对象的方法调用之前
public static void beforeCall(String className, String methodName, String methodSig, Object thisObject, Object[I args) { 〃记录执行路径
RuntimeContextRecorder rc = RuntimeContextLogger. getRuntimeContextRecorder(dassName, thisObject);
rc.recordContext(methodName, methodSig, thisObject, args); 〃注册需要在此方法执行中关注的被模拟的对象 rc.beginMockingMonitor(args);
〃该方法将被插入在目标对象的方法调用之后 public static void afterCall(String dassName, Object thisObject) { 〃取消对,皮模拟对象的关注
RuntimeContextRecorder rc = RuntimeContextLogger. getCurrentRuntimeContextRecorder(); rc.endMockingMonitor();
〃用于记录被模拟对象的行为 public class Captor一MockedObject { 〃该方法将被插入在目标对象的方法调用之前
public static void beforeCaH(String className, String methodName, String methodSig, Object thisObject, Object[j args) { 〃记录调用的参数
ObjectMocker om = RuntimeContextLogger. getCurrentRuntimeCoiitextRecorder().getMocker();
om.addRecordBeforeCall(className, methodName, methodSig, thisObject, args);
〃该方法将被插入在目标对象的方法调用之后public static void afterCall(String className, Object thisObject, Object returnedObject, Throwable thrownObject) {
〃记录调用的结果
ObjectMocker om = RuntimeContextLogger. getCurrentRuntimeContextRecorder().getMocker();
om.addRecordAfterCall(className, thisObject, returnedObject, thrownObject);
其中,RuntimeContextLogger是一个负责管理执行上下文信息的类,它维 护了所有关注的对象的上下文信息。RuntimeContextRecorder是一个负责 记录某个关注对象上下文信息的类,通过调用RuntimeContextLogger. getRuntimeContextRecorder(Class className, Object thisObject)来获得, 其recordContext方法即可记录当前的上下文信息。BeginMockingMonitor (Objectargs)方法则启动对所有args对象的上下文捕获用来生成mock对 象,endMockingMonitor()方法结束mock对象的上下文捕获。 ObjectMocker负责记录捕获的mock对象的上下文。
应指出,上述伪码和各类只是实现本发明的捕获代码的示例,而不构 成对本发明的限制。本发明的捕获代码也可以多种其他代码和类来实现。
问题检测代码被加入在每个需要检测的方法的前后。如图2所示。某 些代码被加入在方法调用之后以检测所关注的例如在步骤101中确定的非 期望的抛出的异常。如图3所示,其他代码^入在方法调用之前和之后, 以在执行上下文例如调用顺序、参数和返回值中发现对所关注的例如在步 骤101中确定的行为规则的违反,进而由此来触发单元测试用例的生成。
优选地,问题检测代码用于当发现问题时,将其记入一问题列表,以便在 测试执行结束后生成测试用例。作为另一种选择,问题检测代码也可用于 每当发现一个问题时,即根据该问题以及捕获代码所记彔的执扦路径和执
行上下文生成一测试用例。 一段实现上述substring规则的检测代码的伪码 可以简单表示如下
public class Detective一StringSubstring { 〃该方法将被插入在String.subString的方法调用之前 public static void beforeCallX(String className, String methodName, String methodSig, Object thisObject, Object]args) {
AbstractNeverCallXRule rule = DetectiveManager. loadRule("Globalization.CodePointHandlmg.StringSubString",thisObject); 〃 rule.matchedX中含有检验代码 if (rule.matchedX(thisObject, args)) { DetectiveManager.addViolation(rule); DetectiveManager.generateTestCase();
}
其中,AbstractNeverCallXRule是一种规则的抽象类,用于隐藏规则的 具体实现。DetectiveManager用来载入各种规则类,通it^t规则类中方法 的调用来检验上下文,然后决定是否出发generateTestCase()。
应指出,上述伪码和各类只是实现本发明的检测代码的示例,而不构 成对本发明的限制。本发明的检测代码也可以多种其他代码和类来实现。
优选地,将在步骤102修改的目标程序提供给测试团队,以在测试环 境中进行测试。
在步骤103中,测试执行目标程序。优选地,步骤103在测试环境中 执行。
在测试执行过程中,在目标类的每个方法调用之前,捕获代码捕获该 调用和该调用的^lt。然后执行原来的方法调用。在方法调用的执行过程 中,检测代码试图发现非期望和异常和行为规则的违反,并优选地将其记 入问题列表。
在步骤104中,生成单元测试用例。
在目标程序终止后,系统可使用所记录的执行路径和执行上下文以及 问题列表生成单元测试用例。
作为另一种选择,也可在目标程序执行过程中,每当检测到一个所关 注的问题,就根据该问题以及所记录的执行路径和执行上下文生成一个测 试用例。
对于Java程序,可将单元测试用例形成为包含用于JUnit的测试用例 类的Java源文件。
以及执行上下文。执行路径包括该对象的一系列方法调用,除了由它的其 他方法进行的内部方法调用。执行上下文包括各方法调用所需的^值。
例如,名称为testObj的对象在运行时具有如图4所示的交互。对象 testObj是类ClassTarget的实例。它是通过调用构造器ClassTarget(String) 创建的。在程序运行期间的某些时候,方法methodA、 methodB、 methodC 和methodD被依次调用。当methodD被调用时发生问题。由于methodC 是由methodB内部调用的,所以对象testObj的执行路径应当是 ClassTarget-〉methodA-〉methodB->methodD.
测试数据。原始类型(例如,int、float和char )的值和可序列化(serializable) 的对象(例如,图4中的字符串"test")可以被复制,而其他不可序列化 (即不可被复制)的对象(例如,图4中的obj一b)可以被模拟。只有当 一个对象的所有字段也是可序列化的或者是原始类型的时候,该对象才是 可序列化的。复制物或模拟对象在运行时可提供与原始的被复制物或被模 拟对象相同的行为。
当修改后的该程序执行时或执行后,系统可生成如下的测试用例。
String si = "test"; String s2 = "aaa,"
DataObject ol = new Mock一DataObject();
ClassTarget testObj = new ClassTarget(sl); testObj.methodA(s2); testObj.methodB(o2); testOjb.methodD(); 〃发现问题
图5示出了根据本发明的一个实施例的上述用于生成可再现运行时问
元测试用例的步骤104中的子步骤。
如图所示,在步骤501,遍历问题列表中所有非期望异常或预定行为 规则的违反。
在步骤502,对于所遍历的每一项非期望异常或预定行为规则的违反, 获得所述捕获代码所记录的相应的执行路径和执行上下文以及所述不可被 复制的对象在目标类中的被调用方法、调用参数及其返回值。
在步骤503,根据所访问的所述不可被复制的对象在目标类中的被调 用方法、调用M及其返回值生成所述不可被复制的对象的模拟对象。优 选地,如本领域的技术人员可理解的,可使用以下方法来生成模拟类。生 成被模拟对象的子类,作为模拟该对象的模拟类。该子类中的模拟方法将 覆盖被模拟对象中的原始方法并返回与原始方法的返回值相同的值。这说 是说,该子类的实例对象具有与原始对#^目同的行为。如本域的技术人员 可理解的,还可通过上面提到的插入字节码的方法动态实现模拟。
在步骤504,根据所述所有相关的执行路径及执行上下文以及所生成 的模块类生成测试数据结构和测试目标执行路径,并将它们组合成单元测 试用例,所发现的问题进行调试,或者便利子在程序被修改后进行的回归测试。以上主要以Java面向对象程序为例描述了本发明的用于自动生成可 再现运行时问题的单元测试用例的方法的实施例,应指出的是,本发明也 适用于其他的面向对象程序。而且因为本发明的核心思想并不依赖面向对 象,所以本发明也适用于非面向对象的程序。比如,在非面向对象的程序 中,可以以单个函数作为进行单元测试的程序单元。这样,根据本发明的 捕获代码和问题检测代码将用于记录所确定函数的执行路径和执行上下 文,以及检测在其执行过程中所可能发生的所确定的非期望异常或预定规 则的违反,并据此生成单元测试用例。单元测试用例的方法主要是根据在tiiL测试之前确定的所关注的目标类及 运行时问题修改目标程序,然后通#验证测试过程中执行该修改后的目 标程序来自动生成可再现运行时问题的单元测试用例的。根据本发明的用 于自动生成可再现运行时问题的单元测试用例的方法另一个实施例,还可 以不是在验证测试之前确定所关注的目标类和运行时问题并修改程序,而 是首先进行正常的發江测试并产生缺陷描述;或者可以在根据本发明的上题的单元测试用例之外,生成关于其他未确定的运行时问题的缺陷描述。 开发者在得到所述缺陷描述后经过简单调试确定缺陷发生的代码位置,然用例的异常代码,来直接得到测试用例。这些测试用例可以被加入到自动 化的单元测试过程中,避免手工开发单元测试用例,来降低验证新代码变 更的代价。图6示出了根据本发明的该另 一个实施例的用于自动生成可再现运行 时问题的计算机程序单元测试用例的方法的步骤。如图所示,在步猓601, 根据该计算机程序的验证测试后生成的测试缺陷描述,确定缺陷的性质及 发生缺陷的程序单元。在步骤602,在所述程序中加入捕获代码和问题检 测代码,所述捕获代码被配置为用于记录该程序中的所述程序单元的执行 路径及执衧上下文,而所迷问题检测代码4艮据所确定的缺陷的性质被配置 为用于检测该程序中所述程序单元的执行中的所述缺陷。在步骤603,测 试执行该程序。最后在步骤604,根据检测到的所述缺陷以及所述捕获代 码记录的相关的执行路径及上下文生成单元测试用例。根据本发明的另一个方面,还提供了一种用于对计算机程序进行调试 的方法。优选地,该方法包括以下步骤^使用前述用于自动生成可再现运的单元测试用例;以及通过在开发环境中运行所述单元测试用例来进行调 试。由于所述单元测试用例是在验证测试期间针对开发者预先确定的目标 类和可能发生的运行时问题自动生成的,所以在开发环境中运行所述单元 测试用例将再现在测试环境中所遇到的运行时问题,从而便利了程序的调 试和问题的解决。根据本发明的又一个方面,还提供了一种用于对计算^序进行回归 测试的方法。优选地,该方法包括以下步骤使用前述用于自动生成单元 测试用例的方法生成该计算机程序的单元测试用例;以及在该计算枳4呈序 被修改后,通过在所述修改的计算机程序上运行所述单元测试用例来对该 计算枳^呈序进行回归测试。使用这种方法,可以自动生成可用于回归测试 的单元测试用例,避免了开发者进伊緊瑣的手工开发。所自动生成的单元 测试用例既可由开发者在对程序进行修改或升级后用于检查旧的已被解决 的问M否依然是被解决的,也可由测试者用于进行相同的检查,或由开 发者和测试者双方使用。根据本发明的再一个方面,还提供了一种计算机程序测试方法。优选 地,该方法包括以下步骤在所述程序中加入捕获代码和问题检测代码, 其中所述捕获代码被配置为用于记录该程序中所关注的目标程序单元的执 行路径及执行上下文,而所述问题检测代码被配置为用于检测并记录该程 序中所述所关注的程序单元的执行所可能抛出的所关注的非期望异常以及 所可能产生的所关注的预定行为规则的违反;以及测试执行经过所述加入 的该程序,以检测并记录所述所关注的非期望异常以及预定行为规则的违 反。优选地,该方法还包括定义规则的步骤,以便定义所述所关注的预定 行为规则。 一种定义规则的方法是通过为每一4H!l则确定规则模板、目标 方法和开发检验代码。通过这种方法,有可能在测试过程中发现尚a现 出的潜在的缺陷,以有助于程序测试。以上描述了根据本发明的实施例的用于自动生成可再现运行时问题的 单元测试用例的方法、以及基于该方法的用于对计算积存呈序进行调试的方 法、用于对计算机程序进行回归测试的方法、以及计算枳4呈序的测试方法。 相应地,本发明还提供了一种用于自动生成可再现运行时问题的计算机程 序单元测试用例的系统。图7示出了根据本发明的实施例的用于自动生成可再现运行时问题的 计算机程序单元测试用例的系统700的框图。如图所示,该系统700包括 修改模块703,该修改模块用于根据计算机程序中所关注的一个或多个目 标程序单元和运行时问题修改该程序;测试执行模块704,该测试执行用 于测试执行所述被修改后的程序;以及单元测试用例生成模块705,该单 元测试用例生成模块用于才艮据在所述所关注的程序单元的执行中出现的所 述所述所关注的运行时问题自动生成单元测试用例。优选地,所述运行时问题包括非期望的异常和预定行为规则的违反。优选地,所述修改模块703被配置为用于向该程序加入捕获代码,所 述捕获代码被配置为用于记录该程序中所述所关注的程序单元的执行i^f圣 和执行上下文;以及向该程序加入问题检测代码,所述问题检测代码被配 置为用于检测所述程序单元的执行所可能抛出的所关注的非期望异常以及 所可能产生的所关注的预定行为规则的违反。优选地,所述问题检测代码还被配置为用于每当检测到所述非期望异 常或预定行为规则的M时,就触发所述单元测试用例生成模块705根据 所述捕获代码所记录的执行路径及执行上下文生成单元测试用例。作为另一种选择,所述问题检测代码还被配置为用于每当检测到所述
非期望异常或预定行为规则的违反时,将所述非期望异常或预定行为规则的违反记入问题列表,并且所述单元测试用例生成模块705被配置为用于 当所迷测试执行模块进行的测试执行过程结束后,根据所述问题列表以及 所述捕获代码所记录的执行路径及执行上下文生成单元测试用例。优选地,所述计算机程序为面向对象的程序,更具体地例如为Java 字节码程序,所述程序单元为类,所述执行路径为所述目标类的各实例对 象的每一次外部方法调用,并且所述执行上下文为所述目标类的各实例对 象的每一次外部方法调用的^lt的值。但应指出,本发明也适用于非面向 对象的程序。比如,在非面向对象的程序中,可以以单个函数作为进行单 元测试的程序单元。这样,根据本发明的捕获代码和问题检测代码将用于 记录确定函数的执行路径和执行上下文,以及检测在其执行过程中所可能 发生的所确定的非期望异常或预定规则的违反,并据此生成单元测试用例。优选地,所述捕获代码进一步被配置为用于记录所述目标类的各实例 对象的调用参数中不可被复制的对象的被调用方法、调用^t及其返回值, 并且所述单元测试用例自动生成模块705被配置为用于根据所述捕获代调用方法、调用参数及其返回值生成所述不可被复制的对象的模拟对象;拟对象生成单元测试用例。修改模块703的输入为要对其生成测试用例的目标程序以及用户所确 定的所关注的目标类和运行时问题,其输出为经过修改的包含所述捕获代 码和问题检测代码的目标程序。该经过修改的目标程序将被提供给测试执 行模块704进行测试执行。在本发明的一优选实施例中,所述修改模块703是字节码插入工具例 如普通的字节码插入工具,其通过〗务改目标程序的类文件来加入所述捕获 代码和问题检测代码。但是,在本发明的其他实施例中,还提供了可以在 源代码中被调用的方法。这样,修改模块703可以为用于在源代码中加入 所述捕获代码和问^^测代码的工具。或者,可以人工加入所述捕获代码
和问题检测代码以触发测试用例的生成,并JL^这种情况下,修改模块703 可被理解为进行人工加入时的编辑工具。在本发明的一优选实施例中,所迷测试执行模块704为普通的测试系 统或其部分。在本发明的其他实施例中,该测试执行模块704为专用于本 发明的测试模块。此外,测试执行模块704与所述单元测试用例生成模块 705既可以本领域的技术人员可知的多种方式,例如以插件的方式或者以 包含这两种功能的单个模块的方式,集成在一起;也可以作为两个在物理 上连接在一起的分立的模块;也可以作为两个仅仅在逻辑在连接在一起、 在物理上相互分离和独立的模块,并且在这种情况下两个模块仅仅是依靠 测试执行模块704所输出的、作为单元测试用例生成模块705的输入的执 行路径和执行上下文记录以及运行时问题列表形成逻辑上的连接关系。单元测试用例生成模块705的输入为测试执行模块704所输出的执行 路径和执行上下文记录以;SJL现的问题,其输出为所生成的单元测试用例。问题进行调试,或者便利于在程序被修改后进行的回归测试。优选地,所 述单元测试用例生成模块705被配置为用于将单元测试用例形成为包含 JUnit的测试用例类的Java源文件。优选地,该系统700还包括确定模块702,该确定模块用于确定所述 程序中所述所关注的目标程序单元以及所述所关注的非期望异常和/或预 定行为规则的违反。确定模块702的输出是包含目标类和运行时问题的配置信息。确定模 块702可以是一 GUI工具。该工具除了让用户确定关注的目标类以及异 常之外,还会列出所有已定义的规则树,让用户勾选需要应用的规则。当 然,GUI工具实际上只是提供了一个方便的手段来生成这些提供给第二个 步骤的配置信息,用户完全可以手工编写这些配置,用于只有命令行可供 使用的场合。此外,确定模块702的功能也可以隐含在修改模块703的操 作中,即在通过工具或手工《务改目标程序的过程中在确定在何处修改及如 何修改目标程序时体现所关注的目标类和运行时问题,并且在这种情况下,
该系统700将没有确定模块702。优选地,该系统700还包括规则定义模块701,该规则定义模块用于 定义可由所迷确定模块702确定的预定衧为规则。预定行为规则描述了所 确定程序单元在运行中所应当表现出的行为,包括正确的方法调用顺序、 有效的方法参数和返回值等。定义好的规则可被存储在一规则库中以便由 确定模块702从中检索,也可以被直接提供给确定模块使用。可以针对每 一待测试的程序或一程序的每一次测试生成一组行为规则,也可以创建由 多个程序共享的行为规则库。该规则定义模块701优选地被配置为用于通过以下步骤来定义规则 确定包含目标方法和检验代码的占位符的规则模板;确定目标方法;以及 开发检验代码。规则^^板是指预先定义好的一些模式,例如"Never call <X> when <CONDITION〉,,, "Never call <X> before <Y> of an object when 〈CONDITION〉"等等。目标方法即是定义模板中的"<乂>"、 "〈Y〉,,具体是 什么类的什么方法,这决定了检验代码插入的位置。检验代码即是在目标 方法被调用的前后对方法的对象、参数、返回值等等实现模板中的 "〈CONDITION〉,,检验。在本发明的一个优选实施例中,检验代码通过继 承一个规则抽象类来实现,如对于上述模板"Never call <X> when 〈CONDITION〉"需要继承AbstractNeverCallXRule类,并重载其中的 matchedX方法即可针对取得的上下文进行检验。规则的抽象类是模板的 一部分,通过它隐藏了模板的具体实现,从而开发规则时可以只专注于检 验代码的开发。应指出,通过规则模板以及规则的抽象类来定义待确定的规则的方法 只是本发明的定义和确定规则的 一种实现方式,本发明也可采用其他定义 和确定规则的方式,例如通过直接插入规则的检验代码(定义和确定规则 的步骤隐含在插入检验代码的过程中)等等。优选地,所述修改模块703、确定模块702、和规则定义模块701位于 开发环境中,而所述测试执行模块704、和单元测试用例生成模块705位 于测试环境中。但其他安置方式也是可能的,例如4务改模块703、确定模
块702、规则定义模块701以及测试执行模块704、和单元测试用例生成 模块705均位于开发环境中,或均位于测试环境中,或同时位于两个环境 中,或位千其他环境中。图8示出了根据本发明的进一步的实施例的单元测试用例生成模块 705的结构示意图。如图所示,单元测试用例生成模块705包括问题列 表访问模块801,用于遍历由测试执行模块704所生成的问题列表中的每 一项非期望异常或预定行为规则的il良;执行路径及上下文访问模块802, 用于针对所遍历的每一项非期望异常或预定行为规则的违反,访问所述捕在目标类中的被调用方法、调用*及其返回值;模拟对象构造模块803, 用于才艮据所访问的所述不可被复制的对象在目标类中的被调用方法、调用 Wt及其返回值生成调用参数中的不可被复制的对象的模拟对象;以及单 元测试用例构造模块804,用于根据所访问的执行i^f圣及执行上下文以及所生成的模拟对象构造单元测试用例。以上描述的本发明的实施例的用于自动生成可再现运行时问题的单元测试用例的系统700主要用于这样的场景,即根据在發汪测试之前确定的 所关注的目标类及运行时问题,修改目标程序,然后通it^验证测试过程中然而,根据本发明的实施例的该用于自动生成可再现运行时问题的单元测 试用例的系统700还可以用于这样的场景,即不是在!Hi测试之前确定所 关注的目标类和运行时问题并修改程序,而是首先进行正常的验证测试并 产生缺陷描述;或者可以在上述在發汪测试之前确定所关注的目标类及运 行时问题的场景中,在测试执行步骤中除自动生成可再现所确定的运行时 问题的单元测试用例之外,还生成关于其他未确定的运行时问题的缺陷描 述。在这样的场景中,开发者在得到所述缺陷描述后经过简单调试确定缺 陷发生的代码位置,然后通过自定义新的规则或者是直接在代码中插入能 够触发本发明生成测试用例的异常代码,来直接得到测试用例。这些测试 用例可以被加入到自动化的单元测试过程中,避免手工开发单元测试用例,
来降低验证新代码变更的代价。当根据本发明的实施例的用于自动生成可再现运行时问题的计算机程序单元测试用例的系统用于这样的场景时,所述规则模块701所定义的、 和所述确定模块702所确定的规则是4验证测试后生成的测试缺陷描述 中得出的,所述确定模块702所确定的所关注的异常和目标类也是从测试 缺陷描述中得出的。然后,在经修改模块703根据所述得出的目标类以及 异常和/或规则<务改了目标程序之后,优选地在开发环境中的测试执行模块 704中进行测试运行,并由单元测试用例生成模块705根据在测试执行中 所生成的执行路径和执行上下文以及运行时问题生成单元测试用例。该单 元测试用例将主要用于未来对该目标程序进行的回归测试。根据本发明的另一个方面,还提供了一种用于对计算机程序进行调试 的系统。优选地,该系统包括前述任何一种用于自动生成可再现运行时 问题的单元测试用例的系统700;以及调试装置,用于通过运行所述用于 自动生成可再现运行时问题的计算机程序单元测试用例的系统700所生成 的单元测试用例来对计算机程序进行调试。由于所述单元测试用例是在验 证测试期间针对开发者预先确定的目标类和可能发生的运行时问题自动生 成的,所以在开发环境中运行所述单元测试用例将再现在测试环境中所遇 到的运行时问题,从而便利了程序的调试和问题的解决。根据本发明的又一个方面,还提供了一种用于对计算枳艰序进行回归 测试的系统。优选地,该系统包括前述任何一种用于自动生成可再现运 行时问题的单元测试用例的系统700;以及回归测试装置,用于在该计算 机程序被修改后,通过在所述修改的计算机程序上运行所述用于自动生成 可再现运行时问题的计算机程序单元测试用例的系统700在该计算枳4呈序 被修改之前所生成的单元测试用例来对该计算机程序进行回归测试。使用 这种方法,可以自动生成可用于回归测试的单元测试用例,避免了开发者 进行繁瑣的手工开发。所自动生成的单元测试用例既可由开发者在对程序 进行修改或升级后用于检查旧的已被解决的问IIA否依然是被解决的,也 可由测试者用于进行相同的检查,或由开发者和测试者双方使用。
根据本发明的另外一个方面,还提供了一种计算M序测试装置。优选地,该装置包括修改模块,用于在所述程序中加入捕获代码和问题检 测代码,所述捕获代码被配置为用于记录该程序中所关注的目标程序单元 的执行路径及执行上下文,而所述问题检测代码被配置为用于检测并记录 该程序中所述所关注的程序单元的执行所可能抛出的所关注的非期望异常 以及所可能产生的所关注的预定行为规则的违反;以及测试执行模块,用 于测试执行经过所述加入的该程序,以检测并记彔所关注的目标程序单元 的执行中出现的所述所关注的非期望异常以及预定行为规则的违反。优选 地,该装置还包括规则定义模块,用于定义所述所关注的预定行为规则。 优选地,该规则定义模块被配置为用于通过为每一^L则确定规则模板、 目标方法以及开发检验代码来定义规则。使用这种计算机程序测试装置, 有可能发现尚未表现出的潜在的缺陷,以有助于程序测试。以上参照附图描述了根据本发明的实施例的用于自动生成可再现运 行时问题的测试用例的方法和系统,用于对计算机程序进行调试的方法和 系统,用于对计算机程序进行回归测试的方法和系统,以及计算M序的 测试方法和系统。应理解,附图仅作说明之用,而不构成对本发明的限制。附图可以但 不一定示出本发明的某单个实施例,而可以示出多个实施例的组合。此夕卜, 可以考虑用上文中所述的特征和元素的任意组合来实施和实践本发明,而 无论它们是否涉及不同的实施例。相关领域内的技术人员可认识到,可实 现本发明而没有特定实施例的一个或多个特定特征或优点。在另外的情况 下,可在一些实施例内实现另外的特征和优点,而它们可能不存在于本发 明的任何实施例内。涉及特征和优点的语言应被理解为意指与实施例相联 系地描述的特定特征、优点和特性被包含在本发明的至少一个实施例内。 因此,此整个说明书内的对特征和优点的讨论以及类似语言可以但不必须 指的是相同实施例。另外,在各实施例中,本发明提供了优于现有技术的大量优点。然而, 尽管本发明的实施例可获得优于其他可能的解决方案和/或优于现有技术
的优点,某一具体优点是否由给定的实施例获得并不构成对本发明的限定。 因此,下面的方面、特征、实施例和优点仅作说明之用而不应被看作是所 附权利要求的要素或限定,除非权利要求中明确提出。类似地,谈到"本 发明"不应被解释为对此处所披露的任何发明主题的概括,也不应被看作 是所附权利要求的要素或限定,除非权利要求中明确提出。本发明的这些特征和优点可从以上说明以及所附权利要求内完全清楚 地看到,或者可通过如上文所述地实践本发明来了解。此说明书内所述的许多功能单元已被标记为模块,以便更特别地强调它们的实现独立性。例如,模块可实现为包括定制VLSI电路或门阵列、 现成的半导体例如逻辑芯片、晶体管或其它离散元件的硬件电路。模块也 可实现为可编程硬件设备例如现场可编程门阵列、可编程阵列逻辑、可编 程逻辑设备等。模块还可实现为可被各种处理器执行的软件。可执行代码的被标识的 模块可包括例如可被组织成对象、过程或函数的计算机指令的一个或多个 物理或逻辑块。但是,被标识的模块的可执行代码不必在物理上位于一起, 而是可包括存储在不同位置的不同指令,这些不同指令当在逻辑上连接在 一起时构成该模块并实现模块的规定目的。实际上,可执行代码的模块可以是单个指令或许多指令,甚至可分布 在一些不同的代码段上、不同程序中以及几个存储设备上。类似地,操作 数据在这里可在模块内被标识和说明,并且可体现为任何合适的形式且组 织成任何合适类型的数据结构。操作数据可被聚集成单个数据集,或者可 分布在不同位置上包括在不同存储设备上,并且可至少部分地仅仅作为系 统或网络上的电子信号存在。此外,在上面的说明内,提供了许多特定细节例如编程、方法步骤、 用户选择、系统模块等的示例,以便提供对本发明的实施例的透彻理解。 但是,本领域内的技术人员可认识到本发明可实现为不具有一个或多个所 述特定细节,或者可实现为具有其它步骤、部件。在另外的实施例内,没 有详细示出或说明公知的部件或操作以避免掩盖本发明的方面。
另外,上文中任何具体的模块、装置、系统、方法、步骤的命名仅是 为了方《更而^f吏用的,故而不构成对本发明的限制。一般地给出上文的示例性流程图,作为逻辑流程图。因而,所示的顺 序和标记的操作指示所给出的方法的实施例。可设想在功能、逻辑或效果 上与所示方法的一个或多个操作或其部分等效的其它的操作和方法。另外, 特定方法发生的顺序可能或可能不严格遵循所示的对应操作的顺序。某些 步骤可以合并在一起,或进一步划分了更细的步骤,或添加一些新步骤, 或去除一些步骤。类似地,所描述的系统和装置的模块之间的连接关系可以改变,它们 可以合并成更大的模块,或被进一步地划分为更小的模块,也可以添加某 些新的模块,或去除某些模块,只要它们能够实现根据本发明的功能,这 些改变都处于本发明的精神和范围之内。本发明可以硬件、软件、或硬件与软件的结合的方式实现。本发明可 以集中的方式在一个计算机系统中实现,或以分布方式实现,在这种分布 方式中,不同的部件分布在若干互连的计算机系统中。适于执行本文中描 述的各方法的任何计算机系统或其它装置都是合适的。 一种典型的硬件和软件的组合可以是带有计算;fc^呈序的通用计算机系统,当该计算;bi4呈序被 加栽和执行时,控制该计算机系统而使其执行本文中描述的方式。本发明也可体现在与计算机系统一起使用的程序产品中。该程序产品 包含使能实现本文中描述的方法的所有特征,并且当其#栽到计算机系 统中时,能够执行这些方法。该程序产品可被包含在多种信号承载介质中。 典型的信号承载介质包括但不限于(i)永久存储在不可写存储介质(例 如计算机中的只读存储器装置,例如可由CD-ROM驱动器读取的 CD-ROM盘)上的信息;(ii)存储在可写存储介质(例如软盘驱动器中 的软盘或磁盘驱动器)上的可更改的信息;以及(iii)通过例如包括无线 通信在内的计算机或电话网络等通信介质传送给计算机的信息。当这种信 号承栽介质携带指导本发明功能的、计算机可读的指令时,其代M发明 的实施例。
尽管已参照优选实施例具体示出和说明了本发明,但是本领域内的那 些技术人员应理解,可在形式和细节上对其进行各种改变而不会背离本发 明的精神和范围,本发明的范围由所附权利要求限定。
权利要求
1.一种用于自动生成可再现运行时问题的计算机程序单元测试用例的方法,包括以下步骤根据计算机程序中所关注的一个或多个目标程序单元和可能发生的运行时问题修改该程序;测试执行该修改后的程序;以及根据在所述所关注的目标程序单元的执行中出现的所述所关注的运行时问题自动生成单元测试用例。
2. 根据权利要求1的方法,其中所述运行时问题包括非期望 的异常和预定行为规则的违反。
3. 根据权利要求2的方法,还包括确定所迷程序中所迷所关 注的目标程序单元以及所述所关注的非期望异常和/或预定行为规 则的违反的步骤。
4. 根据权利要求3的方法,还包括定义行为规则的步骤。
5. 根据权利要求4的方法,其中所迷定义行为规则的步骤包括确定包含目标方法和检验代码的占位符的规则模板;确定目标方法;以及开发检验代码。
6. 根据权利要求1 - 5中任何一个的方法,其中所述修改步 骤包括在所述程序中加入捕获代码,所述捕获代码被配置为用于记 录该程序中所述所关注的目标程序单元的执行路径及执行上下 文;以及在该程序中加入问题检测代码,所述问题检测代码被配置为 用于检测该程序中所述所关注的目标程序单元的的执行所可能抛 出的所述所关注的非期望异常以及所可能产生的所述所关注的预 定行为规则的违反。
7. 根据权利要求6的方法,其中所述计算机程序为面向对象 的程序,所述程序单元为类,所述执行路径为所述目标类的各实 例对象的每一次外部方法调用的序列,并且所述执行上下文为所 述目标类的各实例对象的每一次外部方法调用的参数的值和返回 值。
8. 根据权利要求7的方法,其中所述捕获代码进一步被配置 为用于记录所述目标类的各实例对象的调用参数中不可被复制的 对象在目标类中的被调用方法、调用参数及其返回值,并且所述 自动生成单元测试用例的步骤包括根据所述捕获代码所记录的所述目标类的各实例对象的调用 参数中不可被复制的对象在目标类中的被调用方法、调用参数及 其返回值生成所述不可被复制的对象的模拟对象;以及根据所述捕获代码所记录的相关的执行路径及执行上下文以 及所述生成的模拟对象生成单元测试用例。
9. 根据权利要求7的方法,其中,所述问题检测代码还被配 置为用于每当检测到所述所关注的非期望异常或预定行为规则的 违反时,就触发所述自动生成单元测试用例的步骤根据所述捕获 代码所记录的相关的执行路径及执行上下文生成单元测试用例。
10. 根据权利要求7的方法,其中,所述问题检测代码还被配 置为用于每当检测到所述非期望异常或预定行为规则的违反时, 将所述所关注的非期望异常或预定行为规则的违反记入问题列 表,并且所述自动生成单元测试用例的步骤包括当所述测试执行 过程结束后,根据所述问题列表以及所述捕获代码所记录的相关 的执行路径及执行上下文生成单元测试用例。
11. 根据权利要求9或10的方法,其中所述生成的单元测试 用例包括所述目标类的实例对象从被构造到被检测到所述非期望 异常或预定行为规则的违反为止的外部方法调用的序列,以及每一次外部方法调用的参数的值。
12. 根据权利要求10的方法,其中所述捕获代码进一步被配 置为用于记录所述目标类的各实例对象的调用参数中不可被复制 的对象在目标类中的被调用方法、调用参数及其返回值,并且其 中所述根据所述问题列表以及所述捕获代码所记录的相关的执行遍历所述问题列表中的每一项非期望异常或预定行为规则的违反;针对所遍历的每一项非期望异常或预定行为规则的违反,访 问所述捕获代码所记录的相应的执行路径和执行上下文以及所述 不可被复制的对象在目标类中的被调用方法、调用参数及其返回 值;根据所访问的所述不可被复制的对象在目标类中的被调用方 法、调用参数及其返回值生成所述不可被复制的对象的模拟对象; 以及根据所访问的相应的执行路径和执行上下文以及所生成的模 拟对象构造单元测试用例。
13. —种用于自动生成可再现运行时问题的计算机程序单元 测试用例的方法,包括以下步骤根据该计算机程序的测试后生成的测试缺陷描述,确定缺陷 的性质及发生缺陷的程序单元;根据所确定的缺陷的性质及发生缺陷的程序单元修改该程序;测试执行该程序;以及根据检测到的所述缺陷以及所述捕获代码记录的相关的执行 路径及上下文生成单元测试用例。
14. 根据权利要求13的方法,其中所述修改步骤包括 在该程序中加入捕获代码,所述捕获代码被配置为用于记录 该程序中的所述程序单元的执行路径及执行上下文;以及在该程序中加入问题检测代码,所述问题检测代码根据所确 定的缺陷的性质被配置为用于检测该程序中所述程序单元的执行 中的所述缺陷。
15. —种计算机程序测试方法,包括以下步骤 在所述程序中加入捕获代码和问题检测代码,其中所述捕获代码被配置为用于记录该程序中所关注的目标程序单元的执行路 径及执行上下文,而所述问题检测代码被配置为用于检测并记录 该程序中所述所关注的程序单元的执行所可能抛出的所关注的非 期望异常以及所可能产生的所关注的预定行为规则的违反;以及 测试执行经过所述加入的该程序,以检测并记录所述所关注 的非期望异常以及预定行为规则的违反。
16. 根据权利要求15的方法,还包括定义所述预定行为规则 的步骤。
17. —种用于自动生成可再现运行时问题的计算机程序单元 测试用例的系统,包括修改模块,用于根据计算机程序中所关注的一个或多个目标程序单元和可能发生的运行时问题修改该程序;测试执行模块,用于测试执行所述被修改后的程序;以及 单元测试用例生成模块,用于根据在所述所关注的程序单元的执行中出现的所述所关注的运行时问题自动生成单元测试用例。
18. 根据权利要求17的系统,其中所述运行时问题包括非期 望的异常和预定行为规则的违反。
19. 根据权利要求18的系统,还包括确定模块,用于确定所 述程序中所述所关注的目标程序单元以及所述所关注的非期望异 常和/或预定行为规则的违反。
20. 根据权利要求19的系统,还包括规则定义模块,用于定 义可由所迷确定模块确定的规则。
21. 根据权利要求20的系统,其中所述规则定义模块被配置 为用于通过以下步骤来定义规则确定包含目标方法和检验代码的占位符的规则模板;确定目标方法;以及开发检验代码。
22. 根据权利要求17-20中任何一个的系统,其中所述修改 模块被配置为用于在该程序中加入捕获代码,所述捕获代码被配置为用于记录 该程序中所述所关注的程序单元的执行路径和执行上下文;以及在该程序中加入问题检测代码,所述问题检测代码被配置为 用于检测所述程序单元的执行所可能抛出的所关注的非期望异常 以及所可能产生的所关注的预定行为规则的违反。
23. 根据权利要求22的系统,其中所述计算机程序为面向对 象的程序,所述程序单元为类,所述执行路径为所述目标类的各 实例对象的每一次外部方法调用的序列,并且所述执行上下文为 所述目标类的各实例对象的每一次外部方法调用的参数的值和返 回值。
24. 根据权利要求23的系统,其中所述捕获代码进一步被配 置为用于记录所述目标类的各实例对象的调用参数中不可被复制 的对象在目标类中的被调用方法、调用参数及其返回值,并且所 述单元测试用例自动生成模块被配置为用于根据所述捕获代码所记录的所述目标类的各实例对象的调用 参数中不可被复制的对象在目标类中的被调用方法、调用参数及 其返回值生成所述不可被复制的对象的模拟对象;以及根据所述捕获代码所记录的相关的执行路径及执行上下文以 及所述生成的模拟对象生成单元测试用例。
25. 根据权利要求23的系统,其中,所述问题检测代码还被 配置为用于每当检测到所述非期望异常或预定行为规则的违反 时,就触发所述单元测试用例生成模块根据所述捕获代码所记录 的相关的执行路径及执行上下文生成单元测试用例。
26. 根据权利要求23的系统,其中,所述问题检测代码还被 配置为用于每当检测到所述非期望异常或预定行为规则的违反 时,将所述非期望异常或预定行为规则的违反记入问题列表,并 且所述单元测试用例生成模块被配置为用于当所述测试执行模块 进行的测试执行过程结束后,根据所述问题列表以及所述捕获代 码所记录的相关的执行路径及执行上下文生成单元测试用例。
27. 根据权利要求25或26的系统,其中所述生成的单元测试 用例包括目标类的实例对象从被构造到被检测到所述非期望异常 或预定行为规则的违反为止的外部方法调用的序列,以及每一次 外部方法调用的参数的值。
28. 根据权利要求26的系统,其中所述捕获代码进一步被配 置为用于记录所述目标类的各实例对象的调用参数中不可被复制 的对象在目标类中的被调用方法、调用参数及其返回值,并且其 中所述单元测试用例生成模块还包括问题列表访问模块,用于遍历所述问题列表中的每一项非期 望异常或预定行为规则的违反;执行路径及上下文访问模块,用于针对所遍历的每一项非期 望异常或预定行为规则的违反,访问所述捕获代码所记录的相应的被调用方法、调用参数及其返回值;模拟对象构造模块,用于根据所访问的所述不可被复制的对 象在目标类中的被调用方法、调用参数及其返回值生成所述不可 被复制的对象的模拟对象;以及单元测试用例构造模块,用于根据所访问的相应的执行路径 和执行上下文以及所生成的模拟对象构造单元测试用例。
29. —种计算机程序测试装置,包括修改模块,用于在所述程序中加入捕获代码和问题检测代码, 所述捕获代码被配置为用于记录该程序中所关注的目标程序单元 的执行路径及执行上下文,而所述问题检测代码被配置为用于检 测并记录该程序中所述所关注的程序单元的执行所可能抛出的所 关注的非期望异常以及所可能产生的所关注的预定行为规则的违 反;以及测试执行模块,用于测试执行经过所述加入的该程序,以检 测并记录所关注的目标程序单元的执行中出现的所述所关注的非 期望异常以及预定行为规则的违反。
30. 根据权利要求29的装置,还包括用于定义所述预定行为 规则的规则定义模板。
31. —种包含计算机可读介质的计算机程序产品,该计算机可 读介质具有包含在其中的用于使得具有数据处理能力的系统执行 根据前述方法权利要求中任何一个的方法的步骤的程序指令。
全文摘要
本发明公开了一种用于自动生成可再现运行时问题的计算机程序单元测试用例的方法和系统。该方法包括根据计算机程序中所关注的一个或多个目标程序单元和可能发生的运行时问题修改该程序;测试执行该修改后的程序;以及根据在所关注的目标程序单元的执行中出现的所关注的运行时问题自动生成单元测试用例。其中所述修改步骤在程序中加入捕获代码和问题检测代码,捕获代码被配置为用于记录该程序中所关注的目标程序单元的执行路径及执行上下文,而问题检测代码被配置为用于检测该程序中所关注的目标程序单元的执行所可能发生的运行时问题。本发明还提供了使用上述方法及系统进行调试和回归测试的方法及系统,以及计算机程序测试方法及系统。
文档编号G06F11/36GK101165658SQ20061013553
公开日2008年4月23日 申请日期2006年10月18日 优先权日2006年10月18日
发明者史蒂文·阿特金, 俊 尹, 黄省江 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1