CN100468358C - 在软件中模拟条件及驱动控制流的系统和方法 - Google Patents
在软件中模拟条件及驱动控制流的系统和方法 Download PDFInfo
- Publication number
- CN100468358C CN100468358C CNB2006101470230A CN200610147023A CN100468358C CN 100468358 C CN100468358 C CN 100468358C CN B2006101470230 A CNB2006101470230 A CN B2006101470230A CN 200610147023 A CN200610147023 A CN 200610147023A CN 100468358 C CN100468358 C CN 100468358C
- Authority
- CN
- China
- Prior art keywords
- simulation
- function
- analog
- condition
- list item
- 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.)
- Expired - Fee Related
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3696—Methods or tools to render software testable
Abstract
一种模拟软件模块中的条件的方法、信息处理系统和计算机程序产品,包括:在所述软件模块中确定模拟环境是否已激活;遇到所述软件模块中的模拟点,所述模拟点包括一个或多个模拟参数;以及响应于确定所述模拟环境已激活且遇到所述模拟点:调用模拟模块,所述调用包括将所述模拟参数传递给所述模拟模块,在所述模拟模块处将所述模拟参数与一个或多个活跃模拟表项相比较,以及将模拟的条件从所述模拟模块返回所述软件模块以响应所述比较。
Description
技术领域
本发明一般地涉及一种用于模拟软件条件的系统和方法。更具体地说,本发明涉及一种模拟诸如错误条件和结果之类的能够改变可执行软件模块中的控制流的条件的系统和方法。
背景技术
在开发软件时,需要在各个阶段中测试所述软件,包括例如每个模块的单元测试,相关模块的集成测试,功能验证测试,系统验证测试等。理想地,软件产品的完全测试应该包括在所有正确条件以及所有可能的错误条件下测试控制流。但是,要顺利地再现所有可能条件(即使并非不可能)是非常困难的。例如,某些错误条件,如来自服务器的超时条件,需要很复杂的测试环境。表示不常见却合法的条件的代码路径可能难以再现。由于再现和测试某些模糊条件的难度,开发者通常仅测试重要的或易于再现的错误的很小的子集,而所述软件响应所有其他错误的行为仍然未经测试。这对于软件公司是一种负担,当发现程序漏洞时,所述公司需要为其客户提供支持和/或修补。
一种测试软件错误处理的技术是手动再现错误,并加以测试来观察所述软件响应这些错误的行为是否依照说明书。但是,该技术需要投入相当多的时间和精力来再现错误条件并然后从所述错误中恢复。同样,如以上所述,某些错误(如服务器超时错误)是难以再现的。另一种错误处理测试技术是在运行时期间修改函数变元,返回码,或参数,从而产生所关注的错误条件。该方法的缺点是需要可执行软件代码的可调试版本可用。由于可调试版本的可执行文件的规模较大,大多数软件的可执行文件都没有装入到调试预备模式。因此,该方法通常不可用于在客户位置处解决客户问题。同样,该类型的测试不能自动化。对于测试用例的每次运行,都必须通过调试器手动修改相关的变量。因而,这通常是一种成本很高的测试方法。
另一种在开发阶段期间用来测试不同代码路径的测试技术是在源代码中硬编码变量,以便驱动代码的不同代码路径或分支。这仅在开发阶段起作用并且通常不能自动化,因为它涉及手动的代码更改和重编译。另一种强制执行不同代码路径的方法是通过使用调试器来更改变量,变元等。但是,如以上所述,该方法不能自动化,并且同样要求可调试版本的可执行代码可用,这通常不符合客户站点处的情况。
因此,需要一种在软件模块中再现错误和驱动控制流以便允许更有效和更全面地测试软件系统的系统和方法。
发明内容
使用模拟软件模块中的条件的方法可以解决上述难题,所述方法包括:在所述软件模块中确定模拟环境是否已激活;遇到所述软件模块中的模拟点,所述模拟点包括一个或多个模拟参数;以及响应于确定所述模拟环境已激活且遇到所述模拟点:调用模拟模块,所述调用包括将所述模拟参数传递给所述模拟模块,在所述模拟模块处将所述模拟参数与一个或多个活跃模拟表项相比较,以及将模拟的条件从所述模拟模块返回所述软件模块以响应所述比较。
在一个实施例中,所述方法包括从匹配所述模拟参数的第一活跃模拟表项来检索所述模拟的条件,以及在检索所述模拟条件后从匹配所述模拟参数的所述第一活跃模拟表项停用所述模拟的条件。
在另一个实施例中,所述方法包括从模拟文件读取所述活跃模拟表项,其中所述停用还包括写入与匹配所述模拟参数的所述第一活跃模拟表项对应的停用标志。
在另一个实施例中,所述方法包括从模拟文件检索包括在匹配所述模拟参数的所述第一活跃模拟表项中的外部程序引用,以及执行与所述外部程序引用对应的外部程序。
在另一个实施例中,所述方法包括检索由所述外部程序的执行产生的返回值,以及将所述返回值作为所述模拟的条件从所述模拟模块提供给所述软件模块。
在另一个实施例中,所述方法还规定所述遇到的模拟点在所述软件模块的函数中,并且所述模拟参数中的一个参数是与所述函数对应的函数标识符。该实施例还包括在所述函数处接收所述模拟的条件,其中所述模拟的条件是模拟的返回码,以及将所述模拟的返回码返回调用所述函数的代码段。
在另一个实施例中,所述方法还规定所述遇到的模拟点在所述软件模块的函数中,并且所述模拟参数中的一个参数是与所述函数对应的函数标识符。该实施例还包括将“未被模拟”代码从所述模拟模块返回所述函数以响应未定位活跃模拟表项来响应所述比较,在所述函数处接收所述“未被模拟”代码,以及在所述函数处:执行所述函数步骤,以及将由所述函数步骤产生的实际返回码返回调用所述函数的代码段。
在另一个实施例中,所述方法还规定所述模拟参数中的一个参数是变量标识符。该实施例还包括接收所述模拟的条件,其中所述模拟的条件是变量值,以及将与所述变量标识符对应的变量设置为等于所述变量值。
在另一个实施例中,所述方法还规定所述模拟参数中的一个参数是变量标识符。该实施例还包括接收所述模拟的条件,其中所述模拟的条件指示所述变量标识符未被模拟,以及使用程序语句来设置与所述变量标识符对应的变量。
在另一个实施例中,所述方法还规定所述软件模块是已编译的可执行目标模块。
在另一个实施例中,所述方法还规定所述软件模块不在调试环境中运行。
在另一个实施例中,使用能够执行上述方法的信息处理系统来解决前述难题。所述系统包括:用于在所述软件模块中确定模拟环境是否已激活的装置;用于遇到所述软件模块中的模拟点的装置,所述模拟点包括一个或多个模拟参数;用于响应于确定所述模拟环境已激活且遇到所述模拟点的装置,所述装置被配置为:调用模拟模块,所述调用包括将所述模拟参数传递给所述模拟模块;在所述模拟模块处将所述模拟参数与一个或多个活跃模拟表项相比较;以及将模拟的条件从所述模拟模块返回所述软件模块以响应所述比较。
在另一个实施例中,所述用于响应于确定所述模拟环境已激活且遇到所述模拟点的装置进一步被配置为:从匹配所述模拟参数的第一活跃模拟表项来检索所述模拟的条件;以及在检索所述模拟条件后从匹配所述模拟参数的所述第一活跃模拟表项停用所述模拟的条件。
在另一个实施例中,所述用于响应于确定所述模拟环境已激活且遇到所述模拟点的装置进一步被配置为:从模拟文件读取所述活跃模拟表项,其中所述停用还包括写入与匹配所述模拟参数的所述第一活跃模拟表项对应的停用标志。
在另一个实施例中,所述用于响应于确定所述模拟环境已激活且遇到所述模拟点的装置进一步被配置为:从模拟文件检索包括在匹配所述模拟参数的所述第一活跃模拟表项中的外部程序引用;以及执行与所述外部程序引用对应的外部程序。
在另一个实施例中,所述用于响应于确定所述模拟环境已激活且遇到所述模拟点的装置进一步被配置为:检索由所述外部程序的执行产生的返回值;以及将所述返回值作为所述模拟的条件从所述模拟模块提供给所述软件模块。
在另一个实施例中,所述系统规定所述遇到的模拟点在所述软件模块的函数中,并且所述模拟参数中的一个参数是与所述函数对应的函数标识符。该实施例包括用于响应于确定所述模拟环境已激活且遇到所述模拟点的装置,其进一步被配置为:在所述函数处接收所述模拟的条件,其中所述模拟的条件是模拟的返回码;以及将所述模拟的返回码返回调用所述函数的代码段。
在另一个实施例中,所述用于响应于确定所述模拟环境已激活且遇到所述模拟点的装置进一步被配置为:将“未被模拟”代码从所述模拟模块返回所述函数以响应未定位活跃模拟表项来响应所述比较;在所述函数处接收所述“未被模拟”代码,以及在所述函数处:执行函数步骤;以及将由所述函数步骤产生的实际返回码返回调用所述函数的代码段。
在另一个实施例中,所述系统规定所述模拟参数中的一个参数是变量标识符。所述实施例包括用于响应于确定所述模拟环境已激活且遇到所述模拟点的装置,其进一步被配置为:接收所述模拟的条件,其中所述模拟的条件是变量值;以及将与所述变量标识符对应的变量设置为等于所述变量值。
在另一个实施例中,规定所述模拟参数中的一个参数是变量标识符。该实施例包括所述用于响应于确定所述模拟环境已激活且遇到所述模拟点的装置,其进一步被配置为:接收所述模拟的条件,其中所述模拟的条件指示所述变量标识符未被模拟;以及使用程序语句来设置与所述变量标识符对应的变量。
在另一个实施例中,使用存储在计算机可操作介质中并包含指令的计算机程序产品来解决前述难题,当由计算机执行时,所述指令导致所述计算机执行上述方法。
以上所述是概要,并且因此必然包含细节的简化、概括和省略;因此,本领域的技术人员将理解,所述概要只是示例性的并且并非旨在以任何方式进行限制。如仅由权利要求限定的本发明的其他方面、发明特征和优点将在以下所述的非限制性详细说明中变得显而易见。
附图说明
通过参考附图,可以更好地理解本发明,并且本发明的众多目标、特征和优点将对本领域的技术人员变得显而易见,这些附图是:
图1是示出了用于模拟软件条件的各个组件的交互的系统示意图;
图2是示出了当在模拟环境中运行时软件和被模拟的函数之间的交互的示意图;
图3是示出了图2中示出的软件和函数的交互期间所采取的步骤的第一流程图;
图4是示出了图2中示出的软件和函数的交互期间所采取的步骤的第二流程图;
图5是示出了当在模拟环境中运行时被模拟的软件程序的结果的示意图;
图6是示出了图5中示出的软件的模拟期间采取的步骤的第一流程图;
图7是示出了图5中示出的软件的模拟期间采取的步骤的第二流程图;
图8是示出了检查模拟文件以判定特定表项当前是否被模拟所采取的步骤的流程图;
图9是示出了模拟文件中在用于模拟软件程序中的条件之后标记为停用的表项的示意图;
图10是能够实现本发明的计算设备的方块图。
具体实施方式
以下内容旨在提供对本发明的实例的详细说明,并且不应被用来限制发明本身。相反,任何数量的变化都可以落入在说明书之后的权利要求中限定的本发明的范围之内。
本发明是通过模拟来再现错误和其他条件,以及驱动代码路径的控制流的方法、系统和计算机程序产品。该模拟可在运行时重复执行而不需要重建软件。可以使用脚本来使所述过程自动化。模拟可执行软件有若干优点。某些错误难以再现,而能够模拟所述错误允许开发者再现其他方式难以再现的错误条件。此外,模拟甚至允许在所述软件已经安装在客户站后模拟错误,而不需要使用调试器或所述可执行代码的可调试版本。本发明的方法、系统和计算机程序还允许模拟在某些点发生,同时正常处理在其他点进行。以下更完整地说明了在模拟和正常处理之间切换的能力。
图1是示出了用于模拟软件条件的各个组件的交互的系统示意图。开发者编写包含允许模拟的源代码的软件模块(步骤100)。所述允许模拟发生的源代码指令将随所述源代码本身和期望的模拟而不同,如在图2至图8中进一步详细说明的。所述允许模拟的源代码105存储在存储区。可选地,开发者可以选择预编译来插入模拟异常分支(hook)(步骤110)。在例如编译器将模拟异常分支插入所述源代码时使用预编译。所述编译器可以将所述模拟异常分支插入所述源代码中的预定位置处,例如在每个函数调用之前和/或之后,或者在每个函数的开始和/或结束处。然后编译允许模拟的源代码105并将其存储为可执行代码120(即,软件模块)(步骤115)。本领域的技术人员将理解,编译可以包括编译、链接、构造、建立等多个步骤以便产生可执行代码120。
可执行代码120连同模拟模块一起被称为模拟核心135,安装在客户站或开发测试站125处(步骤130)。模拟核心135包含驱动所述模拟的逻辑,包括例如替换变量和/或返回关注的代码并因此通过可执行代码120驱动特定控制流的逻辑。注意,模拟核心135可以是独立的包或可以是所测试的软件模块的集成部分。
判定是否应模拟可执行代码130(步骤140)。可以由关注测试代码的开发者或由客户站处需要再现和解决错误条件的维护人员来做出此判定。如果判定执行可执行代码120的模拟,则决策140转向“是”分支142,于是激活模拟环境(步骤145)。本领域的技术人员将理解,可以通过设置全局变量、环境变量、开关、配置文件中的设置,或通过某些其他方式来激活模拟环境。
编辑模拟文件160以包括将要模拟的特定函数、模拟的返回变量、模拟的变量值等(步骤150)。模拟文件160可以指定应模拟来自哪个组件的哪个函数。模拟文件160可以为变元(如返回码、错误码、局部变量、全局变量、函数变元等)指定新值。模拟文件160还可以包含可执行脚本的路径/名称,连同它们的参数(如果有)。在所述实施例中,可以在开发、测试或运行时处理期间的任何时刻创建和编辑模拟文件160。模拟文件160允许用户指定不同的表项,并从而驱动不同的代码路径。模拟文件160还赋予用户在模拟域和“现实”域之间切换的能力,因为模拟文件160能够指定是否应模拟特定调用(通过变元替换或通过使用占位程序(stub)),或是否应使用常规产生代码。模拟文件160还可以包含用于特定模拟的调用的多个表项。作为实例,用户可以编辑模拟文件160来指定对特定函数的第一个调用使用所述产生代码(即,未被模拟),而对同一函数的下一个调用应模拟特定错误。以下在图2至图8中描述了关于模拟文件160的使用的具体细节。以下还参考图9示出和描述了模拟文件的实例。
然后执行可执行代码120,并且随着执行的进行,使用来自模拟文件160的表项的模拟发生(步骤165)。以下在图2至8中更完整地说明了模拟。在执行了可执行代码120后,判定是否需要调整及可能再次运行所述模拟(决策170)。如果判定调整所述模拟,则决策170转向“是”分支172,于是处理在步骤150继续。但是,如果不需要调整所述模拟(可能因为当前模拟成功再现了错误或成功驱动控制流),则决策170转向“否”分支174,于是处理在195结束。
返回决策140,如果判定无需模拟,则决策140转向“否”分支178,于是关闭模拟环境(或如果先前没有开启则保持关闭)(步骤180)。然后执行可执行代码120而不模拟任何值、返回码,或其他条件(步骤190)。处理然后在195结束。
图2是示出了当在模拟环境中运行时软件和被模拟函数之间的交互的示意图。编辑模拟文件160以包括将要模拟的函数的名称,连同将返回的模拟的返回值(步骤200)。开启所述模拟环境,如以上参考图1所说明的(步骤202)。然后开始执行程序(步骤204)。主程序205开始于210并处理语句(步骤215),直到达到特定的函数调用(步骤220)。在示出的实施例中,函数X 240是可以被模拟的函数。
函数X 240开始于245并检查模拟环境变量以判定系统是否处于模拟模式(步骤250)。注意,此检查可以在所述代码的不同位置执行,并且不一定需要在函数X 240的开始处进行检查。在所述实施例中,根据所述模拟环境变量来判定所述模拟模式是否开启(步骤255)。如果所述模拟模式开启,则函数X 240调用模拟核心135(步骤260)。
模拟核心135接收来自函数X 240的调用,包括由函数X传递的任何参数,如函数X的名称和/或将要模拟的变量名称(步骤285)。模拟核心135读取模拟文件160以判定是否为函数X 240找到任何活跃表项(步骤290)。在步骤295,如果在模拟文件160中找到了活跃表项,则停用所述表项(使得它只被处理一次),并将存储为所述表项的一部分的模拟的返回码返回函数X 240。如果模拟核心135没有在模拟文件160中为函数X 240找到活跃表项,则返回指示没有找到表项的返回码。
函数X 240接收来自模拟核心135的返回码(步骤265)。此返回码可以是模拟的返回码或指示不存在模拟值的返回码。在步骤270,如果所述返回码是模拟的返回码值,则将所述模拟的返回码返回主程序205。如果来自模拟核心135的返回码是指示没有发生模拟的返回码,则函数X 240通过执行功能语句来继续处理(步骤275)。然后将基于所述功能语句的实际返回码返回主程序205(步骤280)。
主程序205接收来自函数X 240的返回码(步骤225),并使用从函数X 240接收的结果来继续执行语句(步骤230)。然后处理在235结束。
图3是示出了图2中示出的软件和函数的交互期间所采取的步骤的第一流程图。主程序300在步骤304开始处理。在步骤308,所述程序做出对接收控制的函数310的函数调用(步骤312)。所述函数进行检查以查看是否已激活模拟环境(步骤316)。如以上所述,可以在所述代码的不同位置处检查所述模拟环境,并可以通过设置全局变量、环境变量、开关、配置文件中的设置,或通过某些其他方式来激活所述模拟环境。判定所述模拟环境是否开启,即,激活(决策320)。如果所述模拟环境未激活,则决策320转向“否”分支359,于是处理在步骤360继续。但是,如果所述模拟环境已激活,这意味着到达了模拟点,从而决策320转向“是”分支322,于是做出对模拟模块,即模拟核心135的调用(步骤324)。
模拟核心135接收来自函数310的调用,包括变元,如函数310的名称(步骤328)。所述模拟核心为函数310在模拟文件160中检查活跃表项(预定处理332),如图8中所示。判定是否找到活跃表项(决策336)。如果为函数310找到了活跃表项,则决策336转向“是”分支342,于是从模拟文件160读取与所述活跃表项关联的模拟结果(步骤344)。然后停用所述活跃表项(步骤348)。可以例如通过除去(comment out)或通过删除模拟文件160中的活跃表项来停用所述活跃表项。还可以通过在表项中设置“已停用标志”,通过使用指针跟踪最后执行的表项,或通过模拟文件中的某些其他类型的控制逻辑来停用所述活跃表项。然后将所述模拟的结果返回函数310(步骤350)。
返回决策336,如果没有在模拟文件160中为函数310找到活跃表项,则决策336转向“否”分支338,于是将“无模拟”返回码返回函数310(步骤340)。“无模拟”返回码可以是预定的指示没有执行模拟的返回码。函数310接收来自模拟核心135的返回码(步骤352)。根据所述返回码判定是否执行了模拟(决策356)。如果所述返回码指示没有执行模拟,则决策356转向“否”分支358,于是执行函数310的实际语句(步骤360),并将实际返回码(即,不是模拟的返回码)返回主程序300(步骤364)。但是,如果将模拟的返回码从模拟核心135返回函数310,则决策356转向“是”分支366,于是将模拟结果返回主程序300(步骤370)。
主程序300接收来自函数310的结果(步骤374)。这些结果可以是实际的,或者它们可以是模拟的。在任一情况中,主程序300使用所接收的结果继续处理,并且处理此后结束于380。
图4是示出了图2中示出的软件和函数的交互期间所采取步骤的备选实施例的第二流程图。主程序400在步骤404开始处理。在步骤408,所述程序做出对接收控制的函数410的函数调用(步骤412)。所述函数进行检查以查看是否已激活模拟环境(步骤416)。如以上所述,可以在所述代码的不同位置处检查所述模拟环境,并可以通过设置全局变量、环境变量、开关、配置文件中的设置,或通过某些其他方式来激活所述模拟环境。然后函数410执行其正常功能,即它执行包含在其可执行代码中的通常产生一个或多个结果的语句(步骤418)。
在函数410执行其正常处理后,判定所述模拟环境是否开启,即激活(决策420)。如果所述模拟环境未激活,则决策420转向“否”分支459,于是处理在步骤464继续。但是,如果所述模拟环境已激活,这意味着到达了模拟点,从而决策420转向“是”分支422,于是做出对模拟模块,即模拟核心135的调用。模拟核心135接收来自函数410的调用,包括变元,如函数410的名称(步骤428)。所述模拟核心为函数410在模拟文件160中检查活跃表项(预定的处理432),如图8中所示。判定是否找到活跃表项(决策436)。如果为函数410找到了活跃表项,则决策436转向“是”分支442,于是从模拟文件160读取与所述活跃表项关联的模拟结果(步骤444)。然后停用所述活跃表项(步骤448)。可以例如通过除去或通过删除模拟文件160中的活跃表项来停用所述活跃表项。还可以通过在表项中设置“已停用标志”,通过使用指针跟踪最后执行的表项,或通过模拟文件中的某些其他类型的控制逻辑来停用所述活跃表项。然后将所述模拟的结果返回函数410(步骤450)。
返回决策436,如果没有在模拟文件160中为函数410找到活跃表项,则决策436转向“否”分支438,于是将“无模拟”返回码返回函数410(步骤440)。“无模拟”返回码可以是预定的指示没有执行模拟的返回码。函数410接收来自模拟核心135的返回码(步骤452)。根据所述返回码判定是否执行了模拟(决策456)。如果所述返回码指示没有执行模拟,则决策456转向“否”分支458,于是将来自步骤418的结果,即实际结果返回给主程序400(步骤464)。但是,如果将模拟的返回码从模拟核心135返回函数410,则决策456转向“是”分支466,于是将所述模拟的结果返回主程序400(步骤470)。
主程序400接收来自函数410的结果(步骤474)。这些结果可以是实际的,或者它们可以是模拟的。在任一情况中,主程序400使用所接收的结果来继续处理,并且处理此后结束于480。
图5是示出了当在模拟环境中运行时被模拟的软件程序的结果的示意图。编辑模拟文件160以包含将要模拟的程序的名称,连同将返回的模拟变量值(步骤500)。开启所述模拟环境,如以上参考图1所描述的(步骤505)。然后所述程序开始执行(步骤510)。程序520检查所述模拟环境变量以查看模拟是否已被激活(步骤525)。注意,此检查可以在所述代码的不同位置处执行,并且不一定必须在程序520的开始处检查。然后程序520继续处理程序指令(步骤530)直到达到模拟点。在所述实施例中,根据所述模拟环境变量判定所述模拟模式是否开启(步骤535)。如果所述模拟模式已开启,则程序520调用称为模拟核心135的模拟模块,将要模拟的程序和变量(在此实例中为变量X)的名称传递给所述模拟模块(540)。
模拟核心135接收来自程序520的调用,包括由程序520传递的参数(步骤570)。模拟核心135读取模拟文件160以判定是否为程序520找到任何活跃表项(步骤580)。在步骤590,如果在模拟文件160中找到了活跃表项,则停用所述表项(使得它只被处理一次),并且将存储为所述表项的一部分的模拟的变量值返回程序520。如果模拟核心135没有在模拟文件160中为程序520找到活跃表项,则返回指示没有找到表项的返回码。
程序520接收来自模拟核心135的所述模拟的变量值或所述返回码。在步骤545,如果已模拟了所述变量,则处理通过使用所述模拟的变量值继续。另一方面,如果来自模拟核心135的返回码是指示没有发生模拟的返回码,则程序520通过使用一个或多个程序语句设置变量X来继续处理。在步骤550,如果模拟模式没有被激活,则通过使用一个或多个程序语句来设置变量X。然后处理继之以使用变量X(可能是也可能不是模拟的变量值)的程序指令(步骤555)。
图6是示出了图5中示出的软件的模拟期间采取的步骤的第一流程图。程序600检查以查看模拟环境是否已激活(步骤605)。如以上所述,可以在所述代码的不同位置处检查所述模拟环境,并可以通过设置全局变量、环境变量、开关、配置文件中的设置,或通过某些其他方式来激活所述模拟环境。处理继续直到达到代码中的模拟点(步骤610)。注意,软件开发者或预编译器可以将模拟点插入所述代码中,如以上参考图1所述。
判定所述模拟环境是否被激活(决策615)。如果所述模拟环境未激活,则决策615转向“否”分支672,于是处理在步骤675继续。但是,如果所述模拟环境已开启,则决策615转向“是”分支618,于是调用模拟模块,即模拟核心135(步骤620)。作为对模拟核心135的调用的一部分,将要模拟的一个或多个变量名称传递给模拟核心135。模拟核心135接收来自程序600的包括所述变量名称的请求(步骤625)。
所述模拟核心在模拟文件160中为要模拟的一个或多个变量检查活跃表项(预定的处理630),如图8中所示。判定是否找到活跃表项(决策635)。如果为要模拟的一个或多个变量找到了活跃表项,则决策635转向“是”分支642,于是从模拟文件160读取与所述活跃表项关联的一个或多个模拟的变量值(步骤645)。然后停用所述活跃表项(步骤650)。可以例如通过除去或通过删除模拟文件160中的活跃表项来停用所述活跃表项。还可以通过在表项中设置“已停用标志”,通过使用指针跟踪最后执行的表项,或通过模拟文件中的某些其他类型的控制逻辑来停用所述活跃表项。然后将所述一个或多个模拟的变量值返回程序600(步骤655)。
返回决策635,如果没有在模拟文件160中为要模拟的一个或多个变量找到活跃表项,则决策635转向“否”分支638,于是将“无模拟”返回码返回程序600(步骤640)。“无模拟”返回码可以是预定的指示没有执行模拟的返回码。
程序600接收来自模拟核心135的所述一个或多个模拟的变量值或所述“无模拟”返回码(步骤660)。根据所接收的值,判定是否执行了模拟(决策665)。如果所述返回码指示没有执行模拟,则决策665转向“否”分支668,于是使用程序600的实际指令来设置一个或多个值(步骤675)。但是,如果将一个或多个模拟的变量值从模拟核心135返回程序600,则决策665转向“是”分支678,于是使用从模拟核心135接收的一个或多个值来设置所述要模拟的一个或多个变量(步骤680)。然后程序600使用由所述实际指令或由所述模拟核心设置的变量值继续处理(步骤685)。然后处理结束于695。
图7是示出了图5中示出的软件的模拟期间采取的步骤的另一个实施例的第二流程图。程序700使用其常规的一个或多个产生代码指令来设置一个或多个变量的值(步骤702)。然后程序700检查以查看是否已激活模拟环境(步骤705)。如以上所述,可以在所述代码的不同位置处检查所述模拟环境,并可以通过设置全局变量、环境变量、开关、配置文件中的设置,或通过某些其他方式来激活所述模拟环境。处理继续直到达到代码中的模拟点(步骤710)。注意,模拟点可以由软件开发者或预编译器插入到所述代码中,如以上参考图1所述。
判定所述模拟环境是否被激活(决策715)。如果所述模拟环境未激活,则决策715转向“否”分支772,于是处理在步骤785继续。但是,如果所述模拟环境已开启,则决策715转向“是”分支718,于是调用模拟模块,即模拟核心135(步骤720)。作为对模拟核心135的调用的一部分,将要模拟的一个或多个变量名称传递给模拟核心135。模拟核心135接收来自程序700的包括所述变量名称的请求(步骤725)。
所述模拟核心在模拟文件160中为要模拟的所述一个或多个变量检查活跃表项(预定的处理730),如图8中所示。判定是否找到活跃表项(决策735)。如果为要模拟的所述一个或多个变量找到了活跃表项,则决策735转向“是”分支742,于是从模拟文件160读取与所述活跃表项关联的一个或多个模拟的变量值(步骤745)。然后停用所述活跃表项(步骤750)。可以例如通过除去或通过删除模拟文件160中的活跃表项来停用所述活跃表项。还可以通过在表项中设置“已停用标志”,通过使用指针跟踪最后执行的表项,或通过模拟文件中的某些其他类型的控制逻辑来停用所述活跃表项。然后将所述一个或多个模拟的变量值返回程序700(步骤755)。
返回决策735,如果没有在模拟文件160中为要模拟的一个或多个变量找到活跃表项,则决策735转向“否”分支738,于是将“无模拟”返回码返回给程序700(步骤740)。“无模拟”返回码可以是预定的指示没有执行模拟的返回码。
程序700接收来自模拟核心135的所述一个或多个模拟的变量值或所述“无模拟”返回码(步骤760)。根据所接收的值,判定是否执行了模拟(决策765)。如果所述返回码指示没有执行模拟,则决策765转向“否”分支778,于是处理在步骤785继续。但是,如果将一个或多个模拟的变量值从模拟核心135返回给程序700,则决策765转向“是”分支768,于是使用从模拟核心135接收的所述一个或多个值来替换所述要模拟的一个或多个变量(步骤780)。然后程序700使用由所述实际指令(在步骤702)或由所述模拟核心设置的变量值来继续处理(步骤785)。然后处理结束于795。
图8是示出了检查模拟文件以判定特定表项当前是否被模拟所采取的步骤的流程图。在所述实施例中,模拟文件可以根据所模拟的信息的性质而包含各种类型的信息。例如,一种类型的模拟表项包括被模拟的函数的名称,连同用于该函数的模拟的返回码。注意,以上参考图2至4示出了函数返回码模拟的两个可能的实施例。另一种类型的模拟表项包含被模拟的一个或多个变量的名称,连同用于每个模拟的变量的模拟值。可选地,可以将函数名称和一个或多个变量名称连同用于所述变量的模拟值存储为模拟表项。以上参考图5至7示出了变量模拟的两个可能的实施例。
另一种类型的模拟表项包括对外部程序的调用。例如,当激活模拟时,可能希望调用外部例程来建立特定环境或执行特定任务。当达到模拟点时,被执行的软件模块(即,程序或函数)调用所述模拟核心,将函数名称传递给所述模拟核心。当所述模拟核心检查所述模拟文件时,用于所述特定函数名称的表项可以包括将调用的外部例程的名称。然后执行此外部例程,然后将控制传递回调用所述模拟核心的程序或函数。可以从调用所述模拟核心的程序传递参数,也可以不传递参数,并且反之亦然。
某些错误条件不能仅仅通过错误代码替换来再现,而调用外部函数的能力是有用的以便再现这些错误条件。在再现某些错误之前可能需要创建合适的环境,因为调用链中的后续函数可能期望某些仅在特定环境中的错误。一种方法是在再现错误之前在所述模拟核心中包含逻辑以运行可选的环境建立函数(在所述模拟文件中指定为可选字段)。所述模拟文件可以包含环境建立函数的位置、名称以及(可选)参数,所述环境建立函数确保在模拟所述错误之前存在所述合适的条件(并且如果不存在,则设置所述条件)。在多线程环境中进行测试时,调用外部函数的能力也是有用的。可以模拟一个线程,然后执行脚本来替换所述模拟文件,使得下一个线程看到不同版本的配置文件。
在某些情形中,可以将函数名称和变量名称连同用于变量的模拟值存储为模拟表项,并且所述表项还可以包括外部函数。例如,以下表项可以被存储为模拟表项:
FuncX,Var1=1,RC=10,/user/priya/delete_file,filename
在该实例中,FuncX标识了所模拟的函数。Var1将用值1来模拟,且用于FuncX的返回码将用返回码10来模拟。将执行由路径/user/priya/delete_file给定的脚本,且将filename作为要删除的文件传递给所述脚本。
返回图8,为了定位特定模拟表项,处理开始于800,于是在模拟文件160中定位模拟点标识符(步骤810)。所述模拟点标识符可以是函数名称、变量名称、函数名称和变量名称的组合,或任何其他标识模拟表项的标识符。判定是否找到所述模拟点标识符(决策820)。如果没有为所述模拟点标识符找到表项,则决策820转向“否”分支822,于是返回“未找到”(或“无模拟”)返回码(步骤825)。但是,如果为所述模拟点标识符找到了表项,则决策820转向“是”分支828,于是进一步判定所述表项是否活跃(决策830)。特定函数和/或变量可以具有多个模拟表项。例如,模拟文件中可以存在三个用于特定函数的表项。第一个表项可以包含成功返回码,第二个表项可以包含特定错误返回码,而第三个表项可以包含不同的错误返回码。这允许当执行模拟时,其中在第一次调用函数时,它成功完成,但在第二次和第三次调用所述函数时,它产生两种不同的错误。例如,当测试数据库代码时,第一个“fetch”指令可能不同于随后的“fetch”指令。第一个fetch指令确定将取回哪个块,而所有随后的fetch指令从预定的块获得数据。某些客户问题可能对应于非第一次的fetch指令。为函数使用多个模拟表项允许第一个fetch指令调用在无模拟的情况下继续,然后使用各种模拟的错误返回码来模拟随后的fetch指令。
在所述模拟文件中的每个表项处理完之后,将其标记为“不活跃”,使得下一次模拟所述函数时,下一个活跃表项是用于所述模拟的表项。可以以多种方式将模拟表项标记为“不活跃”,例如,通过除去模拟表项行,或通过改变所述模拟表项的第一个字符来指示它不再“活跃”。
如果判定所述表项不活跃,则决策830转向“否”分支832,于是定位下一个模拟点标识符(步骤835),且处理在决策820继续。但是,如果判定所述模拟表项活跃,则决策830转向“是”分支838,于是分析所述表项(步骤840)。判定是否将调用外部程序(决策850)。所述外部程序可用于执行更多相关模拟,或建立环境,或执行某些其他处理。如果判定不调用外部程序,则决策850转向“否”分支878,于是从所分析的模拟表项检索一个或多个所模拟的值(步骤880)。此模拟的值通常为模拟的返回码或一个或多个模拟的变量值。然后在895返回所检索的模拟值。
返回决策850,如果判定调用外部程序,则决策850转向“是”分支852,于是调用在所述模拟文件中指定的外部例程(步骤855)。如果调用所述模拟核心的软件模块或在所述模拟表项中指定了参数,则将这些参数传递给所述外部例程。从所述外部例程接收返回值,如返回码(步骤860)。判定是否将该返回值返回给所述软件模块(决策870)。当所述外部例程已执行模拟并返回了模拟的返回值时可以是这种情况。如果要将所述返回值返回所述软件模块,则决策870转向“是”分支872,于是所述外部返回值在875返回。如果不将来自所述外部例程的返回值返回所述软件模块,则决策870转向“否”分支876,于是获得来自所分析的表项的模拟值(如果所分析的表项中存在模拟值)(步骤880)。在895返回该值。
图9是示出了模拟文件中在用于模拟软件程序中的条件之后标记为停用的表项的示意图。模拟文件900在三个重复中示出。第一个重复示出了在任何模拟发生之前的模拟文件900。模拟文件900包含三个用于Func_1的模拟表项。第一次调用Func_1时,所述模拟核心将返回值“No_Sim”。在所述实施例中,返回值“No_Sim”表示所述Func_1对于此次重复应继续其正常处理。这与所述模拟核心没有为Func_1找到模拟表项的情形类似。注意,在以后的重复中,可以模拟Func_1的返回值。同样,在此次重复中,如果Func_1中存在其他模拟点,例如,如果存在模拟的变量,则该模拟仍将发生。返回值“No_Sim”只是意味着对于该特定模拟点将不执行模拟,而不应影响任何其他模拟点。第二次调用Func_1时,所述模拟核心将返回指示Error_3发生的模拟的错误码。第三次调用Func_1时,所述模拟核心将返回指示Func_1成功地完成的模拟返回码(换言之,指示无错误的模拟返回码)。
模拟文件900还包含三个用于Func_1中找到的Var_X的表项。第一次模拟Var_X时,所述模拟核心将为Var_X返回模拟的值“Test Value”。第二次模拟Var_X时,所述模拟核心将为Var_X返回模拟的值“No_Sim”。这表示在此次重复期间将不模拟Var_X的值,而是Func_1应使用其正常生成码语句来计算Var_X的值。第三次模拟Var_X时,所述模拟核心将为Var_X返回模拟的值“Another Test Value”。
模拟文件900还包含两个用于Func_2的模拟表项。第一次调用Func_2时,所述模拟核心将返回指示Func_2已成功地完成的模拟的返回码。第二次调用Func_2时,将调用外部程序。所述外部程序将通过调用占位程序(Stub_For_Network_Error),使用存储在所述模拟表项中的参数,来模拟网络错误。所述模拟的返回码,“Network_Error”,也存储在所述模拟表项中,并且是将返回给所述软件模块的模拟返回码。
模拟文件900的第二个重复示出了在Func_1和Func_2都被调用一次后的模拟文件900。现在Func_1,Func_1的Var_X,以及Func_2的第一个模拟表项都标记为“不活跃”,所以它们在此模拟期间将不再使用。在所述实施例中,通过在表项之前的位置中放置“x”来将所述表项标记为“不活跃”。另一个选项是在使用表项后将它们除去。
模拟文件900的第三个重复示出了在Func_1和Func_2都被调用两次后的模拟文件900。现在Func_1,Func_1的Var_X,以及Func_2的前两个表项都标记为“不活跃”。
如以上所述,所述模拟文件可用于驱动多条代码路径。模拟表项可用于在任何组合以及为任何数量的调用模拟错误和成功条件。某些模拟表项可以指示在该重复中将不执行模拟。模拟表项可以可选地使用占位程序,并且如果使用,可以为所述占位程序指定参数,也可以不指定。对于很大的模拟文件,可以使用脚本来生成所述模拟文件。例如,在软件模块中可能存在数百甚至数千处可能发生连接丢失的位置。可以使用脚本来生成具有随机数量的用于成功连接的表项并且然后为丢失连接错误插入模拟表项的模拟文件。所述脚本可以被重复运行多次,每次在所述模拟文件中的不同点处插入所述连接丢失错误。
使用本发明的方法、系统,和/或计算机产品允许测试者利用测试套件,该测试套件可以在产品的不同部分测试不同的错误,无需重新编译所述代码或重新编写/重新编译所述测试套件。只需改变所述模拟文件来指定应模拟哪些功能和/或函数,以及哪些应使用“真实”(即正常,产生)代码执行。这可能可以为测试者节约大量时间,因为只是通过使用不同的模拟文件,就可以将测试套件用于测试不同的函数。例如,测试者可以首先使用空配置文件运行产品,使得没有模拟发生且所有函数都执行其正常代码。随后,测试者可以通过使用一个或多个导致某些函数将被模拟而其他函数使用它们的“真实”代码的模拟文件来测试各种返回码条件。此外,如以上所述,测试者然后可以通过使用指定函数和模拟的返回码和/或变量值的不同组合的配置文件来为不同函数测试错误组合。
本发明的方法、系统和计算机产品也可用于测试进程之间的并发性。这样的测试难以再现,因为难以预测或枚举所有可能的点(其中一个进程中的错误能够影响其他并行运行的进程)。使用上述方法,测试者可以将不同的(尽管是可预测的)错误插入压力测试环境中,并验证所述并发进程的鲁棒性。
图10示出了作为能够执行此处描述的计算操作的计算机系统的简化实例的信息处理系统1001。计算机系统1001包括连接到主机总线1002的处理器1000。二级(L2)高速缓冲存储器1004也连接到主机总线1002。主机-PCI桥1006连接到主存储器1008,包括高速缓冲存储器和主存储器控制功能,并提供总线控制以处理在PCI总线1010、处理器1000、L2高速缓存1004、主存储器1008,以及主机总线1002之间的传输。主存储器1008连接到主机-PCI桥1006以及主机总线1002。由主机处理器(多个)1000单独使用的设备,如局域网卡1030,连接到PCI总线1010。服务处理器接口和ISA访问通透(pass-through)1012提供PCI总线1010和PCI总线1014之间的接口。这样,将PCI总线1014与PCI总线1010隔离。如闪速存储器1018之类的设备连接到PCI总线1014。在一种实施方式中,闪速存储器1018包括结合了用于多种低级系统功能和系统引导功能的必要的处理器可执行代码的BIOS代码。
PCI总线1014为由主机处理器(多个)1000和服务处理器1016共享的各种设备(包括例如闪速存储器1018)提供了接口。PCI-ISA桥1035提供总线控制来处理PCI总线1014和ISA总线1040、通用串行总线(USB)功能1045、电源管理功能1055之间的传输,并可以包括其他未示出的功能元素,如实时时钟(RTC)、DMA控制、中断支持以及系统管理总线支持。非易失性RAM1020连接到ISA总线1040。服务处理器1016包含用于在初始化步骤期间与处理器(多个)1000通信的JTAG和I2C总线1022。JTAG/I2C总线1022还连接到L2高速缓存1004、主机-PCI桥1006以及主存储器1008,在所述处理器、所述服务处理器、所述L2高速缓存、所述主机-PCI桥,以及所述主存储器之间提供通信路径。服务处理器1016还访问系统电力资源来关闭信息处理设备1001的电源。
外围设备和输入/输出(I/O)设备可以连接到不同接口(例如,连接到ISA总线1040的并行接口1062、串行接口1064、键盘接口1068,以及鼠标接口1070)。可选地,连接到ISA总线1040的超级I/O控制器(未示出)可以容纳多个I/O设备。
为了将计算机系统1001连接到另一个计算机系统以在网络上复制文件,将局域网卡1030连接到PCI总线1010。类似地,为了将计算机系统1001连接到ISP以使用电话线连接连接到因特网,将调制解调器1075连接到串行端口1064以及PCI-ISA桥1035。
虽然图10中说明的计算机系统能够执行此处描述的处理,但是此计算机系统只是计算机系统的一个实例。本领域的技术人员将理解,许多其他计算机系统设计也能够执行此处描述的处理。
虽然图10中说明的信息处理系统能够执行此处描述的处理,但是此设计只是计算机系统设计的一个实例。本领域的技术人员将理解,许多其他计算机系统设计也能够执行此处描述的处理。
本发明的一种优选实施方式是应用,即,可以例如驻留在计算机的随机存取存储器内的代码模块中的一组指令(程序代码)或其他功能描述材料。直到被所述计算机所请求为止,该组指令可以存储在其他计算机存储器中,例如,存储在硬盘驱动器中,或存储在诸如光盘(以最终用于CD ROM中)或软盘(以最终用于软盘驱动器中)之类的可移动存储器中,或通过因特网或其他计算机网络来下载。因此,本发明可以被实现为用于在计算机中使用的计算机程序产品。此外,尽管所描述的各种方法可在由软件有选择地激活或重新配置的通用计算机中方便地实现,但是本领域的技术人员还将认识到,此类方法可以在硬件、固件或在被构造成执行所需的方法步骤的更为专用的装置中实现。功能描述材料是将功能告知机器的信息。功能描述材料包括但不限于,计算机程序、指令、规则、事实、可计算函数的定义、对象以及数据结构。
虽然示出并描述了本发明的特定实施例,但是对本领域的技术人员显而易见的是,根据此处的教导,可以在不偏离本发明及其更广泛的方面的情况下做出更改和修改。因此,所附权利要求旨在在其范围内包含所有在本发明的真实精神和范围之内的此类更改和修改。此外,可以理解,本发明仅由所附权利要求来限定。本领域的技术人员将理解,如果特定数量的引入权利要求要素是预期的,则此意图在该权利要求中将被明确地重申,并且没有此重申则此限制不存在。对于非限定性实例(作为对理解的帮助),以下所附权利要求包含使用引导短语“至少一个”和“一个或多个”来引入权利要求要素。但是,此类短语的使用不应被解释为暗示由不定冠词“a”或“an”引入的权利要求要素将任何包含此类引入权利要求要素的特定权利要求限制为仅包含一个此类要素的发明,即使当同一权利要求包括引导短语“一个或多个”或“至少一个”以及不定冠词“a”或“an”;这同样适用于定冠词在权利要求中的使用。
Claims (22)
1.一种用于模拟软件模块中的条件的计算机实现的方法,所述方法包括:
在所述软件模块中确定模拟环境是否已激活;
遇到所述软件模块中的模拟点,所述模拟点包括一个或多个模拟参数;
响应于确定所述模拟环境已激活且遇到所述模拟点:
调用模拟模块,所述调用包括将所述模拟参数传递给所述模拟模块;
在所述模拟模块处将所述模拟参数与一个或多个活跃模拟表项相比较;以及
将模拟的条件从所述模拟模块返回所述软件模块以响应所述比较。
2.如权利要求1中所述的方法,还包括:
从匹配所述模拟参数的第一活跃模拟表项来检索所述模拟的条件;以及
在检索所述模拟条件后从匹配所述模拟参数的所述第一活跃模拟表项停用所述模拟的条件。
3.如权利要求2中所述的方法,还包括:
从模拟文件读取所述活跃模拟表项,其中所述停用还包括写入与匹配所述模拟参数的所述第一活跃模拟表项对应的停用标志。
4.如权利要求1中所述的方法,还包括:
从模拟文件检索包括在匹配所述模拟参数的第一活跃模拟表项中的外部程序引用;以及
执行与所述外部程序引用对应的外部程序。
5.如权利要求4中所述的方法,还包括:
检索由所述外部程序的执行产生的返回值;以及
将所述返回值作为所述模拟的条件从所述模拟模块提供给所述软件模块。
6.如权利要求1中所述的方法,其中所述遇到的模拟点在所述软件模块的函数中,并且所述模拟参数中的一个参数是与所述函数对应的函数标识符,所述方法还包括:
在所述函数处接收所述模拟的条件,其中所述模拟的条件是模拟的返回码;以及
将所述模拟的返回码返回调用所述函数的代码段。
7.如权利要求1中所述的方法,其中所述遇到的模拟点在所述软件模块的函数中,并且其中所述模拟参数中的一个参数是与所述函数对应的函数标识符,所述方法还包括:
将“未被模拟”代码从所述模拟模块返回所述函数以响应未定位活跃模拟表项来响应所述比较;
在所述函数处接收所述“未被模拟”代码,以及在所述函数处:
执行函数步骤;以及
将由所述函数步骤产生的实际返回码返回调用所述函数的代码段。
8.如权利要求1中所述的方法,其中所述模拟参数中的一个参数是变量标识符,所述方法还包括:
接收所述模拟的条件,其中所述模拟的条件是变量值;以及
将与所述变量标识符对应的变量设置为等于所述变量值。
9.如权利要求1中所述的方法,其中所述模拟参数中的一个参数是变量标识符,所述方法还包括:
接收所述模拟的条件,其中所述模拟的条件指示所述变量标识符未被模拟;以及
使用程序语句来设置与所述变量标识符对应的变量。
10.如权利要求1中所述的方法,其中所述软件模块是已编译的可执行目标模块。
11.如权利要求1中所述的方法,其中所述软件模块不在调试环境中运行。
12.一种用于模拟软件模块中的条件的信息处理系统,所述系统包括:
用于在所述软件模块中确定模拟环境是否已激活的装置;
用于遇到所述软件模块中的模拟点的装置,所述模拟点包括一个或多个模拟参数;
用于响应于确定所述模拟环境已激活且遇到所述模拟点的装置,所述装置被配置为:
调用模拟模块,所述调用包括将所述模拟参数传递给所述模拟模块;
在所述模拟模块处将所述模拟参数与一个或多个活跃模拟表项相比较;以及
将模拟的条件从所述模拟模块返回所述软件模块以响应所述比较。
13.如权利要求12中所述的信息处理系统,其中所述用于响应于确定所述模拟环境已激活且遇到所述模拟点的装置进一步被配置为:
从匹配所述模拟参数的第一活跃模拟表项来检索所述模拟的条件;以及
在检索所述模拟条件后从匹配所述模拟参数的所述第一活跃模拟表项停用所述模拟的条件。
14.如权利要求13中所述的系统,其中所述用于响应于确定所述模拟环境已激活且遇到所述模拟点的装置进一步被配置为:
从模拟文件读取所述活跃模拟表项,其中所述停用还包括写入与匹配所述模拟参数的所述第一活跃模拟表项对应的停用标志。
15.如权利要求12中所述的信息处理系统,其中所述用于响应于确定所述模拟环境已激活且遇到所述模拟点的装置进一步被配置为:
从模拟文件检索包括在匹配所述模拟参数的所述第一活跃模拟表项中的外部程序引用;以及
执行与所述外部程序引用对应的外部程序。
16.如权利要求15中所述的信息处理系统,其中所述用于响应于确定所述模拟环境已激活且遇到所述模拟点的装置进一步被配置为:
检索由所述外部程序的执行产生的返回值;以及
将所述返回值作为所述模拟的条件从所述模拟模块提供给所述软件模块。
17.如权利要求12中所述的信息处理系统,其中所述遇到的模拟点在所述软件模块的函数中,并且所述模拟参数中的一个参数是与所述函数对应的函数标识符,所述用于响应于确定所述模拟环境已激活且遇到所述模拟点的装置进一步被配置为:
在所述函数处接收所述模拟的条件,其中所述模拟的条件是模拟的返回码;以及
将所述模拟的返回码返回调用所述函数的代码段。
18.如权利要求12中所述的信息处理系统,其中所述遇到的模拟点在所述软件模块的函数中,并且其中所述模拟参数中的一个参数是与所述函数对应的函数标识符,所述用于响应于确定所述模拟环境已激活且遇到所述模拟点的装置进一步被配置为:
将“未被模拟”代码从所述模拟模块返回所述函数以响应未定位活跃模拟表项来响应所述比较;
在所述函数处接收所述“未被模拟”代码,以及在所述函数处:
执行函数步骤;以及
将由所述函数步骤产生的实际返回码返回调用所述函数的代码段。
19.如权利要求12中所述的信息处理系统,其中所述模拟参数中的一个参数是变量标识符,所述用于响应于确定所述模拟环境已激活且遇到所述模拟点的装置进一步被配置为:
接收所述模拟的条件,其中所述模拟的条件是变量值;以及
将与所述变量标识符对应的变量设置为等于所述变量值。
20.如权利要求12中所述的信息处理系统,其中所述模拟参数中的一个参数是变量标识符,所述用于响应于确定所述模拟环境已激活且遇到所述模拟点的装置进一步被配置为:
接收所述模拟的条件,其中所述模拟的条件指示所述变量标识符未被模拟;以及
使用程序语句来设置与所述变量标识符对应的变量。
21.如权利要求12中所述的信息处理系统,其中所述软件模块是已编译的可执行目标模块。
22.如权利要求12中所述的信息处理系统,其中所述软件模块不在调试环境中运行。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US11/303,236 US7761282B2 (en) | 2005-12-16 | 2005-12-16 | System and method to simulate conditions and drive control-flow in software |
US11/303,236 | 2005-12-16 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1983211A CN1983211A (zh) | 2007-06-20 |
CN100468358C true CN100468358C (zh) | 2009-03-11 |
Family
ID=38165764
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2006101470230A Expired - Fee Related CN100468358C (zh) | 2005-12-16 | 2006-11-13 | 在软件中模拟条件及驱动控制流的系统和方法 |
Country Status (2)
Country | Link |
---|---|
US (1) | US7761282B2 (zh) |
CN (1) | CN100468358C (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102446113A (zh) * | 2010-10-12 | 2012-05-09 | 无锡江南计算技术研究所 | 底层消息接口模拟方法及模拟装置 |
Families Citing this family (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070113219A1 (en) * | 2005-11-17 | 2007-05-17 | Microsoft Corporation | Representing simulation values of variable in sharpley limited time and space |
US8087007B2 (en) * | 2006-05-08 | 2011-12-27 | Assima Ltd. | System and method for software prototype-development and validation and for automatic software simulation re-grabbing |
JP2008070962A (ja) * | 2006-09-12 | 2008-03-27 | Matsushita Electric Ind Co Ltd | 論理回路検証装置 |
US8510719B2 (en) * | 2009-11-05 | 2013-08-13 | International Business Machines Corporation | Real-time user configurable debugging framework |
US8276021B2 (en) * | 2009-12-18 | 2012-09-25 | Microsoft Corporation | Concurrency test effectiveness via mutation testing and dynamic lock elision |
CA2738422C (en) * | 2011-04-28 | 2018-11-20 | Ibm Canada Limited-Ibm Canada Limitee | Examining concurrent system states |
US20140067359A1 (en) * | 2012-09-04 | 2014-03-06 | Red Hat, Inc. | Automated iterative error simulation |
US9262304B2 (en) * | 2013-09-05 | 2016-02-16 | Google Inc. | Methods and systems for testing interactions between mobile applications |
US10452797B2 (en) * | 2013-12-06 | 2019-10-22 | Synopsys, Inc. | Fault insertion for system verification |
US11200154B2 (en) * | 2019-03-11 | 2021-12-14 | International Business Machines Corporation | Function modification for software application testing |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
DE69415593T2 (de) * | 1993-06-30 | 1999-05-20 | Microsoft Corp | Verfahren zur Überprüfung eines nachrichtengesteuerten Betriebssystems |
US5774725A (en) * | 1996-06-28 | 1998-06-30 | Microsoft Corporation | Method and computer program product for simplifying construction of a program for testing computer software subroutines in an application programming interface |
US5854930A (en) * | 1996-12-30 | 1998-12-29 | Mci Communications Corporations | System, method, and computer program product for script processing |
US6014513A (en) | 1997-12-23 | 2000-01-11 | University Of Washington | Discovering code and data in a binary executable program |
US7124402B2 (en) | 2002-12-30 | 2006-10-17 | International Business Machines Corporation | Testing software module responsiveness to string input tokens having lengths which span a range of integral values |
US7730461B2 (en) | 2002-12-30 | 2010-06-01 | International Business Machines Corporation | Software tool configured to generate test cases characterized by a linear range of integral values |
US7340661B2 (en) * | 2003-09-25 | 2008-03-04 | Hitachi Global Storage Technologies Netherlands B.V. | Computer program product for performing testing of a simulated storage device within a testing simulation environment |
-
2005
- 2005-12-16 US US11/303,236 patent/US7761282B2/en not_active Expired - Fee Related
-
2006
- 2006-11-13 CN CNB2006101470230A patent/CN100468358C/zh not_active Expired - Fee Related
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102446113A (zh) * | 2010-10-12 | 2012-05-09 | 无锡江南计算技术研究所 | 底层消息接口模拟方法及模拟装置 |
CN102446113B (zh) * | 2010-10-12 | 2014-02-26 | 无锡江南计算技术研究所 | 底层消息接口模拟方法及模拟装置 |
Also Published As
Publication number | Publication date |
---|---|
US7761282B2 (en) | 2010-07-20 |
CN1983211A (zh) | 2007-06-20 |
US20070143093A1 (en) | 2007-06-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN100468358C (zh) | 在软件中模拟条件及驱动控制流的系统和方法 | |
Seo et al. | Programmers' build errors: a case study (at google) | |
US20060041864A1 (en) | Error estimation and tracking tool for testing of code | |
US20030046029A1 (en) | Method for merging white box and black box testing | |
US8341594B1 (en) | Version control in modeling environments | |
US20080320071A1 (en) | Method, apparatus and program product for creating a test framework for testing operating system components in a cluster system | |
GB2508643A (en) | Method for Performing a Regression Test after Modifying Source Code File | |
US7546585B2 (en) | Method, system and computer program product for testing computer programs | |
US7908596B2 (en) | Automatic inspection of compiled code | |
Schneid et al. | Static analysis of BPMN-based process-driven applications | |
Küster et al. | Incremental development of model transformation chains using automated testing | |
Ichii et al. | A rule-based automated approach for extracting models from source code | |
Jenkins | A software testing primer | |
Lewis et al. | Runtime repair of software faults using event-driven monitoring | |
CN112162921B (zh) | 一种工业自动化测试与控制系统 | |
CN111930398A (zh) | 应用程序更新方法、装置、系统、介质及设备 | |
Talby et al. | A process-complete automatic acceptance testing framework | |
Emamdoost et al. | Binary mutation analysis of tests using reassembleable disassembly | |
Dahlweid et al. | Model-based testing: automatic generation of test cases, test data and test procedures from SysML models | |
Kovalev et al. | On the problem of predicting meantime between failures on the basis of data from automated testing of on-board software components | |
Örgård et al. | Mutation Testing in Continuous Integration: An Exploratory Industrial Case Study | |
Федоровская | Automated testing system at an enterprise engaged in the development and implementation of automated production management systems | |
Kim | Hybrid model based testing for mobile applications | |
Witte | Test Levels | |
Qazi et al. | Model driven architecture with encapsulated quality check and enhancement feature |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20090311 Termination date: 20151113 |
|
EXPY | Termination of patent right or utility model |