专利名称::图形用户接口应用比较器的制作方法
技术领域:
:本公开内容涉及测试脚本的分析和生成,该测试脚本用于测试图形用户接口应用,并且尤其涉及为了与新的应用版本一起使用而变换先前的测试脚本。
背景技术:
:进步技术的持续前进已经使计算机软件应用复杂化,从而有助于日常生活的几乎每方面的自动化。如今的应用存在以辅助撰写小说、申报所得税、分析婴儿名字的历史趋势。这些应用的一个几乎普遍存在的特征在于,他们采用了图形用户接口(GUI)。另一个几乎普遍存在的方面在于,GUI应用(GAP)需要在发布之前进行彻底测试。然而,在过去,对应用实现GUI要比彻底测试GAP容易。对于任何非常复杂的GAP来说,GUI元素的排列和组合使得潜在命令和命令序列的大量字段可能具有其严重程度从无关紧要到关键故障的任何缺陷(bug)。使该问题加剧的是,应用开发者在压力下连续添加新特征、更新GUI并且发布应用的新版本。结果,即使针对GAP之前版本的测试脚本是充分的,原始的测试脚本也几乎不可能充分测试后续ff改的应用。人工测试大规模企业GAP是乏味的、易出错的以及费力的。重要的GAP包含依次包含数千个GUI对象的数百个GUI屏幕。为了自动测试GAP,测试工程师4吏用脚本i吾言(例如,JavaScript和VBScript)编写程序,并且这些测试脚本通过模仿经由对GAP的GUI对象执行动作来与这些GAP进行交互的用户,从而借助不同的状态来驱动GAP。通常,测试脚本仿真GPA的用户以及他们访问和操纵这些GAP的GUI对象的声明。例如,声明如下VbWindow("Login"(登入)).VbEdit("txtAgentsName,,).Set"Shawn"定位其标题为登入的窗口并且通过基于Visual-Basic的控制创建该窗口,然后定位其名称为txtAgentsName的文本框,该文本框是其父亲为登入窗口的GUI对象。通过调用具有参数"Shawn"的方法集,文本框的值设置为"Shawn"。诸如QTP和RationalRobot的商业工具有助于通过跟踪GUI对象上的光标指示以及执行期望的动作生成测试脚本。这些工具生成可以重放所捕获用户动作的脚本代码。生成的代码充当用于创建脚本以使脚本测试自动化的框架。测试工程师将代码添加到生成的脚本上,使得这些脚本可以使用不同的输入值来重放,从而实现GAP的功能。利用人工编写的代码扩展测试脚本来自动进行测试使得测试脚本更加复杂、很难理解、维护以及演进。尽管事先已知测试脚本访问并且操纵GUI元素,但是不清楚在编译时如何检测导致运行时错误的操作。使用通过测试平台导出的API调用继续作为访问和操纵GAP的GUI对象的主要模式,并且这些API调用导致测试脚本中的各种运行时错误。例如,测试人员可能错误使用测试脚本源代码中的平台API调用,从而访问了并非意在访问的GUI元素。检查由第三方API调用引起的潜在瑕疵是困难的技术挑战,该潜在瑕疯导致不正确的测试和测试脚本中的运行时错误。而且,使用API调用来访问以及操纵GUI对象存在根本问题。第一,API调用采用GUI对象的名称和属性值作为可用的字符串输入参数。这些输入参数的值通常仅在运行时已知,这使得不可能应用有效彻底的检查算法。第二,测试平台导出许多不同的API调用,并且这些API调用的高度复杂性使得程序员很难理解使用哪个API调用以及如何组合它们以访问并操作GUI对象。这些问题导致测试脚本中的大量缺陷,很多缺陷在检测测试脚本源代码期间很难检测。由于应用需求规范包括描述GAP(特别是其GUI对象)的高级概念,所以出现了其他问题。不幸地是,将GAP的GUI对象回溯到这些高级概念是个难题,因为程序员并不记录这些轨迹。因而,当测试人员创建GAP时,他们花费相当多的时间通过阅读文档并且与主题专家交谈来理解如何使用这些GAP。在将测试人员重新分配到其他任务或测试人员退出公司之后,常常会丧失这种关键的知识。现有的创建测试脚本方法的一个可感知的益处是不需要类型检查,因为脚本代码是直接从GUI生成的。例如,如果给出GAP中的特定GUI对象,测试工具可以产生对应的声明,其导航至具有描述其性质的字符串参数、使用API调用的这些对象。然而,事实上,该可察觉的益处引起了困难的技术挑战,因为测试脚本和GAP之间的语义不一致。假设,例如,在维护阶段,GAP的GUI改变了。脚试结果,因为其代码试图访问改变的或不再存在的GUI对象。因此,需要具有支持分析和演进逻辑的测试脚本生成架构,其解决了上述问题和其他之前遇到的问题。
发明内容测试脚本变换架构生成针对具有随时间改变的图形用户接口的应用的准确的测试脚本。由于应用改变,z使得之前的测试脚本无法工作。该架构便于新测试脚本的自动生成,以可靠地测试后续应用版本,并且可以极大地降低达到新测试脚本的时间、成本和资源支出。测试脚本变换架构("架构")可以包括图形用户接口(GUI)类型模型和GUI模型构建器(builder)逻辑。GUI模型构建器逻辑接受作为输入的GUI类型模型、当前GAP版本以及后续的GAP版本。GUI模型构建器逻辑生成作为输出的当前GAPGUI模型以及后续的GAPGUI模型。此外,该架构包括GUI比较器逻辑。该GUI比较器逻辑接受作为输入的当前GAPGUI模型以及后续的GAPGUI模型,并且生成作为输出的GUI差异模型。该GUI差异模型包括GUI元素差异条目,其标识在当前GAP版本和后续GAP版本之间匹配、但是在当前GAP版本和后续GAP版本之间在特征中有所不同的特定GUI元素。该架构进一步包括脚本分析器。基于当前测试脚本的抽象语法树表示,该脚本分析器生成改变向导、经变换的测试脚本或这两者。改变向导可以包括,例如,为了根据后续GAP版本使用而变换当前测试脚本的脚本变换信息。经变换的测试脚本(为了根据后续的GAP版本使用)可以包括,例如,当前测试脚本中的从当前测试脚本条目生成的修改的脚本条目。在查看了以下附图和详细描述后,其他系统、方法、特征和优势对于本领域的技术人员将显而易见。所有此类附加的系统、方法、特征和优势包括在本描述内、包括在所要求的主题的范围内并且由以下权利要求书所保护。参考以下附图和描述可以更好地理解该系统。附图中的元素不需要按比例绘制,而是将重点放在对系统原理的说明。在附图中,同样的参考数字表示遍及不同视图中的对应部分。图1示出了测试脚本变换架构。图2示出了该测试脚本变换架枸执行的处理的流程图。图3示出了GUI元素定型(typing)系统。图4示出了GUI元素类型映射。图5示出了GUI元素类型映射用户接口。图6示出了GUI元素定型逻辑的流程图。图7示出了GUI元素映射系统。图8示出了GUI元素版本映射。图9示出了GUI元素版本映射用户接口。图IO示出了GUI元素版本映射逻辑的流程图。图11示出了GUI元素定型和映射系统。图12示出了元数据演进工具架构。图13示出了元数据库架构。图14示出了符号消息的示例。图15示出了元数据处理的流程图。图16示出了类型处理的流程图。图17示出了映射处理的流程图的第一部分。图18示出了映射处理的流程图的第二部分。图19示出了符号处理的流程图。图20示出了元数据移植处理的流程图。图21示出了元数据移植处理的流程图。图22示出了元数据移植处理的流程图。图23示出了GAP比较器系统。图24示出了为分析提供作为模型的GAP表示的当前GAPGUI模型的一部分。图25示出了为分析提供作为模型的GAP表示的后续GAPGUI模型的一部分。图26示出了GUI差异模型的一部分。图27示出了GUI模型构建器逻辑的流程图。图28示出了GAP比较逻辑的流程图。图29示出了显示和GUI比较器阈值接口。图30示出了响应于比较器阈值滑块而高亮显示的GUI元素。图31示出了可视逻辑的流程图。图32示出了双向仿真性质的示例。图33示出了当前GAP版本的GUI。图34示出了后续GAP版本的GUI。图35示出了当前和后续GAP比较。图36示出了GUI元素差异条目。图37示出了当前测试脚本。图38示出了当前测试脚本表示。图39示出了示例脚本分析器系统。图40示出了从对象库(OR)获取GUI对象条目性质的流程图。图41示出了标识对应于GUI对象条目的GUI差异条目的流程图42示出了经变换的测试脚本。图43示出了改变向导。图44示出了输出经变换的测试脚本声明的流程图。图45示出了另一个GUI元素差异条目。图46示出了另一示例GUI元素差异条目。图47示出了从源到目标对象的导航路径。图48示出了输出GAP改变说明符的流程图。图49示出了具有经济成本引擎架构的测试脚本变换分析图50示出了当前测试脚本。图51示出了当前测试脚本表示。图52示出了示例经济成本引擎系统。图53示出了标识对应于GUI对象条目的GUI差异条目的流程图图54示出了经变换的测试脚本。图55示出了生成综合GAP改变说明符的流程图。图56示出了基于GUI差异模型输出测试脚本变换成本报告的流程图。具体实施例方式图1示出了测试脚本变换架构100("架构100")。架构100包括多个系统,包括GUI元素定型和映射系统102、元数据移植和库系统104、以及GUI应用(GAP)比较器系统106。架构100还包括测试脚本分析系统108和测试脚本经济分析系统110。GUI元素定型和映射系统102("系统102")。系统102便于对GAP中的GUI元素应用形式化类型^^莫型,以及建立从GAP的一个版本到另一个版本的GUI元素之间的关系。系统102包括处理器112、存储器114和GUI元素数据库("库")116。系统102与架构100中的其他系统104、106、108和IIO通过通信逻辑118交换信息。存储器114保存GUI定型和映射逻辑120和参考GUI类型模型122。库116存储图形用户接口应用(GAP)GUI元素映射("映射")124。库116还存储当前GAP版本GUI类型模型126和后续GAP版本GUI类型模型128。系统102传送GUI元素类型指定消息和GUI元素映射指定消息到元数据移植和库系统104("系统104")。系统104便于对于GAP有用的元数据永久保存,尤其对于版本间的GAP演进。系统104包括处理器129、保存元数据处理逻辑123和数据库管理系统的存储器130、以及通信逻辑136。系统104还包括元数据库138。元数据库138维持GUI元素元数据140,诸如GUI元素标识符142、GUI元素符号144、GUI元素类型146和GUI元素映射148。系统104可以将GUI元素元数据140传送到其他系统102、106、108和110,以便在执行其逻辑时辅助其他系统102、106、108和110。GAP比较器系统106("系统106")分析当前GAP版本150和后续GAP版本152,以确定版本150和152之间的GUI元素差异。最后,系统106可以包括GUI模型构建器逻辑154,其接受作为输入的当前GAP版本150和后续GAP版本152。GUI模型构建器逻辑154生成当前GAP版本150的GUI元素模型156和后续GAP版本152的GUI元素模型158。模型156和158可以是树状模型或其他类型的表示。GUI比较器160处理表示156和158。得到GUI差异模型162。GUI差异模型162包括GUI元素差异条目,该条目标识在当前GAP版本和后续GAP版本之间匹配、但是在当前GAP版本和后续GAP版本之间特征不同的特定GUI元素。例如,差异条目可以标识当前GAP版本中的文本框匹配于后续GAP版本中的下拉列表,并且可以记录两个版本之间的不同GUI元素特征。测试脚本分析系统108("系统108")提供具有改变向导引擎的测试脚本变换分析器。特别地,系统108以当前测试脚本164开始并且启动脚本解析器166的执行,以获取当前测试脚本164的抽象语法树表示168("AST168")。当前测试脚本164可以适用于测试当前GAP版本150中任意数量的功能。系统108帮助将当前测试脚本164变换为经变换的测试脚本,经变换的测试脚本适用于测试后续GAP版本152中任意数量的功能。脚本分析器170通过通信逻辑190接受AST168、GUI差异模型162和GUI元素元数据140。对象库查找逻辑172从对象库174获取对象数据,作为对分析GUI差异模型162的辅助。作为其分析的结果,脚本分析器170生成经变换的测试脚本178、改变向导180或两者。分析可以考虑改变向导消息库192和GUI元素脚本改变MJ'J194。系统108的其他方面是约束满足引擎188。结合从系统104获取的GUI元素类型信息,约束满足引擎确定脚本声明与分配给任何给定的GUI元素的GUI元素类型是否兼容。测试脚本经济分析系统110("系统110")提供具有经济成本引擎的测试脚本变换分析器。系统110包括经济引擎182,其参考经济模型176来生成成本报告186。经济模型176可以被预定义为测试脚本变换成本关系的经济模型。成本报告186可以包括测试脚本变换成本信息,例如,用于将当前测试脚本164变换为经变换的测试脚本178的估计成本。成本报告186可以基于改变向导180(特别是输入GAP改变说明符184或其他信息)的分析。图2示出了测试脚本变换架构IOO执行的处理的流程图200。系统102生成可以包括GUI元素版本映射的GUI元素映射指定消息,以及可以包括GUI元素类型标识符的类型指定消息(202)。该系统102将消息传送到系统104(204),系统104接收该消息。系统104响应地在元数据库138中维护GUI元素元数据(206)。系统106启动GUI比较器逻辑的执行(208)。GUI比较器逻辑160接受作为输入的用于当前GAP版本150的当前GAPGUI模型156和用于后续GAP版本152的后续GAPGUI模型158(210)。GUI比较器逻辑160可以进一步从系统102或104接受作为输入的GUI元素映射。作为输出,GUI比较器逻辑160产生包括GUI元素差异条目的GUI差异模型162,其中GUI元素差异条目标识在当前GAP版本150和后续GAP版本152之间匹配、但是在当前GAP版本150和后续GAP版本152之间特征不同的特定GUI元素。测试脚本分析系统108启动脚本分析器170的执行(214)。脚本分析器170接受作为输入的GUI差异模型162和当前测试脚本164的AST168。脚本分析器170可以生成改变向导180,其包括为了针对后续GAP版本152使用而用于变换当前测试脚本164的变换信息(216)。附加地或可替换地,脚本分析器170可以生成经变换的测试脚本178,以便针对后续GAP版本152来使用(218)。经变换的测试脚本178包括从当前测试脚本包括从当前测试脚本中的当前测试脚本条目生成的经变换的脚本条目。而且,经济分析系统110可以启动经济引擎182的执行(220),该经济引擎182可用于分析改变向导180。系统IOO考虑定义在经济模型176中的测试脚本变换成本关系。结果是包括测试脚本变换成本信息的成本报告168(222)。图1示出了图形用户接口(GUI)元素定型和映射系统("系统")102。系统102包括处理器112、存储器114和GUI元素数据库("库")116。系统102通过通信逻辑118与其他系统交换信息。通信逻辑118可以是有线/无线接口、进程间通信机制、共享的存储器、Web服务接口或任何类型的通信接口。存储器114保持GUI定型和映射逻辑120以及参考GUI类型模型122。将在下面更详细地描述,GUI定型和映射逻辑120帮助GAP设计者为GAP的独立GAP元素指定GUI元素类型。GUI定型和映射逻辑120还帮助GAP设计者定义从当前GAP版本中GUI元素到后续GAP版本中的GUI元素的链接。可以将类型和映射信息通过通信逻辑118提供给其他GAP分析系统,诸如测试脚本分析系统和元数据库。系统102可以对任何特定的GUI元素进行操作。GUI元素的示例包括文本框、菜单、菜单项、单选按钮、复选框和命令按钮。其他示例包括列表框、复合框、双态按钮、旋转按钮、滚动条、标签、工具条、工具窗(widget)、图像、窗口、日历和属性页条。参考GUI类型模型122可以建立对于独立GUI元素共同的类型名称(例如,标识符)和性质的规范化集合,其将相同类型的GUI元素区分为同一类的成员。与为独立GUI元素指定类型相结合,GUI类型模型122有助于提供易处理的语法技术,用于建立不展现特定行为(例如,在文本框中存储字母字符意味着保存社会安全号码)的GUI,这与GUI元素的自由形式独立注释相反。库116存储图形用户接口应用(GAP)GUI元素映射("映射")124。库116还存储当前GAP版本GUI类型模型126和后续GAP版本GUI类型模型128。系统102可以响应于操作者输入从任何当前GAP版本到任何后续GAP版本的链接GUI元素而准备映射124。因此,例如,如果文本框改变为下拉列表,则操作者可以通过明确地将两个GUI元素链接到一起来记录该改变。作为响应,系统102准备元素版本映射并且将元素版本映射存储在库116中。类似地,系统102可以构建从操作者指定的GUI元素类型分配到当前GAP版本和后续GAP版本中的特定GUI元素的类型模型126和128。最后,系统102可以提示操作者从参考GUI类型模型122所建立的GUI元素类型列表中进行选择。每个类型模型126和128可以包括针对当前GAP和后续GAP中的一个或多个元素的元素类型说明符。系统102可以使用显示器121与操作者交互,并且还可以接受命令行、脚本、批处理文件和其他类型的输入。图3示出了系统102的实现。图3示出了通信逻辑118可以通过一个或多个网络304的连接来与元数据库202交换信息。作为示例,系统102可以向元数据库202传送GUI元素类型指定消息和GUI元素映射指定消息。参考GUI类型模型122的其他细节在图3中示出。参考GUI类型模型122包括GUI类型模型条目(例如,GUI类型模型条目306和308)。GUI类型模型条目形式化定义用于GUI的类型系统,并且可以提供预建立的标识符的有限集用于标记GUI元素。每个GUI类型模型条目可以指定GUI元素类型说明符310、GUI元素修改约束312和GUI元素内容约束314。在其他实现中,参考GUI类型模型122可以包括更多的、不同或更少的信息。GUI元素类型说明符建立标识符(例如,唯一的字符串或数字),该标识符可以分配给GUI元素以指定GUI元素的GUI元素类型。GUI元素修改约束312指定可以是否以及如何修改指定类型的GUI元素。类似地,GUI元素内容和格式约束314指定可以保存指定类型的GUI元素的什么内容,以及可以如何格式化内容或GUI元素本身。约束312和314可以按照很多方式来表示,诸如通过对给定类型的GUI元素专用的期望的行为或约束的规则。GUI元素类型的示例在下面表1中给出。表1<table>tableseeoriginaldocumentpage16</column></row><table>在表1中,SSNEntryBox说明符例如可以附于GAP中的GUI元素(例如,文本框),其意在成为社会安全号码的条目。SSNEntryBox类型对可以对文本框执行的修改没有设置约束。然而,SSNEntryBox类型约束文本框的内容为九个数字,或3个数字之后为破折号、然后是2个数字、破折号、后面是4个数字。SSNDisplayBox类型指定类似的约束,但是也使得的GUI元素只读。StaticWindowLabel类型提供用于所附GUI元素的只读标签。该标签可以是介于0到50个之间的字母数字字符。因为StaticWindowLabel是只读类型的GUI元素,所以该标签不可以改变。3DButton类型限制前景颜色,该前景颜色可以针对GUI元素设置为介于FStart和FEnd之间。类似地,3DButton类型限制背景颜色,该背景颜色可以针对GUI元素设置为介于BStart和BEnd之间。HelpTextEntryBox约束附着的GUI元素的X和Y位置,并且进一步约束用于GUI元素中的文本的字体大小为介于10到16点之间。MenuWidget类型可以应用于图像按钮元素,例如来建立作为菜单条的工具窗的元素。MenuWidget类型固定GUI元素的X和Y位置,并且进一步建立最小尺寸SMin和最大尺寸SMax。US-StateTextBox限制GUI元素的内容为仅是美国的州的名称(例如,"阿拉斯加州、缅因州、内华达州...")。系统102可以实现可用于帮助设计者创建GAP的任何形式的GUI类型模型122。GUI类型模型可以根据所设计的GAP类型而变化,并且系统可以从用于所分析GAP的多个GUI类型模型122中选择哪个GUI类型模型可用,或可以接受操作者输入以选择哪个GUI类型模型是可用的。例如,在构建药房GAP时,操作者可以指定健康保障GUI类型模型,并且在构建在线角色扮演游戏的用户接口时指定视频游戏GUI类型模型。健康保障GUI类型模型可以包括可用于构建健康保障相关GAP的元素类型,诸如SSNEntryBox类型,而视频游戏GUI类型模型可以包括可用于构建用户接口的元素类型,i者:^3DButton。图3还示出了系统102包括驻留在存储器114中的GUI元素定型逻辑("类型映射逻辑")316。类型映射逻辑316可以包括在GUI定型和映射逻辑120中,但是也可以是独立模块或以其他方式实现。如在下面详细描述的,类型映射逻辑316可以包括元素选择逻辑318、类型获取逻辑320和类型选择逻辑322。定型逻辑316可以进一步包括类型关联逻辑324和消息创建逻辑326。类型映射逻辑316生成GUI元素类型映射(例如,类型映射328)。暂时转向图4,其示出了GUI元素类型映射400的示例。类型映射400包括GAP别名(alias)402、GUI元素标识符404和GUI类型标识符406。更多、更少的或不同的字段可以包括在类型映射400中。GAP别名402为包括应用了某个类型的GUI元素的GAP指定标识符。GAP别名402可以是在GAP(包括同一GAP的当前GAP版本和后续GAP版本)之间进行区分的唯一的标识符。GUI元素标识符404为被定型的GUI元素提供唯一的标识符。GUI类型标识符406指定分配给GUI元素的GUI元素类型(例如,SSNEntryBox)。图4还示出了GUI类型映射408和410的两个示例。类型映射408是窗口GUI元素的映射。GAP别名412是"UniversitydirectoryO(大学目录0)",表示大学目录GAP的当前版本。定型的GUI元素具有由HWND标识符注解的以及例如由如下描述的可访问层建立的唯一的元素标识符414"0x30fb0"。用于窗口GUI元素的GUI类型标识符416是"US-StateTextBox"。类型映射410是菜单项GUI元素的映射。GAP别名418是"Universitydirectoryl",表示大学目录GAP的后续版本。定型的GUI元素具有如由名称字段指定的唯一元素标识符420"OpenFile(打开文件),,。窗口GUI元素的GUI类型标识符422是"FileOpen(文件打开)"。图4还示出了GUI元素类型指定消息424的示例。GUI元素类型指定消息424可以包括GUI元素类型指定消息开始符426和GUI元素类型指定消息结束符428。开始符426和结束符428表示消息内的数据指定GUI元素的类型映射。最后,GUI元素类型指定消息424可以进一步包括GAP别名430、GUI元素标识符432和GUI类型标识符434。图5示出了用于定型逻辑316的GAP500和示例用户接口502。操作者例如使用鼠标光标选择GUI元素。当选择时,映射逻辑316高亮显示所选择的GUI元素。在图4中示出的示例中,选择的GUI元素是文本框504。响应于选择GUI元素,定型逻辑316显示类型请求符506。类型请求符506提供下拉列表508,其列出了在参考GUI类型模型122中定义的可用GUI元素类型。操作者选择元素类型以分配给选择的GUI元素504,在该情况下是"US画StateTextBox"。点击"OK"按钮指示定型逻辑316创建到文本框504的US-StateTextBox类型的映射。点击"Cancel(取消)"指示定型逻辑316不采取动作。图6示出了定型逻辑316执行的处理的流程图600。定型逻辑316监视操作者输入(602)。特别地,定型逻辑316使用操作者输入来确定选择的参考GUI类型模型和操作者将要定型的GAP(604)。例如,操作者可以从可用的参考GUI类型列表中选择可应用的参考GUI类型模型,并且可以从已知的GAP列表中指定实现GAP的可执行程序。类型获取逻辑320从选择的参考GUI类型模型中获取GUI元素类型选择列表(606)。继续在上文表l中给出的示例,类型获取逻辑320从参考GUI类型模型获取列表(SSNEntryBox、SSNDsiplayBox、StaticWindowLabel、3DB幽n、HelpTextEntryBox、MenuWidget和US-StateTextBox}。该列表包含操作者可以分配给任何给定GUI元素的可允许GUI元素类型。定型逻辑316还可以显示选定的GAP(608)。在一个实现中,定型逻辑316启动GAP的执行。元素选择逻辑318继而监视操作者输入(610)。具体地,元素选择逻辑318监视鼠标点击、键盘输入或其他输入以确定所选择的GUI元素(612)。元素选择逻辑318高亮显示选定的GUI元素(614)。作为示例,元素选择逻辑318可以在元素周围绘制边沿,改变元素颜色、对元素进行闪烁或高亮显示选择的GUI元素。类型选择逻辑322显示GUI元素类型选择列表(616)。例如,类型选择逻辑322可以显示类型请求符506。类型选择逻辑322监视操作者输入(618),诸如来自于GUI元素类型选择列表的元素类型的下拉列表选择。特别地,类型选择逻辑322获取GUI元素类型选择,该选择从显示的GUI元素类型选择列表中指定选择的GUI元素类型(620)。如果操作者接受选择,类型关联逻辑324创建GUI元素类型映射(622)。特别地,类型关联逻辑324创建将选定的GUI元素类型链接到选定的GUI元素的映射。最后,类型关联逻辑324可以创建与库124中的选定GAP相对应的GUI类型模型中的映射条目,其根据操作者选择的元素类型来指定GAP别名字段、选定GUI元素的GUI元素标识符404和GUI类型标识符406。图4给出了GUI元素类型映射的示例。此外,定型逻辑316可以将GUI元素类型映射传送到外部系统。为此,消息创建逻辑326可以构建GUI元素类型指定消息(624)。类型指定消息可以包括映射、类型指定消息开始符和类型指定消息结束符。消息创建逻辑326还可以将GUI元素类型指定消息传送到元数据库202(626)。图7示出了系统102的示例,在系统102中,GUI元素版本映射逻辑("版本映射逻辑")702驻留在存储器114中。版本映射逻辑702可以包括在GUI定型和映射逻辑120中,但是也可以是独立模块或以其他方式实现。版本映射逻辑702可以包括元素选择逻辑704、映射创建逻辑706和消息创建逻辑708。版本映射逻辑702生成GUI元素版本映射(例如,版本映射710)。图8示出了GUI元素版本映射("版本映射")802的示例。版本映射802包括源GAP别名804、源GUI元素标识符806、目标GAP别名808和目标GUI元素标识符810。更多的、更少的或不同的字段可以包括在版本映射802中。源GAP别名804指定包括第一选定GUI元素的GAP("源GAP")的标识符,而目标GAP别名808指定包括应该被链接到第一选定GUI元素的第二选定GUI元素的GAP("目标GAP")标识符。GAP别名804和808可以是在GAP之间进行区分的唯一标识符,诸如区分当前GAP版本和后续GAP版本的标识符。源GUI元素标识符806为源GAP中的选定GUI元素提供唯一的标识符,而目标GUI元素标识符810为目标GAP中的选定GUI元素提供唯一的标识符。图8还示出了版本映射812的具体示例。元素映射812指定了"UniversityDirectoryl"的源GAP别名814,表示大学目录GAP的后续版本。被映射的源GUI元素(例如,复合框)具有由"HWND"标签标记的唯一元素标识符816"0x30fc8"。元素映射812还指定目标GAP别名818为"UniversityDirectoryO",表示大学目录GAP的当前版本。被映射的目标GUI元素(例如,下拉列表框)具有由"HWND"标签标记的唯一元素标识符820"0x30fc0"。因此,版本映射812建立GAP的后续版本中的特定下拉列表框,其对应于当前GAP版本中的特定复合框。图8还示出了GUI元素映射指定消息822的示例。GUI元素映射指定消息822可以包括GUI元素映射指定消息的开始符824和GUI元素映射指定消息的结束符826。开始符824和结束符826表示消息内的数据指定不同GPA中的GUI元素之间的元素映射。最后,GUI元素类型指定消息822可以进一步包括GAP别名828、源GUI元素标识符830、目标GAP别名832和目标GUI元素标识符834。对GUI元素版本映射802的可选扩展是置信度字段811。置信度字段811可以指定GUI元素版本映射的可靠度。当版本映射源自人类操作者的努力时,例如,映射逻辑702可以将置信度设置得相对高(例如,90-100%)。当版本映射源自自动分析,则版本映射逻辑702可以将置信度设置在特定水平(例如,用于自动匹配的预定义水平),或可以设置取决于自动分析强度的阈值。例如,自动分析可以针对将一个GUI元素与另一个GUI元素进行匹配的任何给定尝试来确定规格化分数。置信度字段811继而可以指定规格化分数。置信度字段811可以进一步指定置信度为何设置为任何特定值。而且,说明字段(例如,诸如字符"M"或"A")可以包括在置信度字段8U中以表示源自人工或自动分析的置信度。一个示例是,置信度821设置为"88A"以表示自动分析以及规格化分数是88,而置信度836示出了置信值为100而没有指定说明。图9示出了当前GAP版本902和后续GAP版本904,以及用于映射逻辑702的示例映射用户接口906。GAP902和904两者都示为在显示器121上执行以及显示它们的GUI。操作者例如使用鼠标光标、键盘输入或其他输入来选择GUI元素。在选择时,映射逻辑702高亮显示选定的GUI元素。在图9中示出的示例中,在当前GAP版本902中选定的GUI元素是列表框卯8。在后续GAP版本904中选定的GUI元素是下拉列表910。在选择每个GAP中的元素时,映射逻辑702显示映射用户接口906。点击"OK"按钮指示映射逻辑702在列表框908和下拉列表910之间创建元素映射。点击"取消"指示映射逻辑702不采取动作。图10示出了映射逻辑702执行的处理的流程图1000。映射逻辑702监视操作者的输入(1002),从而确定第一GAP(1004)(例如,当前GAP版本)和第二GAP(1006)(例如,后续GAP版本),操作者将在第一GAP和第二GAP之间映射个体GUI元素。例如,操作者可以从文件选择窗口选择用于GAP的可执行程序文件以选择两个GAP。映射逻辑702显示选定GAP的GUI(例如,通过执行GAP)(1008)。然后,元素选择逻辑704监视操作者输入(1010)。特别地,元素选择逻辑704检测鼠标、键盘和其他类型的输入,以确定操作者何时选定GAP中的GUI元素(1012)。元素选择逻辑704高亮显示每个选定的GUI元素(1014)。当已经从每个GAP中选择了GUI元素,则元素选择逻辑704显示GUI元素映射用户接口(1016)。如果操作者点击"取消",则映射逻辑702不需要采取任何动作,但是可以继续观察其他的GUI元素选择。如果操作者点击"OK",则映射创建逻辑706创建GUI元素版本映射,其指明选定GUI元素之间存在某种关系(1018)。为此,映射创建逻辑706可以存储源GAP别名、对应于源GAP中选定GUI元素的源GUI元素标识符、目标GAP别名和对应于目标GAP中选定GUI元素的目标GUI元素标识符。此外,消息创建逻辑708可以构建GUI元素映射指定消息(1020)。为此,消息创建逻辑708可以存储GUI元素映射指定消息开始符和GUI元素映射指定消息结束符。开始符和结束符表示消息内的数据在不同GAP中的GUI元素之间指定GUI元素映射。GUI元素类型指定消息可以进一步包括源GAP别名、源GUI元素标识符、目标GAP别名和目标GUI元素标识符。消息创建逻辑708继而可以将GUI元素映射指定消息传送到其他系统,诸如元数据库(1022)。图11示出了GUI元素定型和映射系统("系统")IIOO的示例实现。系统1100包括存储器114中的驱动器逻辑1102以及访问GAP表1106的代理1104。在图ll中,当前GAP版本1108被示出为利用钩子1110执行,并且后续GAP版本1112也被示出为利用钩子1114执行。代理1104包括将钩子1110和1114插入GAP1108和1112的进程空间中的逻辑。代理1104与钩子1110和1114通信。特别地,代理1104可以与钩子1110和1114交换消息,以获耳又GAP1108和1112中任何或所有GUI元素的状态。钩子1110和1114是这样的程序,其响应于来自代理1104的消息,并且可以通过可访问层进行交互以发现并且向代理才艮告关于GAP1108和1112中GUI元素的信息。操作系统通常提供可访问层。可访问层显露可访问接口,通过该接口,代理1104以及钩子1110和1114可以调用方法,并且^殳置以及获取GUI元素值和特征,并且从而选择、高亮显示、控制、修改、分配标识符给GAP中的GUI元素,或与GAP中的GUI元素交互。Microsoft(TM)ActiveAccessibility(MSAA)层是合适的可访问层的一个示例。在这点上,GAP1108和1112显露出可访问接口,该接口导出用于访问以及操纵GUI元素性质和行为的方法。例如GAP1108和1112可以采用IAccessible接口以允许使用MSAAAPI调用来对GUI元素进行访问和控制。IAccessible接口进一步促进应用显露组成当前正与之交互的用户接口中的每个窗口的数据节点树。驱动器逻辑1102和代理U04继而可以包括程序声明以访问和控制GUI元素,就好像该GUI元素是传统程序对象一样。可访问API调用可以包括对对象执行动作、从对象获取值、对对象设置值、导航到对象以及对对象设置性质和其他调用。代理1104可以是伺服程序(daemonprogram)并且可以在驱动器逻辑1102之前启动。代理1104可以感知一个或多个GAP。当代理1104启动时,其加载GAP表1106,该GAP表1106可以包括代理U04意识到的预定义的GAP条目集合。GAP条目可以采取以下形式<Alias,<FileO,PathO,DirO,CommandLineO>,<Filel,Pathl,Dirl,CommandLine1〉〉其中,Alias(别名)是GAP的唯一预定义的名称(例如,对当前GAP版本1108和后续GAP版本1112通用的名称),FileO是用于当前GAP版本1108的可执行程序的名称,PathO是到FileO的绝对路径,DirO是到应该从其执行FileO的目录的绝对路径,以及CommnadUneO指定了用于FileO、Filel、Pathl、Did的命令行参数,以及CommandLinel为后续GAP版本1112提供了类似的参数。当驱动器逻辑1102启动时,其本地或远程地连接至代理(例如,通过传输控制协议(TCP)端口)。一旦连接,则驱动器逻辑1102通过向代理1104发送GAP表请求消息来请求GAP表1106。代理1104通过向驱动器逻辑1102发送包括GAP表1106的GAP表响应消息进行响应。示例消息交换在表2中示出表2_GAP表请求消息~<GetGapTable/>GAP表响应消息<GapTable><GAPAlias="name<table>tableseeoriginaldocumentpage25</column></row><table>驱动器逻辑1102继而可以向操作者提供可从中进行选择的GAP列表,以便定型GAP(图5,(602)、(604))或执行GUI元素映射(图IO,(1002)、(1004)、(1006))。驱动器逻辑1102继而可以创建GAP加载消息,例如〈LoadGapAlias="name"/〉并将GAP加载消息发送到代理1104,以启动任何选定的GAP(然后,其将显示其用户接口)(图6和图10、(608)、(1008))。当操作者正在执行元素映射时,一个GAP加载消息可以使得代理1104启动在GAP表1106的〈GAP〉段中标识在一起的多个GAP版本。在启动GAP之后,代理1104将钩子注入GAP的进程空间。钩子连接至代理1104并且发送确认消息(例如,GAPFile="gap.exe"Instance=,,192,,/〉)。代理1104向驱动器逻辑1102发送成功消息(例如,〈LoadedAlias:"name"VN:"192"VN1=,,193,7〉),从而确认GAP启动成功。操作者可以从驱动器逻辑1102请求每个已启动GAP的当前状态。作为响应,驱动器逻辑1102向代理1104发送状态请求消息(例如,〈GetStateAlias="name"/>)。接着,代理1104定位到GAP相应钩子的连接,并且向该钩子发送状态请求消息(例如,<GetState/>)。该钩子创建GAP状态(包括用于GUI元素的唯一标识符),诸如状态树,对其进行编码(例如,以XML格式)并将其发送到代理1104。代理1104将GAP状态转发至驱动器逻辑1102。由代理1104发送的示例GAP状态消息在表3中示出。<table>tableseeoriginaldocumentpage25</column></row><table><Description>Action</Description><DefAction>Action</DefAction><UniqueID>Oxcafebabe</UniqueID><Class>LISTBOX</Class><Vdu6S><ValueSeqNumber="l">someval</Value></Values></GUIElement></State>GAP状态包含关于组成给定屏幕的GUI元素的信息,以及这些元素的值和分配给它们的标识符。GAP状态指定GAPGUI元素和GUI元素的值。在一个实现中,GAP状态反映在可扩展标记语言(XML)结构中,其中元素"State(状态)"具有一个或多个子元素"GAP",其子元素依次为多个"GUIElement"。例如,GUI元素可以是容器或基本元素。容器GUI元素包含其他元素,而基本元素不包含其他元素。XML结构通过允许GUIElement包含其他GUIElement来反映容纳层次。在XML结构中,属性SeqNumber(序列号)可以指明GAP内状态的唯一序列号。由于状态被映射到GUI屏幕,所以每个状态可以被赋予由可选属性"Name(名称)"指定的名称。属性Alias和ProcessID可以分别指明GAP的别名和其实例进程标识符。实例进程标识符可以在当前GAP版本和后续GAP版本之间进行区分。定型和映射逻辑120可以接受操作者输入(例如,鼠标输入),通过该输入,操作者通过将光标指向GUI对象来标识该GUI对象(图10和图6,(1012)和(612))。定型和映射逻辑120继而可以绘出围绕元素的框架(图IO和图6(1014)和(614))。定型和映射逻辑120继而可以显示GUI元素类型选择列表(图6,(616))或GUI元素用户接口(图10,(1016))。操作者选择用于对象的合适类型(图6,(620))或核实是否应该在两个选定对象之间创建映射。在两者之一的情况中,代理1104向驱动器逻辑1102发送GUI元素类型映射或GUI元素版本映射。接着,驱动器逻辑1102将该映射存储在库116中,并且可以创建GUI元素映射指定消息或GUI元素类型指定消息,并且将GUI元素映射指定消息或GUI元素类型指定消息传送到元数据库202(图6,(626)和图10,(1022))。图11还示出了参考类型模型库1116。系统1100可以根据参考类型模型库1116中可用的多个不同参考类型模型之一来绘制当前正在应用的参考GUI类型模型122。在图11中示出的参考类型模型的示例包括在线角色扮演游戏(RPG)参考类型模型1118,其可以由操作者在设计或定型实现在线游戏功能的GAP时选择,还包括患者记录参考类型模型1120,操作者可以在设计或定型健康保障GAP时选择该模型1120。附加的示例包括文字处理器参考类型模型1122,操作者可以在定型或构建文字处理器GAP时选择该模型1122;以及即时消息传送(IM)参考类型模型1124,操作者可以在设计或定型IMGAP时选冲奪该才莫型1124。图12示出了元数据演进工具架构1200的一个实施方式。架构1200包括接口136、处理器129、存储器130和元数据库138。架构1200可以通过4妄口136与其他系统通信。例如,架构1200可以通过接口136接收针对元数据信息的请求并且向那些请求发送响应。可替换地或此外,架构1200可以向接口136发送指令以在非本地的终端处显示提示,并且可以通过接口136接收对于该提示的响应。替换地或此外,处理器129可以发送指令以在显示器1236处显示提示,并且可以接收对于该提示的响应。处理器129执行存储在存储器130中的逻辑。元数据库138接收、获取以及存储由处理器129处理的元数据信息。存储器130可以包括元数据处理逻辑132、数据库和文件管理逻辑134以及消息1214。元数据处理逻辑132可以指示处理器129执行用于维护以及移植元数据的处理流程。数据库和文件管理逻辑134可以指示处理器129执行关于数据存储、获取以及对元数据库138操纵和来自元数据库138的操纵的过程。消息1214可以在从接口136接收时存储在存储器中,并且由处理器129根据来自于元数据处理逻辑132的指令进行操纵。元数据处理逻辑132包括元数据消息处理逻辑1216、类型处理逻辑1218、映射处理逻辑1220、符号处理逻辑1222和元数据移植逻辑1224。元数据消息处理逻辑1216可以指示处理器129将从接口136接收的消息1214存储在存储器130中,并且如下所述地处理消息1214。元数据消息处理逻辑1216可以包括通信逻辑1226和解析逻辑1228。通信逻辑1226可以指示处理器129通过接口136发送和接收消息1214。通信逻辑1226也可以指示处理器129将消息1214存储在存储器130中。可替换地或此外,通信逻辑1226可以向接口136发送指令以向非本地终端显示提示,并且可以指示处理器129响应于该提示来处理由接口136接收的指令。可替换地或此外,通信逻辑1226可以指示处理器129向显示器1236发送指令以显示提示,并且处理器129可以响应于该提示来处理接收的指令。解析逻辑1228可以指示处理器129来解析消息1214。例如,解析逻辑1228可以指示处理器129从消息中提取元数据标识信息。类型处理逻辑1218、映射处理逻辑1220和符号处理逻辑1222可以指示处理器129来处理元数据消息,诸如类型指定消息1230、映射指定消息1232和符号消息1234。例如,类型处理逻辑1218、映射处理逻辑1220或符号处理逻辑1222可以指示处理器129维护在元数据库138中存储的元数据记录。在这点上,处理器129可以指示读、写、存储、复制、更新、移动、删除、覆盖、附加或操纵存储在元数据库138中的元数据记录内的数据。类型处理逻辑1218、映射处理逻辑1220或符号处理逻辑1222可以结合来自于数据库和文件管理逻辑134的处理而执行。作为示例,消息1214包括类型指定消息1230、映射指定消息1232以及符号消息1234,但是还可以包括涉及元数据的其他消息。类型指定消息1230、映射指定消息1232和符号消息1234将分别关于图4、图8和图14来讨论。图13示出了元数据库138的一个实现。然而,元数据库138可以按照多种不同的方式来组织。元数据库138可以包括GAPO元数据记录1302、GAP1元数据记录1304到GAP"j"元数据记录1306,以及GUI元素版本映射记录1308。GAP元数据记录1302、1304和1306可以存储与特定GAP或GAP版本相关联的元数据。GUI元素版本映射记录1308可以存储从一个GUI元素到另一个GUI元素的映射。每个GAP元数据记录可以包括GAP标识符。GAP标识符1310、1312和1314可用以标识GAP、GAP版本或两者。例如,GAP0元数据记录1302包含GAPO标识符1310"UniversityDirectoryO",并且GAP1元数据记录1304包含GAP1标识符1312"UniversityDirectoryl"。在该情况下,"UniversityDirectoryO"可以用以将整个GAP标识为"UniversityDirectoryO"。可一,换:t也或可选:t也,"UniversityDirectoryO"可以用以标识GAP版本为GAP"UniversityDirectory"的版本0(例如,当前版本)。元数据库138可以存储用于多个GAP的元数据记录,以及用于每个GAP的多个版本中每个版本的多个元数据记录。GAPO元数据记录1302可以附加地包括GUI元素1元数据记录1316到GUI元素"n"元数据记录1318。存储在每个GAP元数据记录内的总数量为"n"的GUI元素元数据记录可以根据GAP的复杂度而改变。每个GUI元素元数据记录可以对应于GAP或GAP版本内的GUI元素,并且GAP内的每个GUI元素可以具有GAP元数据记录内的相应的GUI元素元数据记录。例如,GAPO元数据记录1302包含GUI元素"n"元数据记录1318,其指明GAP0可以包括"n"个或更多可标识GUI元素。可替换地或此外,GUI元素"n"元数据记录1318可以指示GAP0元数据记录1302当前包含"n"个GUI元素元数据记录,其中"n"可以是从0到GAP0中的GUI元素总数的整数值。GAP中的每个GUI元素没有相应的GUI元素元数据记录。类似地,GAP1元数据记录1304可以包含GUI元素"k"元数据记录1320,并且GAP"j"元数据记录可以包含GUI元素"m"元数据记录1322。GUI元素元数据记录1316、1318、1320和1322中的每个可以包括GUI元素标识符1324、类型标识符1326、符号1328、GUI元素映射1330和其他元数据1332。GUI元素标识符1324可以^使用唯一的数字、字符串或其他标记,来标识GAP或GAP版本内的GUI元素。例如,一个元素ID可以是"Ox30fbO"。类型标识符1326可以是定义以下内容的GUI元素的分类高级语义、注释和性质、允许的或限制的行为以及与GUI元素相关联的值。例如,一个类型标识符可以是"US-StateTextBox",其可以指定文本框GUI元素的类型,该"US-StateTextBox"仅接受对应于美国州名的字符串。在测试工程师试图理解被测试GAP中的每个GUI元素的语义时,该信息可以来自于他或者她的知识。符号1328可以包括一个程序员希望向另一程序员传递的关于特定GUI元素的文本、笔记、非正式评论、约束或从技术规范得出的信息。例如,符号1328可以包括文本"仅州名",其作为向另一个程序员传递仅应该包括对应于美国的州名的字符串的非正式方法。GUI元素映射1330可以标识对应于与GUI元素元数据记录相关联的GUI元素的另一GAP或GAP版本中的GUI元素。例如,GUI元素映射1330可以包括值"UniversityDirectoryl"和"0x30fc8",以指示与该GUI元素元数据记录相关联的GUI元素对应于GAP大学目录、版本1中的GUI元素0x30fc8。此外,其他元数据1332可以与GUI元素元数据记录相关联地存储。元数据库138可以包括任意数量的GUI元素版本映射记录,诸如记录1308。GUI元素版本映射记录1308的数量可以根据GAP或GAP版本的数量而变化。例如,每个GUI元素版本映射记录1308可以包括从一个特定GAP版本到另一个特定GAP版本的映射。可替换地或此外,每个GUI元素版本映射记录1308可以包括单个GAP的所有版本之间的所有映射。图13的示例示出了GUI元素版本映射记录1308包括GUI元素版本映射1334和1336。GUI元素版本映射记录1308中的GUI元素版本映射1334和1336的数量可以根据不同GAP或GAP版本的GUI元素之间进行的映射数量而有所变化。每个GUI元素版本映射1334或1336可以包括源GAP别名标识符1338、源GUI元素标识符1340、目标GAP别名标识符1342、目标GUI元素标识符1344和置信度值1346。GUI元素版本映射1348使用可扩展标记语言(XML)来提供GUI元素版本映射的示例。GUI元素版本映射1348包括源GAP别名标识符1350、源GUI元素标识符1352、目标GAP别名标识符1354、目标GUI元素标识符1356和置信度值1358。在该示例中,映射指示GAP大学目录、版本l(例如,后续版本)的GUI元素0x30fc8到GAP大学目录、版本0(例如,当前版本)的GUI元素0x80fc0的对应关系,其置信度为1200。置信度值可以使用0到l之间的小数值,0到100之间的整数值或任何其他范围以指示GUI元素之间的映射是正确映射的可信度的强度。例如,人类用户提供的映射可以具有为1或者1200百分比的较高置信度或者绝对置信度,其中使用GUI元素性质比较的映射评估程序提供的映射可以具有较低置信度或没有置信度。可替换地或此执行度或绝对置信度,其中人类用户提供的映射可以具有较低置信度或没有置信度。处理器129使用数据库和文件管理逻辑134来访问并操纵GAP元数据记录1302、1304或1306,GUI元素元数据记录1316、1318、1320或1322,和/或存储在元数据库138中的任一GUI元素版本映射记录中。对元数据库138中数据的访问和操纵可以包括读、写、存储、复制、更新、移动、删除、覆盖、附加或对数据执行的任何其他功能。图14示出了GUI元素符号映射1400的示例,GUI元素符号映射1400可以是GUI元素符号消息1234的组件。符号映射格式1400包括GAP别名1402、GUI元素标识符1404和GUI符号1406。更多的、更少的或不同的字段可以包括在符号映射1400中。GAP别名1402指定用于GAP的标识符,其包括符号正被应用于的GUI元素。GAP别名1402可以是在GAP或GAP版本(包括同一GAP的当前GAP版本和后续GAP版本)之间进行区分的唯一标识符。GUI元素标识符1404为被标记的GUI元素提供唯一标识符。GUI符号1406指定被分配给GUI元素的符号(例如,文本"仅州名")。图14还示出了使用XML表示的GUI符号映射1408和1410的两个示例。符号映射1408是窗口GUI元素的映射。GAP别名1412是"UniversityDirectoryO",表示大学目录GAP的当前版本。被标记的GUI元素具有由HWND标识符标记、并例如由可访问层接口建立的唯一元素标识符"0x30fb0"。用于窗口GUI元素的GUI符号1416是文本"仅州名"。符号映射1410是窗口项目GUI元素的映射。GAP别名1418是"UniversityDirectoryl",表示大学目录GAP的后续版本。被标记的GUI元素具有由名称字段指定的元素标识符1420"打开文件"。用于窗口GUI元素的GUI符号1422是由注释字段指定的文本"OpentoDefaultDirectory(打开到默认目录),,。图14还示出了使用XLM表示的GUI元素符号消息1424的示例。GUI元素符号消息1424可以包括GUI元素符号消息开始符1426("NotationGuiObject")和GUI元素符号消息结束符1428("/NotationGuiObject,,)。开始符1426和结束符1428表明消息内的数据指定用于GUI元素的符号。最后,GUI元素符号消息1424可以进一步包括GAP别名1430、GUI元素标识符1432和GUI符号1434。图15示出了元数据处理逻辑132可以执行的元数据消息处理的流程图1500。元数据处理逻辑132可以获取元数据消息(1502)。例如,元数据消息可以通过接口136获取,并且存储在存储器130中。元数据处理逻辑132可以指示处理器129继而解析元数据消息(1504)。例如,元数据处理逻辑132可以解析元数据消息,以获取元素标识信息、GAP标识信息、符号数据或其他元数据。元数据处理逻辑132继而可以根据从解析的元数据消息中提取的信息来维护元数据记录(1506)。维护元数据记录可以包括读、写、存储、复制、更新、移动、删除、覆盖、附加或对元数据记录内的数据的操纵。元数据处理逻辑132继而可以检查是否有更多消息要处理(1508)。如果有更多消息可用,则元数据处理逻辑132继而可以循环返回,并且获取下一个元数据消息(1502)。如果没有更多的消息可用,则元数据处理逻辑132可以终止。程图700。类型处理逻辑1218首先可以获取类型指定消息(1602)。类型指定消息可以是针对GUI元素类型指定消息424而示出的示例格式。类型处理逻辑1218继而可以从类型指定消息中提取GAP别名(1604)。GAP别名可以在XML声明中如GAP别名430示出的那样限定。类型处理逻辑1218继而可以从类型指定消息中提取GUI元素标识符(1606)。GUI元素标识符可以在XML声明中如GAP元素标识符432示出的那样限定。然后,类型处理逻辑1218可以从类型指定消息中提取GUI类型标识符(1608)。GUI类型标识符可以在XML声明中如GAP类型标识符434示出的那样限定。然后,类型处理逻辑1218可以确定对应于GAP别名和GUI元素标识符的类型元数据记录是否已经存在(1610)。如果针对GAP别名和GUI元素标识符还不存在类型元数据记录,则类型处理逻辑1218将GUI类型标识符存储在类型元数据记录中(1612)。类型处理逻辑1218可以通过覆盖已经存在GUI类型标识符或在空白GUI类型标识符字段中存储GUI类型标识符来存储GUI类型标识符。此外,类型处理逻辑1218可以在覆盖已有标识符之前显示确认请求提示,或可以在存储或覆盖数据之前采用任何其他沖突解决方案技术。如果针对GAP别名和GUI元素标识符还不存在类型元数据记录,则类型处理逻辑1218可以针对该GAP别名和GUI元素标识符创建类型元数据记录(1614)。类型处理逻辑1218继而可以将GUI类型标识符存储在类型元数据记录中(1612)。图17示出了可以由映射处理逻辑1220执行的映射处理的流程图800的第一部分。映射处理逻辑1220首先可以获取映射指定消息(1702)。类型指定消息可以是针对GUI元素版本映射消息822而示出的示例格式。映射处理逻辑1220继而可以从映射指定消息中提取GAP别名(1704)。源GAP别名可以在XML声明中如GAP另'J名828示出的那样限定。映射处理逻辑1220继而可以从映射指定消息中提取目标GAP别名(1706)。目标GAP别名可以在XML声明中如目标GAP另'J名832示出的那样限定。然后,映射处理逻辑1220可以从映射指定消息中提取源GUI元素标识符(1708)。源GUI元素标识符可以在XML声明中如源GUI元素标识符830示出的那样限定。然后,映射处理逻辑1220可以从映射指定消息中提取目标GUI元素标识符(1710)。目标GUI元素标识符可以在XML声明中如源GUI元素标识符834示出的那样限定。然后,映射处理逻辑1220可以从映射指定消息中提取置信值(1712)。置信值可以在XML声明中如置信值836示出的那样限定。图18示出了可以由映射处理逻辑1220执行的映射处理的流程图1800的第二部分。映射处理逻辑1220可以决定更新哪个映射元数据记录(1802)。该决定可以基于预先存在的或默认的设置。可替换地或此外,该决定可以基于响应于指示提示而从用户接收的映射指令。如果映射指令指定更新GUI元素版本映射记录,则映射处理逻辑1220可以创建GUI版本映射(1804)。GUI版本映射可以在XML声明中如版本映射812示出的那样限定。映射处理逻辑1220继而可以存储GUI版本映射(1806)。例如,GUI版本映射可以存储在GUI元素版本映射记录1308中。如果映射指令指定更新GUI元素元数据映射,那么映射处理逻辑1220可以在元数据库中定位源GAP元数据记录(1808)。元数据库可以是元数据库138。源GAP元数据记录可以是例如针对GAP0元数据记录1392而示出的示例格式。源GAP元数据记录可以通过将从映射指定消息提耳又(1704)的源GAP别名与GAP标识符(诸如GAPO标识符1310)进行比较来进行定位。映射处理逻辑1220继而可以存储目标GUI元素标识符(1810)。例如,目标GUI元素标识符可以存储在GUI元素映射字段1330中。可替换地或此外,可以存储置信度。例如,置信度可以存储在其他元数据字段1332中。映射处理逻辑1220继而可以定位目标GUI元数据记录(1812)。目标GAP元数据记录可以类似于GAP1元数据记录1304。目标GAP元数据记录可以通过将从映射指定消息提取(1706)的目标GAP别名与GAP标识符,诸如GAP1标识符1312进行比较来进行定位。映射处理逻辑1220继而可以存储源GUI元素标识符(1814)。例如,源GUI元素标识符可以存储在GUI元素映射字段1330中。可替换地或此外,可以存储置信度。例如,置信度可以存储在其他元数据字段1332中。映射处理逻辑1330继而可以终止。这些步骤不必以任何特定的顺序执行。可以添加或删除某些步骤而不影响处理的目标。如果映射指令指定更新GUI元素元数据记录和GUI版本映射记录两者,那么映射处理逻辑1220可以首先在元数据库中定位源GAP元数据记录(1816)。映射处理逻辑1220继而可以存储目标GUI元素标识符和/或置信度(1818)。映射处理逻辑1220继而可以定位目标GUI元数据记录(1820)。映射处理逻辑1220继而可以存储源GUI元素标识符和/或置信度(1822)。映射处理逻辑1220继而可以创建GUI版本映射(1824)。映射处理逻辑1220继而可以将该GUI版本映射存储在GUI版本映射记录中(1826)。映射处理逻辑1220继而可以终止。这些步骤不必以任何特定的顺序执行。可以添加或删除某些步骤而不影响处理的目标。图19示出了可以由符号处理逻辑1222执行的符号处理的流程图1900。符号处理逻辑1222首先可以获取符号消息(1902)。符号消息可以是针对GUI元素符号消息1424而示出的示例格式。符号处理逻辑1222继而可以从符号消息中提取GAP别名(1904)。GAP别名可以在XML声明中如GAP别名1430示出的那样限定。符号处理逻辑1222继而可以从符号消息中提取GUI元素标识符(1906)。GUI元素标识符可以在XML声明中如GUI元素标识符1432示出的那样限定。然后,符号处理逻辑1222可以从符号消息中提取GUI符号(l卯8)。GUI符号可以在XML声明中如GUI符号1434示出的那样限定。然后,符号处理逻辑1222可以确定与从符号消息中提取的GAP别名和GUI元素标识符相对应的符号元数据记录是否已经存在(1910)。如果针对GAP别名和GUI元素标识符还不存在符号元数据记录,则符号处理逻辑1222可以在终止之前在符号元数据记录中存储GUI符号(1912)。符号处理逻辑1222可以通过以下形式来存储GUI符号覆盖已经存在的GUI符号、在空白GUI符号字段中存储GUI符号、在覆盖已有符号之前显示提示、将符号附加到已有符号或在存储数据之前使用解决沖突的任何其他合适的形式。如果针对GAP别名和GUI元素标识符还不存在符号元数据记录,则符号处理逻辑1222可以针对GAP别名和GUI元素标识符来创建符号元数据记录(1914)。符号处理逻辑1222继而可以在终止之前在符号元数据记录中存储GUI符号(1912)。图20示出了元数据移植逻辑1224可以执行的元数据移植处理的流程图2000。元数据移植逻辑1224可以定位源元数据记录(2002)。元数据移植逻辑1224继而可以定位目标元数据记录(2004)。元数据移植逻辑1224继而可以标识孤儿元数据(2006)。孤儿元数据可以包括存储在GUI元素元数据记录中的元数据,其中元数据没有存储在第一GUI元素元数据记录所映射至的另一个GUI元素元数据记录中。可替换地或此外,孤儿元数据可以包括与其中GUI元素不具有到另一GUI元素的映射的GUI元素相关联的元数据。元数据移植逻辑1224继而可以移植任何孤儿元数据(2008)。移植可以自动发生。可替换地或此外,移植可以在显示提示消息之后发生。如果更多源消息可用(2010),则元数据移植逻辑1224继而可以循环返回并且获取下一源记录(2002)。如果没有更多源记录可用(2010),则元数据移植逻辑1224可以停止。图21示出了元数据移植逻辑1224可以执行的元数据移植处理的流程图2100。元数据移植逻辑1224例如可以在映射过程(诸如映射过程800和1800)期间执行处理。该元数据移植处理可以辅助将所有已有的元数据或任何忽略的元数据从一个GAP移动到另一个GAP或从一个GAP版本移动到另一个GAP版本。元数据移植逻辑1224可以首先确定源GUI元素是否具有与其相关联的元数据(2102)。例如,元数据移植逻辑1224可以使用源GAP别名和源GUI元素标识符来定位源GUI元素元#:据记录。然而,元数据移植逻辑1224可以在该源GUI元素元数据记录内搜索任何相关的元数据字段,诸如类型字段1326、符号字段1328或其他元数据字段1332。如果元数据移植逻辑1224确定源GUI元素不具有与其相关联的相关元数据,则元数据移植逻辑1224继而可以确定目的GUI元素是否具有与其相关联的元数据(2104)。该确定可以按照类似于确定源GUI元素是否具有与其相关联的元数据(2102)的方式执行。如果元数据移植逻辑1224确定目标GUI元素不具有与其相关联的相关元数据,则该逻辑可以终止。如果元数据移植逻辑1224确定源GUI元素具有与其相关联的元数据,则元数据移植逻辑1224确定目的GUI元素是否具有与其相关联的元数据(2106)。该确定可以按照类似于确定源GUI元素是否具有与其相关联的元数据(2102)的方式执行。如果元数据移植逻辑1224确定目的GUI元素不具有与其相关联的元数据,则元数据移植逻辑1224可以提供针对进一步处理指令的提示(2108)。该提示可以请求关于是否将元数据从具有元数据的GUI元素复制到没有元数据的GUI元素记录的指令(2110)。如果对该提示的响应是"否",那么该逻辑可以终止。如果该提示的响应是"是",则该逻辑可以在终止之前执行复制过程(2112)。在源GUI元素不具有元数据、但是目的GUI元素具有元数据的情况下,执行类似的过程。如果元数据移植逻辑1224确定源GUI元素和目的GUI元素每个都具有与它们相关联的元数据,则元数据移植逻辑1224可以提供针对进一步处理指令的提示(2114)。例如,该提示可以包括以下选项利用另一元数据集合覆盖多个元数据集合之一,将一个元数据集合与一个元数据集合附加(或可选地,向另一个附加每个元数据集合),或将一个元数据集合移动到完全不同的GUI元素元数据记录(2116)。如果对该提示的响应包括利用另一个元数据集合覆盖多个元数据集合之一,则元数据移植逻辑1224可以在终止之前执行覆盖过程(2118)。如果对该提示的响应包括将一个元数据集合附加到另一个上,则元数据移植逻辑1224可以在终止之前执行附加过程(2120)。如果对该提示的响应包括移动一个元数据集合,则元数据移植逻辑1224可以在终止之前执行移动过程(2122)。可替换地或此外,元数据移植逻辑1224可以执行移动过程(2122),继而提供针对连续动作的另一个提示,诸如将一个元数据集合复制到移动过程腾出的元数据记录中,类似于复制提示(2110)。图22示出了可以由元数据移植逻辑1224执行的元数据移植处理的流程图2200。元数据移植逻辑1224首先可以搜索具有与GUI元素相关联的元数据的GUI元素。例如,该搜索可以通过访问GAP或GAP版本元数据记录以及访问与该记录存储在一起的每个GUI元素元数据记录来执行。可替换地或此外,元数据移植逻辑1224可以查找GAP或GAP版本列表以及关联的GUI元素标识符,并且独立地访问用于GUI元素标识符中每个的GUI元素元数据记录。可替换地或此外,元数据移植逻辑1224可以执行深度优先、广度优先或其他搜索技术来访问元数据库内的所有GUI元素元数据记录。一旦元数据移植逻辑1224获取了GUI元素,则其可以按照类似于确定源GUI元素是否具有与其相关联的元数据(2102)的方式,来确定该GUI元素是否具有合适的元数据。一旦元数据移植逻辑1224已经利用与其相关联的元数据标识了GUI元素,则元数据逻辑1224可以确定该GUI元素是否具有与其相关联的映射(2204)。例如,该确定可以包括查找GUI元素元数据记录内的GUI元素映射字段1330。可替换地或此外,确定可能由另一逻辑过程利用从元数据移植逻辑1224传递的结果以及GUI元素的标识来进行。如果元数据移植逻辑1224确定GUI元素具有相关联的映射,则元数据移植逻辑1224可以假设另一元数据移植逻辑过程(诸如逻辑过程2100)已经移植了任何相关元数据,并且因此接下来确定GUI元素是否是需要针对元数据移植而进行检查的最后元素(2206)。该确定可以包括查看列表中的下一GAP或GAP版本以及相关联的GUI元素标识符。可替换地或此外,确定可以包括以深度优先、广度优先或其他合适的搜索算法查看下一GUI元素元数据记录。如果元数据移植逻辑1224确定GUI元素是要处理的最后的GUI元素,则元数据移植逻辑1224可以终止。如果元数据移植逻辑1224确定GUI元素不是要处理的最后的GUI元素,则元数据移植逻辑1224可以移动到下一GUI元素(2208)。该移动可以包括访问列表中下一GAP或GAP版本和相关联的GUI元素标识符。可替换地或此外,移动可以包括以深度优先、广度优先或其他合适的搜索算法查看下一GUI元素元数据记录。在移动之后,元数据移植逻辑1224可以循环返回并且确定新GUI元素是否具有与其相关联的映射(2204)。如果元数据移植逻辑1224确定GUI元素不具有与其相关联的映射,那么元数据移植逻辑1224可以提供针对进一步指令的提示(2210)。该提示可以请求关于是否将该GUI元素映射到另一个GUI元素的进一步指令(2212)。如果对该提示的响应是"是",那么元数据移植逻辑1224可以激活映射处理逻辑1220并终止(2214)。可替换地或此外,元数据移植逻辑1224可以在终止之前激活映射处理逻辑1220和元数据移植处理2100。如果对该提示1312的响应包括"否",那么元数据移植逻辑1224可以确定GUI元素是否是需要针对元数据移植而进行检查的最后元素(2216),这类似于检测2206。如果元数据移植逻辑1224确定GUI元素是要处理的最后元素,则元数据移植逻辑1224可以终止。如果元数据移植逻辑1224确定GUI元素不是要处理的最后的GUI元素,则元数据移植逻辑1224可以移动到下一GUI元素(2208)。图1示出了图形用户接口(GUI)应用比较器系统("系统")106。系统106可以包括GUI模型构建器154和GUI比较器160。GUI模型构建器154可以接受GUI应用(GAP)版本"n"("GAPVn")150并创建GAPVnGUI模型156。GUI模型构建器154还可以接受GAP版本"n+1"("GAPVn+1,,)152并创建GAPVn+1GUI模型158。GUI比较器160可以接受GAPVnGUI模型156和GAPVn+1GUI模型158,以及通过通信逻辑163接收的信息,从而创建GUI差异模型162。GUI差异模型162可以通过通信逻辑163被发送到其他系统。GAPGUI模型156和158可以具有扁平的、树形的、分层的、嵌套的或其他类型的结构。GAPVn150可以是特定GAP的当前版本,而GAPVn+1152可以是GAP的后续版本。GAPVnGUI模型156可以提供当前GAP版本的GUI结构的表示,而GAPVn+1GUI模型158可以提供后续GAP版本的GUI结构的表示。图23示出了GUI应用比较器系统106的实现。系统106可以包括处理器2302、存储器2304和显示器2306。系统106可以通过通信逻辑163与诸如GUI元素数据库("库")138、脚本分析器170和网络2314的其他系统交换信息。通信逻辑163可以是有线/无线接口、进程间通信机制、共享的存储器、web服务接口或任何其他类型的通信接口。库138可以包括GAPGUI元素映射1308。网络2314可以连接至本地或远程终端2318以Y更本地或远程操作者与系统106交互,连接至其他运行在其他机器上的进程,或连接至与系统106交互的其他实体。存储器2304可以包括GUI模型构建器逻辑2320。GUI模型构建器逻辑2320可以与代理2322通信。代理2322可以存储在存储器2304中并且访问GAP表2324。代理2322可以与诸如当前GAP版本2326和后续GAP版本2328的GAP通信。当前GAP版本2326和后续GAP版本2328可以已经驻留在存储器2304中。可替换地或此外,系统106可以通过通信逻辑163请求以及接收当前GAP版本2326和后续GAP版本2328,这时可以将当前GAP版本2326和后续GAP版本存储在存储器2304中。代理2322可以包括将钩子2330和2332插入GAP2326和2328的进程空间中的逻辑。代理2322可以与钩子2330和2332通信。特别地,代理2322可与钩子2330和2332交换消息以获取GAP2326和2328中任何或所有GUI元素的状态。钩子2330和2332可以是响应于来自代理2322的消息的程序,并且其可以通过操作系统2336的可访问层2334进行交互,以发现并且向代理报告关于GAP2326和2328中的GUI元素的信息。可访问层2334可以显露可访问接口,通过该接口,代理2322以及钩子2330和2332可以调用方法,并且设置以及获取GUI元素值和特征,从而对GAP中的GUI元素进行选择、高亮显示、控制、修改、分配标识符,或是与GAP中的GUI元素交互。Microsoft(TM)ActiveAccessibility(MSAA)层是合适的可访问层的一个示例。在这点上,GAP2326和2328显露出可访问接口,该接口导出用于访问以及操纵GUI元素性质和行为的方法。例如,GAP2326和2328可以采用IAccessible接口来允许使用MSAA应用编程接口(API)调用对GUI元素进行访问和控制。IAccessible接口进一步促进应用显露组成当前正与之交互的用户接口中的每个窗口的数据节点树。GUI模型构建器逻辑2320,并且代理2322继而可以包括程序声明,以访问和控制GUI元素,就像该GUI元素是传统程序对象一样。可访问API调用可以包括对对象执行动作、从对象获取值、设置对象的值、导航到对象以及对对象设置性质和其他调用。代理2322可以是伺服程序并且可以在GUI模型构建器逻辑2320之前启动。代理2322可以感知到一个或多个GAP。当代理2322启动时,其可以加载GAP表2324,该GAP表1106可以包括代理2322意识到的预定义的GAP条目集合。GAP条目可以采取以下形式<Alias,<FileO,PathO,DirO,CommandLineO〉,<Filel,Pathl,Dirl,CommandLine1〉〉其中,Alias可以是GAP的唯一预定义的名称(例如,对当前GAP版本2326和后续GAP版本2328均通用的名称),FileO可以是用于当前GAP版本2326的可执行程序的名称,PathO是到FileO的绝对路径,DirO是到应该从其执行FileO的目录的绝对路径,以及CommnadLineO可以指定用于FileO、Filel、Pathl、Dirl的命令行参数,以及CommandLine1提供用于后续GAP版本2328的类似的参数。当GUI模型构建器逻辑2320启动时,其可以连接至代理2322。一旦连接,则GUI模型构建器逻辑2320通过向代理2322发送GAP表请求消息来请求GAP表2324。代理2322通过向GUI模型构建器逻辑2320发送包括GAP表2324的GAP表响应消息进行响应。示例消息交换在表4中示出__GAP表请求消息_<GetGapTable/>_GAP表响应消息<GapTable><GAPAlias="name"<V—NFile="gap.exe"Path="c:\path\N"CommandLine="-cl7><V—MlFile="gap.exe"Path="c:\path\Nl"CommandLine="-cl7></GAP>_</GapTable>_GUI模型构建器逻辑2320继而可以提供GAP列表,操作者可以从该列表中进行选择。操作者可以通过显示器2306本地访问系统106或例如通过终端2318远程地访问系统106。GUI模型构建器逻辑2320继而可以创建GAP加载消息,例如〈LoadGapAlias=,,name,7>并将GAP加载消息发送到代理2322,以启动任何选定的GAP(其继而可以显示其用户接口)。一个GAP加载消息可以使得代理2322启动GAP表2324的〈GAP〉段中一起标识的多个GAP版本。在启动GAP之后,代理2322可以将钩子注入GAP的进程空间。钩子可以连接至代理2322并且发送确认消息(例如,<GAPFile=,,gap.exe"Instance=,,1927〉)。代理2322可以向GUI模型构建器逻辑2320发送成功消息(例如,<LoadedAlias="name"VN="192,,VN1="1937〉),从而确认GAP启动成功。GUI模型构建器逻辑2320可以请求每个已启动GAP的当前状态。在这点上,GUI模型构建器逻辑2320可以向代理2322发送状态请求消息(例如,<GetStateAlias="name"/>)。接着,代理2322可以定位到GAP相应钩子的连接,并且向该钩子发送状态请求消息(例如,<GetState/〉)。该钩子可以创建GAP状态(包括用于GUI元素的唯一标识符),诸如状态树,对其进行编码(例如,以XML格式)并将其发送到代理2322。代理2322可以将GAP状态转发至GUI模型构建器逻辑2320。由代理2322发送的示例GAP状态消息在表5中示出。<table>tableseeoriginaldocumentpage43</column></row><table>GAP状态包含关于组成给定屏幕的GUI元素的信息,以及这些元素的值和分配给它们的标识符。GAP状态指定GAPGUI元素和GUI元素的值。在一个实现中,GAP状态反映在可扩展标记语言(XML)结构中,其中元素"State(状态)"具有一个或多个子元素"GAP",其子元素依次为多个"GUIElement"。例如,GUI元素可以是容器或基本元素。容器GUI元素包含其他元素,而基本元素不包含其他元素。XML结构通过允许GUIElement包含其他GUIElement来反映容纳层次。在XML结构中,属性SeqNumber可以指明GAP内状态的唯一序列号。由于状态被映射到GUI屏幕,所以每个状态可以被赋予由原始属性"Name(名称)"指定的名称。属性Alias和ProcessID可以分别指明GAP的别名和其实例进程标识符。实例进程标识符可以在当前GAP版本和后续GAP版本之间有所不同。GUI模型构建器逻辑2320可以根据从代理2322接收到的GAP状态消息来构造GAPGUI模型。例如,GUI模型构建器逻辑2320可以根据关于当前GAP版本2326的GAP状态消息来构造GAPVnGUI模型2338。类似地,GUI模型构建器逻辑2320可以根据涉及后续GAP版本2328的GAP状态消息来构造GAPVn+1GUI模型2340。处理器2302可以调用存储在存储器2304中的GAP比较逻辑2342。GAP比较逻辑2342可以比较两个GAPGUI模型,诸如GAPGUI模型2338和2340,并且产生GUI差异模型2344。GAP比较逻辑2342可以包括映射获取逻辑2346、表示遍历逻辑2348、加权分析逻辑2350和匹配构建逻辑2352。映射获取逻辑2346可以从GUI元素数据库138中的GAPGUI元素映射1308请求特定GAPGUI元素,并且将该特定GAPGUI元素映射存储在存储器2304中作为GUI元素版本映射2354。表示遍历逻辑2348可以遍历GAPGUI模型,诸如GAPVnGUI模型2338。例如,表示遍历逻辑2348可以确定GAPGUI模型2338和2340之一中的下一个要访问的节点。可替换地或此外,表示遍历逻辑2348可以遍历所有或部分GUI差异模型,诸如GUI差异模型2344。作为示例,可以通过深度优先或广度优先的方式来确定下一要访问的节点。加权分析逻辑2350可以使用从权重表2358获取的GUI特征权重2356,来确定第一GAPGUI模型(诸如GAPVnGUI模型2338)内的GUI元素和第二GAPGUI模型(GAPVn+1GUI模型2340)内的每个GUI元素之间的相似性值。不同的GUI特征权重2356可以被分配给可以在两个GAPGUI模型中的GUI元素之间出现或不出现的不同的GUI元素特征2360或性质之间的相似性或差异。GUI元素特征2360可以包括GUI元素特征,诸如大小、XY位置、颜色、窗口位置、字体类型、字体大小、边框样式、背景颜色、前景颜色、只读/读写或任何其他GUI元素特征。可替换地或此外,GUI元素特征2360可以包括可访问层作用、类、样式、扩展样式、孩子的数量、树或层次内的级别、GUI元素的名称或其他分配的可访问层性质。权重表还可以包括与分配给GUI元素特征2360的权重2356相关联的注解2362,其可以解释每个权重值背后的基本原理。加权分析逻辑2350可以基于由加权分析逻辑2350生成的每个相似性值来将分数2364存储在分数表2366中。分数表2366中的每个分数2364可以与源标识符2368和目标标识符2370相对应。源标识符2368和目标标识符2370可以是标识GAP和GUI元素的p眷一值或值的组合(例如,包括GAP别名),加权分析逻辑2350对GAP和GUI元素进行比较以计算每个分数2364。匹配构建逻辑2352可以比较加权分析逻辑2350生成的相似性值和/或存储在分数表2366中针对相似性阈值2372的分数2364。该比较可以确定两个GUI元素是否足够相似,以被认为是从当前GAP版本到后续GAP版本的匹配。匹配构建逻辑2352可以在GUI差异模型2344中的匹配GUI元素之间创建链接。该链接可以存储在GUI差异模型2344中的GUI元素表示中,作为具有可选的对应匹配分数2376的GUI元素连接2374。GUI元素链接可以包括第二GUI元素2377的标识符。该标识符可以是源标识符2368、目标标识符2370或两者都是。在操作中,GAP比较逻辑2342可以通过从存储器2304中获取GAPGUI模型2338和2340、通过调用GUI模型构建器逻辑2320或以其他方式,来获得GAPGUI模型2338和2340。GAP比较逻辑2342可以创建基础GUI差异模型作为根节点,GAPGUI模型2338和2340在不同的分支中从根延续下来。GAP比较逻辑2342继而可以使用表示遍历逻辑2348来确定GAPGUI模型每个中的下一要访问的节点。GAP比较逻辑2342可以启动映射获取逻辑2346的执行,以从外部源(诸如元数据库138)获取可用的GUI元素版本映射。GAP比较逻辑2342可以请求所有可用的GUI元素版本映射,或可以特别地请求针对当前GAPGUI模型中下一节点的GUI元素版本映射。如果GUI元素版本映射对于当前GAPGUI模型中的下一节点是可用的,则GAP比较逻辑2342可以放弃加权分析逻辑2350的执行。取而代之的是,GAP比较逻辑2342可以采用匹配构建逻辑来将GUI元素写入基础GUI差异模型。作为另一备选方案,当GUI元素版本映射可用时,GAP比较逻辑2342可以基于GUI元素版本映射中的可用信息在分数表2366中创建相应条目。然而,当存在GUI元素版本映射时,GAP比较逻辑2342无需放弃加权分析。取而代之的是,GAP比较逻辑2342可以基于GUI元素版本映射中所提供的置信度来决定是否进行加权映射。例如,当置信度超过置信阈值时,GAP比较逻辑2342可以放弃加权分析的执行。作为另一个示例,当置信度指定人工映射时,GAP比较逻辑2342可以放弃加权分析的执行。GAP比较逻辑2342使用加权分析逻辑2350来确定当前GAPGUI版本2338中每个GUI元素与后续GAPGUI版本2340中每个GUI元素之间的相似性值。加权分析逻辑2350在下面更详细地描述。加权分析逻辑将相似性值作为分数记录在权重表2358中。该分数可以是相似性值、规格化相似性值或基于相干性值的某些其他方式。已经确定相似性值后,GAP比较逻辑2342可以使用匹配构建逻辑2352来确定GAP版本之间的GUI元素是否匹配。最后,匹配在假设相似性分数越高则表示相应GUI元素的可能性越大的情况下,分数超过相似性阈值2372的GUI元素可以被认为是匹配的。在确定匹配时,匹配构建逻辑2352可以在基础GUI差异模型中创建GUI元素4连接。图24示出了当前GAPGUI模型的一部分2400的示例。部分2400使用XML表示,然而,还可以使用其他的方式表示。部分2400包括GAP别名2402("UniversityDirectoryO")、GUI元素标识符2404("0x90b52")和GUI特征2406。GUI特征2406包括具有x值为"173"、y值为"486"、宽度值为"336"以及高度值为"274"的位置。其他GUI特征2406包括类值"WindowsFormslO丄ISTBOX.app4"、样式值"0x560100cl"以及扩展的样式值"0xc0000a00"。图25示出了使用XML表示的后续GAPGUI模型的相应部分2500的示例。相应部分2500包括GAP别名2502("UniversityDirectoryl")、GUI元素标识符2504("0x90e66")和GUI特征2506。GUI特征2506包括具有x值为"248"、y值为"653"、宽度值为"299"以及高度值为"24"的位置。其他GUI特征2506包括类值"WindowsFormslO.COMBOBOX.app.0.378734a"、样式值"0x560100242"以及扩展的样式值"0xc0000800"。具有标识符2504的GUI元素是具有标识符2404的GUI元素的修改版本。换言之,当程序员设计后续GAP版本时,程序员修改具有标识符2404的GUI元素以获取具有标识符2504的GUI元素。特别地,图24和图25示出了已经做出的以下改变从"0x560100cl"改变为"0x560100242"的式样,以及从"0xc0000a00"改变为"0xc0000800"的扩展的样式值。GUI元素特征中的这些差异对于测试脚本编写者来说不易于分辨。然而,对于程序员来说,其他改变是可分辨的,诸如类从"WindowsFormsl0.LISTBOX.app4"改变为"WindowsFormslO.COMBOBOX.app.0.378734a"。图26示出了GUI差异模型的差异部分2600的示例。差异备份2600可以包括当前版本段2602,其包括从当前GAPGUI模型(例如,部分2400的部分)中提取的GUI元素信息,以及相应的后续版本端2604,其包括从后续的GAPGUI模型(例如,相应部分2500的部分)中提取的GUI元素信息。段2602和2604可以由第一版本元素2606和第二版本元素2608隔开。在该示例中,第一版本元素2606具有值"0",而第二版本元素2608具有值"1"。"0"版本元素值可以指示源自当前GAPGUI模型的段,其中"1"版本元素值可以指示源自后续GAPGUI模型的段。GUI差异模型2344可以是平面式配置,其中GUI差异模型2344包括单个段2602和单个相应段2604。可替换地或此外,GUI差异模型2344可以是树状、层次或嵌套配置,其中GUI差异模型2344包括多个段2602和多个相应段2804。在树状、层次或嵌套配置中,类似的GUI元素可以由单个节点来表示。可替换地或此外,类似地的GUI元素可以在分离的节点中表示。GUI差异模型2344可以包括两个GAPGUI模型的所有GUI元素。可替换地,GUI差异模型2344可以仅包括第二GAPGUI模型的元素以及第一GAPGUI模型的相应部分的元素。GUI差异模型2344可以基于双向仿真算法形成,如下面更详细所描述的。当GAP比较逻辑2342将源GAPGUI模型与目标GAPGUI模型合并在根节点之下时,其可以按照图26中表示的格式来创建差异部分2600。可替换地或此外,在映射获取逻辑2346获取了在当前版本段2602和后续版本段2604中表示的GUI元素之间的相关映射之后,GAP比较逻辑2342可以创建差异部分2600。可替换地或此外,在匹配构建逻辑2352创建了当前版本段2602和后续版本段26(H之间的链接之后,GAP比较逻辑2342可以创建差异部分2600。图27示出了用于GUI模型构建器逻辑2320的流程图2700。GUI模型构建器逻辑2320可以向操作者显示可从其中进行选择的GAP列表。如上所述,GAP列表可以建立在GAP表2324中。GUI模型构建器逻辑2320监视操作者输入(2702)以选择GAP。GUI模型构建器逻辑2320从而确定选定的GAP版本(2704)。GUI模型构建器逻辑2320继而可以创建GAP加载消息,例如<LoadGapAlias="name"/〉,并将GAP加载消息发送到代理2322以启动选定的GAP版本,选定的GAP版本继而可以显示其GUI(2706)。在启动GAP之后,代理2322可以将钩子注入GAP的进程空间(2708)。钩子可以连接至代理2322并且发送确认消息(例如,<GAPFile="gap.exe"Instance=,,192,,/〉)。代理2322可以向GUI模型构建器逻辑2320发送成功消息(例如,<LoadedAlias-"name"VN="192"VN1="1937〉),从而确认GAP启动成功。可访问层、代理、钩子和GUI模型构建器逻辑2320监视操作者与选定GAP版本中的GUI元素的交互(2710)。GUI模型构建器逻辑2320可以向代理2322发送状态请求消息(例如,<GetStateAlias=,,name,,/〉),以便从钩子获取GUI元素信息(2712)。接着,代理2322可以定位到所选GAP版本中的相应钩子的连4妾,并且向该钩子发送状态请求消息(例如,<GetState/>)。该钩子可以创建GAP状态(包括用于GUI元素的唯一标识符),诸如状态树,对其进行编码(例如,以XML格式)并将其发送到代理2322。代理2322可以将GAP状态转发至GUI模型构建器逻辑2320。可以每次一屏、每次一个GUI元素、每次全部应用或以GAP的某些其他离散段的方式,来将GUI元素信息返回到GUI模型构建器逻辑2320。监视与GAP的操作交互是为了允许GUI模型构建器逻辑2320记录屏幕的结构和操作者对于GAP的操作。GUI模型构建器逻辑2320使用可访问层来截取操作者事件。通过这些事件,GUI模型构建器逻辑2320记录操作者通过其导航的屏幕序列,以及操作者对GUI元素执行的动作。当记录屏幕序列时,GUI模型构建器逻辑2320使用支持的可访问性接口来获取关于GAP结构和独立GUI元素性质的信息。因而,GUI模型构建器逻辑2320从可访问层返回的信息提取GUI元素结构数据(2714)和GUI元素特征(2716)。GUI模型构建器逻辑2320使用GUI元素结构数据和GUI元素特征,例如以逐个元素、逐个屏幕或者按照其他增量基础的方式,来将GUI元素信息添加到GAPGUI模型中(2718)。GUI模型构建器逻辑2320可以继续构建GAPGUI模型,直到操作者停止与所选GAP交互(2720)。得到的GAPGUI模型可以是整个GAPGUI结构的全部或部分捕获。因此,当操作者对比较两个GAP之间的特定GUI片段感兴趣时,操作者可以仅操作那些感兴趣的片段。GUI模型构建器逻辑2320捕获特定于操作者所操作片段的GAPGUI模型中的特定片段,而不是捕获整个所选GAP中的每个GUI元素的每个方面。操作者可以利用GUI模型构建器逻辑2320来操作当前GAP版本2326和后续GAP版本2328,以分别创建GAPVnGUI模型2338和GAPVn+1GUI模型2340。图28示出了诸如GAP比较逻辑2342的GAP比较逻辑的流程图2800。GAP比较逻辑2342可以接收第一GAPGUI模型(2802)。例如,GAP比较逻辑2342可以访问存储在存储器2304中的GAPVnGUI模型2338。GAP比较逻辑2342可以接收第二GAPGUI模型(2804)。例如,GAP比较逻辑2342可以访问存储在存储器2304中的GAPVn+1GUI模型2340。可替换地或此外,GAP比较逻辑2342可以从通信逻辑163请求以及接收第一和第二GAPGUI模型。然后,GAP比较逻辑2342可以合并第一GAPGUI模型和第二GAPGUI模型,以创建基础GUI差异模型(2806)。第一和第二GAPGUI模型可以按照平面式配置合并。可替换地或此外,第一和第二GAPGUI模型可以按照树状、层次或嵌套配置合并。GAP比较逻辑2342继而可以调用映射获取逻辑2346。映射获取逻辑2346可以确定GUI元素版本映射是否对于第一GAPGUI模型和第二GAPGUI;漠型是可用的(2808)。可以通过在本地源(诸如,存储器2304)中查找GUI元素版本映射来执行该确定。可替换地或此外,映射获取逻辑2346可以经由通信逻辑163来查询GUI元素数据库138。如果映射获取逻辑2346确定GUI元素版本映射是可用的,那么映射获取逻辑2346可以请求那些GUI元素版本映射(2810)。可以针对本地源(诸如存储器2304)进行该请求。可替换地或此外,可以经由通信逻辑163对GUI元素数据库138进行该请求。该请求可以针对诸如与下一节点相关的GUI元素版本映射的特定映射。可替换地,该请求可以是针对所有可用的GUI元素版本映射。映射获取逻辑2346可以响应于该请求接收GUI元素版本映射(2812)。可替换地或此外,GUI元素版本映射是否可用的确定、请求和响应可以合并成较少动作。例如,映射获取逻辑2346仅可以请求映射。GUI元素版本映射的响应可以确认映射是可用的,而否定响应或空响应可以确认映射是不可用的。然后,映射获取逻辑2346可以返回,并且GAP比较逻辑2342继而可以调用表示遍历逻辑2348。表示遍历逻辑2348可以从第一GAPGUI模型遍历到下一GUI元素(即源GUI元素)(2814)。在基础GUI差异模型是新创建的情况下,该遍历可以去往第一GUI元素。可以基于第一GAPGUI模型来执行该遍历。可替换地或此外,可以基于基础GUI差异模型内的第一GAPGUI模型的表示来执行该遍历。例如,可以按照深度优先或广度优先的方式来确定要访问的下一节点。然后,GAP比较逻辑2342可以确定针对该GUI元素是否存在GUI版本映射(2816)。GAP比较逻辑2342可以在所获取的GUI元素版本映射内搜索,以确定映射是否存在。如果映射存在,那么GAP比较逻辑2342可以在基础GUI差异模型中创建链接字段(2818)。链接字段可以包括GUI元素标识符,诸如源GUI元素标识符或目标GUI元素标识符。链接字段还可以包括GAP别名。GAP比较逻辑2342可以仅针对源GUI元素创建链接字段。可替换地或此外,GAP比较逻辑可以针对目标GUI元素创建链接字段。表示遍历逻辑2348继而可以确定是否有更多的源GUI元素可用(2820)。如果更多的源GUI元素还未被遍历,那么表示遍历逻辑2348循环返回并且遍历下一可用的源GUI元素(2814)。如果没有源GUI元素可用,则GAP比较逻辑2342可以终止。如果GUI元素版本映射不存在,或者该映射存在、但是不存在针对源GUI元素的映射,那么GAP比较逻辑2342可以调用加权分析逻辑2350。加权分析逻辑2350可以从权重表获取权重(2822)。例如,加权分析逻辑2350可以从存储器2304中的权重表中获取权重。可替换地或此外,加权分析逻辑2350可以从通信逻辑163请求以及接收权重表。然后,表示遍历逻辑2348可以遍历第二GAPGUI模型中的下一GUI元素,即目标GUI元素(2824)。在还未在第二GAPGUI模型中针对给定的源GUI元素进行先前遍历的情况中,表示遍历逻辑2348可以遍历到第二GAPGUI模型中的第一GUI元素。可以基于第二GAPGUI模型来执行遍历。可替换地或此外,可以基于第二GAPGUI模型的表示来执行该遍历。可替换地或此外,可以基于基础GUI差异模型内的第二GAPGUI模型的表示来执行该遍历。可以使用深度优先、广度优先或其他遍历技术来^丸行该遍历。然后,加权分析逻辑2350可以获取源GUI元素和目标GUI元素的GUI元素特征(2826)。GUI元素特征可以包括GUI元素特征,诸如大小、XY位置、窗口位置、字体类型、字体大小、边框样式、背景颜色、前景颜色、只读/读写或任何其他GUI元素特征。可替换地或此外,GUI元素特征可以包括可访问层作用、HWND、类、样式、扩展样式、孩子的数量、树或层次内的级别、GUI元素的名称或其他分配的可访问层性质。这些GUI元素特征可以从第一和第二GAPGUI模型中获得。可替换地或此外,GUI元素特征可以从基础GUI差异模型中获得。加权分析逻辑2350继而可以确定源GUI元素和目标GUI元素的相似性值(2828)。可以根据以下方程来确定该相似性值其中V,是相似性值,N是特征或性质的数量,相似性针对该特征或性质进行测量,P,是分配给每个性质或特征之间的差异的值,以W,是每个性质P,的相应权重。如一个示例^=wv肠其中,取决于两个GUI元素之间的Role特征是不同还是相同,Wo/e(作用)可以为0或1。并且W^可以是Role的相应权重。该Role的权重可以被分配指示GUI元素之间的Role匹配重要程度的值。例如,相对于其他特征的权重,Role的权重可以非常大。作为另一个示例n+『cc/咖其中C7a^(类)可以是在Class性质匹配中有多少项的计数除以Class性质中的项的总数,并且W可以是Class的相应权重。例如,GUI元素的Class特征可以是"WindowsFormsl0丄ISTBOX.app4,,。如果相应的GUI元素的Class特征是"WindowsFormslO.COMBOBOX.app.0.378734a",那么由于该特征仅匹配于三个或五个位置中的单个位置,所以Class值可以是"1/3或"1/5"。然后,GAP比较逻辑2342可以基于相似性值将分数存储在分数表中(2830)。可替换地或此外,GAP比较逻辑2342可以将用于源GUI元素和目标GUI元素的GUI元素标识符以及分数存储在分数表中。分数表可以驻留在存储器2304中。然后,GAP比较逻辑2342可以确定表示遍历逻辑2348是否已经完成了对第二GAPGUI模型的遍历(2832)。如果表示遍历逻辑2348仍有更多目标GUI元素要遍历,那么表示遍历逻辑2348循环返回以遍历下一目标元素(2824)。如果表示遍历逻辑2348已经完成了对目标GUI元素的遍历,贝'JGAP比较逻辑2342可以调用匹配构建逻辑2352。匹配构建逻辑2352可以分析由加4又分析逻辑2350确定的相似性值或存储在分数表中的分数(2834)。匹配构建逻辑2352可以将这些值或分数与相似性阈值进行比较,以确定值或分数是否符合和/或超过相似性阈值。可替换地或此外,值或分数可以与差异阅值进行比较,以确定值或分数是否处于和/或在差异阈值之下。匹配构建逻辑2352可以确定GUI元素是否匹配(2836)。该确定可以发生在值或分数超过相似性阈值时。可替换地或此外,该确定可以发生在值或分数不在差异阈值之下时。如果存在匹配,那么GAP比较逻辑2342可以在基础GUI差异模型中创建链接字段(2838)。链接字段可以包括GUI元素标识符,诸如源GUI元素标识符或目标GUI元素标识符。链接字段还可以包括GAP别名。GAP比较逻辑2342可以仅针对源GUI元素创建链接字段。可替换地或此外,GAP比较逻辑可以针对目标GUI元素创建链接字段。在GAP比较逻辑2342创建链接字段之后,或在不存在匹配的情况下,那么匹配构建逻辑2352可以确定是否需要分析更多分数或相似性值(2840)。该确定可以取决于分数表是否仍旧包括未被分析的分数。如果GAP比较逻辑2342确定需要分析更多的分数,则匹配构建逻辑2352循环返回以分析分数表中的下一分数(2834)。如果分数表中不存在未分析的分数,则匹配构建逻辑2352可以返回,并且GAP比较逻辑2342可以循环返回以确定是否剩余任何更多的源GUI元素(2820)。可替换地或此外,GAP比较逻辑2342可以将由匹配构建逻辑2352创建的任何链接字段传送到GUI元素数据库,以存储为GAPGUI元素版本映射。该通信可以^使用如图6中描述的GUI元素版本映射一各式。在另一实现中,GAP比较逻辑2342可以执行模式(schema)比较,以确定当前GAPGUI和后续GAPGUI之间的差异。如果给定当前GAPGUI和后续GAPGUI的模式表示(例如,XML模式表示),则GAP比较逻辑2342可以比较相应的模式。如果这些模式是"相等的",那么当前GAP版本和后续GAP版本是相同的。否则当前GAP版本和后续GAP版本是不同的,并且GAP比较逻辑2342找到该差异。例如,XML模式可以按照XML格式来记录,并且每个模式可以具有由〈schema〉元素指定的4艮。数据元素可以由〈elemen^和〈attribute〉标签来指定。每个数据元素可以由其名称和类型定义。元素可以是简单的或复合的类型。复合元素类型支持嵌套元素,而简单类型是基本类型的属性和元素。扩展该示例,元素可以具有两类约束。第一,可以约束元素的值。第二类约束指定特定元素可以作为元素的孩子出现的次数界限。这些界限利用〈element〉标签的minOccurs和maxOccurs属性来指定,以表示出现的最小和最大数量。如果元素是同一父元素的孩子,则可以按顺序对元素分组。还可以」換顺序对同一元素的属性分组。序列中的每个元素或属性可以被分配唯一的正整数序列号。可以使用该号码而不是使用元素的名称来访问元素或属性。可以使用图来表示模式。设T是类型名称的有限集,F为元素和属性名称(标签)的有限集,以及区别符号aeF以及卩T。模式图是有向图G=(V,E,L),从而1)VT,节点是类型名称,或如果数据的类型名称未知,则节点是P;2)LF,边由元素或属性名称标记,或如果名称未知则边由cc来才示i己;3)ELxVxV,边是标志和节点的向量积。如果<1,vk,vm>E,那么vk->(1)->vm。节点vn^皮称作节点vk的孩子。如果元素没有孩子,则模式图中的其相应的节点具有孩子节点的空集合。4)利用指明这些元素的标志的下标和上标指定元素的界限。下标用于指定由minOccurs属性定义的界限,并且上标表明由maxOccurs属性指定的界限。5)每个图都具有标记为根的特殊节点,该节点eV,其中根表示根元素的集合。空的模式具有单个根节点并且没有边。6)XML标签〈complexType〉指定元素是复合元素,并且在图中未示出。模式图中的路径可以是标签的序列PG=<11,12,...ln>,其中对于V中的vmvk-〉(In)-〉vm和1<=u<=n。如果元素是通过其序歹l)号进行导航的,则可以通过符号p用来代替路径中的标签。函数type:v-〉s返回节点vV的类型sT。函数max:label(u,1)-〉u返回上界u,或者如果上界未指定,则返回oo,并且函数min:label(u,1)->1返回下界I,或者,如果下界未指定,则返回零。一旦使用XML模式对GAP建模,则可以使用仿真对这些模式进行比较,以计算相应GAP之间的改变。即,如果新GAP的模式与GAP之前发布的模式相同,或其GUI对象的类型由之前GAP的相应GUI对象的类型所包含,则这些模式可以被认为是一致的。否则,GAP比较逻辑2342可以发出警告,并且报告与修改类型相关联的GUI对象。为此,GAP比较逻辑2342可以实现双向仿真技术以比较模式。图32示出了GAP比较逻辑2342可以采用的双向仿真性质3200的示例,包括第一双向仿真性质3202、第二双向仿真性质3204、第三双向仿真性质3206和第四双向仿真性质3208。双向仿真可以是两个图gl,g2G之间的二进制关系,写作x'y,x,yV,其满足双向仿真性质3202-3208。GAP比较逻辑2342可以认为如果存在从gl到g2的双向仿真,则两个有限图gl,g2eG图相等。图双向类似于其无限展开。GAP比较逻辑2342可以利用选择根节点并且应用双向仿真性质3202-3208为开始计算两个图的双向仿真。GAP比较逻辑2342搜索图中不满足双向仿真性质3202-3208的节点x和y之间的关系(x,y)。当发现此类关系(x,y)时,GAP比较逻辑2342确定图不相等并且停止双向仿真。例如,考虑图32中的当前模式3210和后续模式3212。GAP比较逻辑2342应用双向仿真来确定两个才莫式3210和3212是否等同。模式3210描述对当前GUI屏幕建模的XML数据,并且模式3212对当前GUI屏幕的修改版本建模。比较器逻辑2342可以确定如果模式3212等同于模式3210,则GUI屏幕是相同的。GAP比较逻辑2342选择两个模式3210和3212中满足第一双向仿真性质3202和第二双向仿真3204的根节点3214和3216。然后,GAP比较逻辑2342可以从模式3210中选4奪关系root(书)-〉a3218并且检查以查看支持模式3212中的关系root(根)》a3220的第三双向仿真性质3206。这样做之后,GAP比较逻辑2342确定第四双向仿真性质3208是否支持两个关系。这样做之后,GAP比较逻辑2342前进到用于模式3210的关系a-〉(作者1)-〉a3222和用于模式3212的关系a->(作者l)-〉a3224。GAP比较逻辑2342确定违反了第三双向仿真性质3206和第四双向仿真性质3208。特别地,GAP比较逻辑2342确定违反(offending)关系"作者"在模式3212中被标记为潜在删除,这不同于模式3212。因此模式3210和3212不相等。图29示出了显示器2900和GUI比较器阈值接口2902。GUI差异模型逻辑2380可以响应于操作者输入显示接口2902。例如,操作者可以从GUI差异模型逻辑2380生成的菜单中选择选项配置项目。作为响应,GUI差异模型逻辑2380显示接口2902。例如可以经由显示器2306本地提供或例如经由终端2318远程地提供该显示。在图29示出的示例中,接口2902包括滑块2904,其选择0到1之间的值。可以向操作者提供任何其他接口或值范围。GUI差异模型逻辑2380可以基于滑块2904的值来设置差异阈值。值0表示基本上不需要或需要有限的相似性来发现GUI元素之间的匹配。值1表示发现GUI元素之间的匹配所需要的接近或完全的相似性。此类相似性可以在人工映射中发现,例如,如在从元数据库接收的高置信度字段811(例如,"100M,,)中指定的。然而,非常高的置信度也可以通过上述自动加权分析来获取,并且GUI差异模型逻辑2380在某些实现中可以接受人工版本映射为正确,而不考虑相关联的置信度。图29还示出了当前GAP版本2326的一部分2906和后续GAP版本2328的一部分2908。除了允许操作者使用接口2902设置差异阈值,GUI差异模型逻辑2380可以进一步包括可视化逻辑2378。可视化逻辑2378可以显示由加权比较分析、相似性阈值和版本映射所确定的、相匹配的当前GAP版本和后续GAP版本中的元素。相匹配的GUI元素可以利用特殊图案或颜色的边框或以其他方式高亮显示,并且不同的边框、颜色或其他特;f正可以用于每个匹配。在图29中,可视化逻辑2378基于通过接口2902设置的相似性阈值来高亮显示相匹配的GUI元素。相似性阈值相对较高。在图29中示出的示例中,可^f见化逻辑2378高亮显示当前GAP版本2326的部分2906中的文本框元素2910、2912、2914、2916和2918,这些元素分别匹配于后续GAP版本2328的部分2908中的文本框元素2920、2922、2924、2926和2928。文本框元素2910-2928的特征在后续GAP版本之间改变很小或者没有改变。然而,文本框元素2930和复合框元素2932保持没有高亮显示,因为其特征在很大程度上不同,并且加权比较分析没有确定超过相似性阈值的GUI元素相似性值。在图30中,显示器3000示出滑块2904已经调整为较低的相似性阈值。可视化逻辑2378基于通过接口2902设置的较低相似性阈值高亮显示相匹配的GUI元素。在图30中示出的示例中,可视化逻辑2378如上所述地高亮显示当前GAP版本2326的部分2906中高亮显示文本框元素2910、2912、2914、2916和2918,这些元素分别匹配于后续GAP版本2328的部分2908中的文本框元素2920、2922、2924、2926和2928。然而,可视化逻辑2378还高亮显示文本框元素2930和复合框元素2932。尽管文本框元素2930和复合框元素2932的特征在某种程度上不同,加权比较分析确实获得了超过相似性阈值的GUI元素相似性值。因而,可视化逻辑2378高亮显示元素2930和2932。图31示出了用于可视化逻辑2378的流程图3100。可视化逻5辑2378可以显示当前GAP版本2328(3102)和后续GAP版本2328(3104)。例如,可视化逻辑2378可以向代理2322发出一个或多个GAP加载消息,以启动当前GAP版本2326和后续GAP版本2328。可视化逻辑2378还可以显示GUI比较器阈值接口2902(3106)。可视化逻辑2378可以基于通过GUI比较器阈值接口2902选择的值来设置相似性阈值(3108)。给出了相似性阈值,可视化逻辑2378可以调用GUI差异模型逻辑来确定当前GAP版本2326和后续GAP版本2328之间的匹配GUI元素(3110)。可替换地,可视化逻辑2378可以执行比较分析(例如,上述加权比较分析)来确定后续GAP版本2328中与当前GAP版本中的任何特定元素相匹配的一个或多个GUI元素。可视化逻辑2378可以接受来自于操作者的元素选择,其指定了感兴趣的任一GAP版本的一个或多个特定GUI元素,并且在其他GAP版本中找到相匹配的GUI元素。可替换地,可视化逻辑2378可以考虑当前GAP版本2326中的每个GUI元素,并且在后续GAP版本2328中找到相匹配的GUI元素。可视化逻辑2378高亮显示当前GAP版本2326和后续GAP版本2328中的匹配GUI元素(3112)。为此,可一见化逻辑2378可以向代理发出命令,以高亮显示任何特定的GUI元素。如果存在更多要考虑的GUI元素,则可视化逻辑2378尝试发现其他匹配。在任何时候,可视化逻辑2378可以进行检查来确定GUI比较器阈值接口2902是否已经改变(例如,操作者改变了滑块位置以选择新的阈值值)。可视化逻辑2378还可以在任何时候检测操作者是否期望检视不同的GAP。如果是,则可视化逻辑2378获取新的GAP选择(3114K然后,可视化逻辑显示GAP和GUI比较器阈值接口,并且如上所述地进4于处理。图1示出了具有改变向导架构(SAA)108的脚本分析器。尽管SAA108的特征的详细描述经在下面进一步提供,将首先给出对SAA108的简要介绍。SAA108接收指定当前GAP版本150和后续GAP版本152之间的GUI元素差异的GUI差异模型162。GUI差异模型162可以表示为XML模式。在另一实现中,当前和后续GAP树状模型,以及GUI差异模型162实现为存储在数据库中的关系模型。SAA108采用接口190来接收输入,并且与包括GUI元素元数据库138在内的各种组件进行通信。GUI元素元数据库138可以提供关于表示在GUI差异模型162、当前GAP150和后续GAP152中的GUI元素的详细信息。在一个实现中,SAA108包括脚本解析器166,其解析当前测试脚本164以获取当前测试脚本164的中间表示。中间表示可以是抽象语法树(AST)168或当前测试脚本164的其他表示。SAA108采用脚本分析器170,其分析AST168并且针对对象库174来调用对象库查找172,以定位由AST168标识的GUI元素的性质。脚本分析器170使用GUI元素元数据库138、对象库174、约束满足引擎188和GUI元素脚本改变规则194来定位有效的GUI元素差异模型,下面详细讨论。在一个实现中,脚本分析器170使用GUI类规则逻辑来进一步分析,在下面更详细地讨论。脚本分析器170基于对于GUI差异模型162和AST168执行的分析来输出经变换的测试脚本178、改变向导180和GAP改变i^明符184。图33示出了当前GAP版本150的GUI。表6示出了当前GAP版本150的GUI的当前GAP树状模型表示。表6中示出的当前GAP树状模型表示指定了GUI元素和当前GAP版本150的GUI元素的属性。表6示出了当前GAP树状模型支持包括嵌套GUI元素的GUI元素。例如,在图33中示出的StateList(状态列表)窗口3302对应于表6的第11行处(Lll)的GUI元素别名StateList,并且在表6的第18-21行和第59行处示出的嵌套GUI元素SaveFile(保存文件)、Exit(退出)、SaveChange(保存改变)、FileOpen(文件打开)、listboxSchool(列表框学校)分别对应于图33的保存文件3304、关闭表单3306、保持改变3308、打开文件3310和列表框学校3316。在一个实现中,对表6中示出的当前GAP树状模型和表8中下部示出的后续GAP树状模型的比较得到GUI差异模型162。GAP、GAP的GUI元素和GUI元素的值定义了GAP的状态。当前和后续GAP树状模型分别捕获当前和后续GAP版本(例如,150和152)的状态。在一个实现中,GAP状态由顺序号和别名以及其他属性来标识。例如,表6的第1行示出了具有值为0的SeqNumber的"状态"。SeqNumber表示当前GAP版本的唯一序列号。赋予该状态名称State—0—3556。属性Alias和Processid分别表示当前GAP版本150的别名和用于当前GAP版本150的实例进程标识符。回想,表6和表8示出当前和后续GAP树状模型支持包括嵌套GUI元素的GUI元素。尽管多个GUI元素可以使用同一别名(例如,表6中第2行和第11行处示出的StateList),但是GUI元素由UniqueID属性(例如,0x0和0x12,如表6的第3行和第12行处示出的)进一步区分。表6-当前GAP树讶犬模型-<StateSeqNumber="0"Name="State_0_3556"Alias="UniversityDirectoryO'Processld="3556">-<GUIEIementAlias="StateList"><UniquelD>OxO</UniquelD><HWND>0x170a64</HWND><Locationx="87"y="66"width="792"height="672"/><Class>WindowsForms10.Window.8.app4</Class><Style>0x16c)000</Style><ExStyle>0xc0050900</ExStyle>+<GLMEIementAlias="System">+<GLMEIementAlias="NAMELESS">L"國<GUIEIementAlias="StateList"><UniquelD>0x12</UniquelD>fs<HWND>0x170a64</HWND><l_ocationx="117"y="70"width="784"height="638"/><Class>WindowsForms10.Window.8.app4</Class><Style>0x16cf0000</Style><ExStyle>0xc0050900</ExStyle><table>tableseeoriginaldocumentpage62</column></row><table>+<GUIEIementAlias:"SelectSchoo旧tn"〉+<GUIEIementAlias="SchoolList">L59+<GUIEIementAlias="SchoolListbox">+<GUIEIementAlias="SelectStateBtn">+<GUIEIementAlias="StateList">L62+<GUIEIementAlias="StateListbox"></GUIEIement></GUIEIement></State>在表6第62行处示出的StateListBoxGUI元素对应于图33中示出的状态列表框3312。图33示出了水平导航条3314作为状态列表框3312的特征。表7示出了可以在GUI差异模型162中反映的、状态列表框3312的某些属性,其作为表8中示出的当前GAP树状模型和后续GAP树状模型之间的比较结果。表7-当前GAPStateListboxGUI元素模式-<GLMEIementAlias="StateListbox"><UniquelD>0x407</UniquelD><HWND>0x90b58</HWND><l_ocationx="173"y="86"width="368"height="274"/><Class>WindowsFormsmLISTBOX.app4</Class><Style>0x56"0ac1</Style><ExStyle>0xc0000a00</ExStyle>-<GUIEIementAlias="StateListbox"><UniquelD>0x410</UniquelD><HWND>0x90b58</HWND><l_ocationx="175"y="88"width="364"height="253"/><Class>WindowsForms10llSTBOX.app4</Class><Style>0x56110ac1</Style><ExStyle>0xc0000a00</ExStyle>-<V3lU6S><ValueSeqNumber="0">Alabama</Value><ValueSeqNumber="1">Alaska<A/alue><ValueSeqNumber="2">Arizona<A/alue><ValueSeqNumber="3">Arkansas<A/alue><ValueSeqNumber=~<ValueSeqNumber-"<ValueSeqNumber="<ValueSeqNumber="<ValueSeqNumber="<ValueSeqNumber="<ValueSeqNumber-"<ValueSeqNumber="<ValueSeqNumber="<ValueSeqNumber="<ValueSeqNumber=",<ValueSeqNumber="1<ValueSeqNumber="'<ValueSeqNumber="1"4">Califomia<A/alue>"5">Colorado</Value>"6">Connecticut</Value>r,>Delaware<A/alue>"8">DistrictofColumbia</Value>"9">Florida</Value>''10">Georgia</Value>"11">Hawaii<A/alue>"12">ldaho<A/alue>'13">lllinois</Value>"14">lndiana<A/alue>"15">low3<A/alue>■'16">Kansas<A/alue>■'17">Kentucky</Value><ValueSeqNumber="18">Louisiana</Value><ValueSeqNumber="19">Maine<A/alue><ValueSeqNumber="20'<ValueSeqNumber="21'<ValueSeqNumber="22'<ValueSeqNumber="23'<ValueSeqNumber="24'<ValueSeqNumber="25'<ValueSeqNumber="26'<ValueSeqNumber="27'<ValueSeqNumber="28'<ValueSeqNumber="29'<V3lueSeqNumber="30'<ValueSeqNumber="31'<ValueSeqNumber="32'<V3lueSeqNumber="33'<ValueSeqNumber="34'<ValueSeqNumber="35'<ValueSeqNumber="36'<ValueSeqNumber="37'<ValueSeqNumber="38'<V3lueSeqNumber="39'<ValueSeqNumber="40'<ValueSeqNumber="41'<ValueSeqNumber="42'<ValueSeqNumber="43'<ValueSeqNumber="44<ValueSeqNumber="45'<ValueSeqNumber="46'<ValueSeqNumber="47'<ValueSeqNumber="48'<ValueSeqNumber="49'<ValueSeqNumber="50:</V3lU6S>'>M3ryland</Value>'>M3ss3chusetts</V3lue>'>Michigan<A/alue>,>Minn6sot3</V3lue>'>Mississippi</Value>'>Missouri<A/alue>'>Mont3n3<A/3lus>'>Nebraska</Value>'>N6V3d3<A/3lU6>'>NewHampshire</Value>'>NewJersey<A/alue>'>N6wWIexico</Value>'>NewYork</Value>'>NorthCarolina</Value>'>NorthDakota</Value>'>Ohio<A/alue>'>Oklahoma<A/alue>'>Oregon<A/alue>'>P6nnsylv3ni3</V3lu6>'>Rhodelsland</Value>'>SouthCarolina</Value>,>SouthDakota</Value>'>T6ni16SS66<A/3lU6>,>T6X3S<A/3lU6>'>Ut3h<A/alus>,>V6rmont<A/3lu6>,>Virgiri3<A/3lu6>'>Washington</Value>'>WestVirginia</Value>'>Wisconsin<A/3lu6>'>Wyoming</Value><table>tableseeoriginaldocumentpage65</column></row><table>图34示出了后续GAP片反本152的GUI。表8示出了后续GAP版本152的后续GAP树状模型表示。表8中示出的后续GAP树状模型包括GUI元素和该GUI元素的属性。例如,图34中示出的窗口GUI对象学校3402对应于表8的第11行(Lll)处示出的GUI元素别名"School"(学校),并且表8的第23和24行处示出的嵌套GUI元素StateListBox和SchoolCombobox分别对应于图34的状态列表框3404和学校复合框3406。在一个实现中,GUI差异模型162从表6所示的当前GAP树状模型和表8所示的后续GAP树状模型之间的比较得出。<table>tableseeoriginaldocumentpage65</column></row><table>AAAAAAAAAA八AAA八AAA八AA八A八AA八AAACD①(D(DO)a)a)n)①a)(D①0)(T)CD①CDCD①①①CD①CD①n5n5(D①①>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>200910118535.8转溢齿被62/1253<Exstylevoxcoo50900</Exstylev+AGUIEIementAlias="menuStrip1">+AGUIEIementAlias="StatesList"v+AG匚IEIementAlias="schoolust"v+<〇UIEIementA=as="selectstatelButton">+AGUIEIementAliasH"se一ectschoo一Button"v+<GUIEIementAlias="StateListbox">+AGUIEIementAlias="schoolcombobox">as="schoor>as="state">as="state">as="location"vas="llocation">as="control">as="Control">asu"NumberofStudentsas="Numstudents"vasH"Ma一e、Fema一eFRatio"vas="GenderRatio"vas="Student/FacultyRatio"vas="SFRatio">as="SATverba一"vas="SATVerbal">lasH"SATMath"vias="SATMath">一asH"NiberofApp一icants"vias="NumApfDS"vias="PercentofAdmittance"vias="percAdmit"vias="PercentEnro一led"vias=--percentEnrol一ed"viasH"Academics(1-5)"vias="Academics">iasu"socia一(1-5》"vias="sociarvias="QualityofLife《1-5)">ias="QOLife">ias="AcademicEm力hasis"v+<GUIEIementAlias="AcadEmphasis+<GUIEIementAlias="Expenses">+<GUIEIementAlias="Expense">+<GUIEIementAHas="FinancialAid">+<GUIEIementAlias="FinancialAid"></GLHEIement></GLMEIement></State>表8中行18处示出的后续GAPmenuStriplGUI元素对应于图34中示出了的WinObjectGUI对象"菜单条"3408。表9示出的后续GAPmenuStriplGUI元素模式在表8中的第18行处示出了全条目,并且指明菜单条3408包括嵌套的GUI元素文件菜单,其包括分别在表9的第15行和第22-25行处示出的嵌套GUI元素OpenFile(打开文件),SaveFile(保存文件)、SaveAs(保存为)和Exit(退出)。表9-后续GAPmenuStriplGUI元素模式-<GUIEIementAlias="menuStripr><UniquelD>0x13</UniquelD><HWND>0xa0e62</HWND><l_ocationx="146"y="92"width="907"height="24"/><Class>WindowsForms10.Window.8.app.0.378734a</Class><Style>0x56000000</Style><ExStyle>0xc0010800</ExStyle>-<GUIEIementAlias="menuStrip1"><UniquelD>0x1c</UniquelD><HWND>0xa0e62</HWND><Locationx="146"y="92"width="907"height="24"/><Class>WindowsForms10.Window.8.app.0.378734a</Class><Style>0x56000000</Style><ExStyle>0xc0010800</ExStyle>l_15-<GUIEIementAlias="FileMenu"><table>tableseeoriginaldocumentpage68</column></row><table>图35示出了当前和后续GAP的并排视图3500,其有助于说明连续GAP版本之间的GUI元素的相似性以及差异。在视图3500中,存在多个GUI对象,这些GUI对象在连续的GAP版本之间具有相同的期望功能,尽管GUI对象的多个方面可以在连续GAP版本之间表现的不同。例如,参考图35,当前GAP版本150和后续GAP版本152之间的差异包括当前GAP版本150中的窗口StateList3302、列表框状3312、字段AcademicEmphasis(学术重点)3502和字段QualityofLifeScale(生活质量度量)(1-5)3504在后续GAP版本152中分别由窗口学校3402、列表框转帖3404、字段学术重点3506和字段生活质量(1-5)3508来表示。在另一个示例中,考虑在当前GAP版本150中实现的保存文件2204、关闭表格3306、保存改变3308和打开文件3310GUI对象,其在后续GAP版本152中实现为文件3510的孩子GUI对象,其中文件3510的孩子GUI对象是菜单条3408GUI对象的孩子GUI对象。定位GAP的GUI元素之间的差异是个挑战。例如,不易于证明列表框学校3316和复合框学校3406意味着在连续的GAP版本之'OpenFne">'SaveFHe">'SaveAsFile">Exit"></GUIEIement></GUIEIement></GUIEIement>间具有相同或类似的功能。如另一个示例,当前GAP版本150中的WinObject"选择学校"3318已经从后续GAP版本152的位置3512处移除。GUI差异模型包括GUI元素差异条目,其针对那些在当前GAP版本和后续GAP版本之间相匹配、但是在当前GAP版本和后续GAP版本之间特征不同的GUI元素列出了GUI元素的特征。GUI元素差异条目将指导脚本分析,如下面更详细地描述。图36示出了示例性GUI元素差异条目3604。图36示出了通过比较在表6中示出的当前GAP树状模型和在表8中示出的后续GAP树状模型而获得的GUI差异模型162。在一个实现中,GUI差异模型162实现为XML模式,其指定了具有相应GUI元素差异条目的连续GAP版本之间的每个GUI元素差异。在另一个实现中,GUI差异模型162嵌套GUI元素差异条目,以指示父亲和孩子GUI元素,并且GUI元素差异条目嵌套的级別指示相应的GUI元素在导航路径中距离父GUI元素(根)有多远。在一个实现中,GUI差异模型162忽略针对已经在连续GAP版本之间删除的GUI对象的GUI元素差异条目。表示已经在连续GAP版本之间修改或添加的GUI对象的每个GUI元素差异条目包括标签"Version(版本)",其值例如是0或1。换言之,不包括版本标签的GUI元素差异条目表示GUI对象在后续GAP版本之间没有被修改。版本值0和1分别指示版本的孩子元素是否表示当前GAP版本150或者后续GAP版本152中的GUI对象。例如,在图36中的第11行处示出的GUI差异条目3604指示在当前GAP版本150中实现的SeqNumbeF"8,,的列表框StateListbox值是"哥伦比亚区",而后续GAP版本152中的值是"佛罗里达州,,,如第23行处所示。在一个实现中,GUI差异条目3604包括第3行处的ParentChildldentifier元素,其标识了给定GAP版本中的两个GUI对象之间的关系,从而使得GUI类和继承约束可以得到批准(在下面进一步详细讨论)。简要地参考图45,GUI差异条目4504在第1行处指示当前GAP版本150中的窗口StateList对应于后续GAP版本152中的窗口School(学校),其分别由等于0和1的版本值在第22行处指示。StateList和学校GUI对象处于WindowsFormlO.Window.O类中,如第8和28行所示。StateList和学校GUI对象的子类标识符区分GUI对象(例如,分别为app4和app.0.0378734a)。GUI差异条目4504指示StateList和学校窗口的位置元素是不同的,如分别为第7和27行所示。然而,GUI差异条目4504还指示样式和ExStyle元素是一致的,如分别在第9-10和29-30行处所示。简要地参考图46,GUI差异条目4604在行3处指示当前GAP版本150中的列表框SchoolListbox对应于在第13行处指示的后续GAP版本152中的复合框SchoolCombobox。GUI差异条目4604指示SchoolListbox和SchoolCombobox的位置元素是不同的,如分别在第7和18行处所示。然而,GUI差异条目4604还指示类、样式和ExStyle元素是不同的,如分别在第8-10和19-21行处所示。特别地,WindowsFormsl0丄ISTBOX和WindowsFormsl0.COMBOBOX的一个或多个性质是不同的,与其他类的性质是不兼容,并且这两个类的GUI对象的孩子GUI元素可能具有一个或多个不兼容的性质。图37示出了用于当前GAP的当前测试脚本164。当前测试脚本164包括导航声明(例如,Ll和L6),该声明导航到GUI对象、对GUI对象执行读、写或其他动作(函数),以及执行函数的参数。例如,当前测试脚本164的第l行导航到窗口StateList,定位被标识为窗口StateList的孩子GUI对象的"打开文件,,,并且在XY坐标86,12处对"打开文件"GUI对象执行动作"点击"。通过一系列的导航和动作声明,当前测试脚本164打开文件"university.data",如第2-3行所示。当前测试脚本164基于WinObject"选择学校"中的坐标67,12选择学校"AcmeStateUniversity(顶级州立大学)",以作为第4-7行处的导航和动作声明的结果。以作为第8-10行处的声明的结果,当前测试脚本164将学术度量改为"3";并且作为第11-14行处声明的结果,将该改变保存到新的文件"university—revise.data"。图38示出了脚本解析器166产生的、作为当前测试脚本164的中间表示的当前测试脚本表示3800。在一个实现中,SAA108将当前测试脚本表示实现为抽象语法输入(AST)168。当前测试脚本表示3800表示向量(例如,当前测试脚本164),该向量的元素是表示当前测试脚本164的导航声明的向量。换言之,当前测试脚本表示3800将导航声明表示为导航到GUI对象并且执行对那些GUI对象的动作的测试声明向量。表10示出了脚本解析器166可以用于产生当前测试脚本表示3800的语法。终端func、动作和var分别表示导航到GUI对象的平台专用函数(例如,窗口、VbEdit和WinObject);对GUI对象执行的读、写或其他动作(函数);以及这些函数的参数。表10-脚本解析器语法navstmt::=func(arg)|navstmt.Navstmt|navstmtactionargfullnavstmt::=var=navstmt|navstmtactionargarg::=expr|",,'arg|脚本解析器166将测试脚本声明向量表示为包含那些导航到GUI对象的函数的函数名称和参数的节点的排序序列。测试脚本声明矢量的节点包括源节点和目标节点。例如,脚本解析器166可以将当前测试脚本164的第1行所对应的测试脚本声明向量表示为源节点StateList3802和目标节点"打开文件"3804。测试脚本声明向量的节点还可以包括定位在源节点和目标节点之间的中间节点。例如,脚本解析器166可以将对应于当前测试脚本164的第13行的测试脚本声明向量表示为源节点StateList3802、中间节点"保存数据记录"3806和目标节点"文件名称"3808。在一个实现中,脚本分析器170使用测试脚本声明向量来分析GUI差异模型162中由GUI元素差异条目标识的GUI对象的似乎合理的导航路径,在下面进一步详细地描述。脚本分析器170还可以使用测试脚本声明向量来分析对象库174中标识的似乎合理的GUI对象,这也将在下面进一步详细地讨论。脚本解析器166将导航和动作函数的参数赋值为表达式、变量和常数。参数表示测试脚本声明向量所导航到的GUI对象的物理性质、以及用于对那些GUI对象执行动作的值。例如,"86,12"坐标3812标识指示设备在"打开文件"3804GUI对象上执行动作"点击"3810的位置,该GUI对象是窗口StateList3802的孩子GUI对象。脚本分析器170使用通过测试脚本声明向量导航的GUI对象的名称(例如,StateList3802和"打开文件"3804),来定位存储在对象库(OR)174中的GUI对象的相应物理性质。在一个实现中,脚本分析器170使用OR查找逻辑172来从对象库174返回由测试脚本声明向量所导航到的GUI对象的物理性质。在一个实现中,OR查找逻辑172被划分为两个子函数l)查找逻辑,适于定位和获取由测试脚本声明向量(例如,3802-3804、3802-3806-3808和3802-3814)所导航到的GUI对象的物理性质;以及2)定位符逻辑,其找到并且返回在GUI差异模型162中对应于具有给定物理性质的GUI对象的GUI元素差异条目(节点)。OR查找逻辑172可以包括路径遍历逻辑(在下面进一步详细讨论),用以标识源节点GUI对象与测试脚本声明向量所导航到的目标节点GUI对象之间的测试脚本声明向量的可能导航路径。表11以XML模式的形式示出了对象库174的一个实现。对象库174包括用于在当前测试脚本164中所标识的当前GAP版本150的每个GUI对象的GUI对象条目。对象库174可以由诸如QuickTestPro(QTP)、RationalRobot和Comp而areTestPartner的脚本编写工具生成。脚本分析器170可以查询对象库174以标识测试脚本声明向量所导航到的GUI对象的物理性质,测试脚本声明向量由当前测试脚本表示3800来表示。GUI对象的物理性质可以指示GUI对象是否隐藏、只读、数量和默认值,如表12所示。例如,脚本分析器170分析测试脚本声明向量中的GUI对象3802-3814。"19,22"坐标3818标识指示设备在GUI对象SchoolListbox3814上执行动作"点击"3812的位置,对象SchooListbox3814是窗口StateList3802的孩子GUI对象。脚本分析器170调用OR查找逻辑172来定位GUI对象3802和3814的物理性质。OR查找逻辑172定位窗口StateList3802和WinObjectSchoolListbox3814的物理性质,如表ll中的第3和12行处所示。脚本分析器170使用从对象库174获取的物理性质来定位GUI差异模型162中的相应GUI差异条目(例如,4504和4604)。GUI差异条目4504和4604指示当前GAP版本150中的窗口StateUst3802和WinObjectSchoolListbox3814分别对应于后续GAP版本152中的窗口学校3402和WinObjectSchoolCombobox3406。在一个实现中,脚本分析器170采用OR查找逻辑172以使用由测试脚本声明向量导航到的GUI对象的物理性质来遍历GUI差异模型162。OR查找逻辑172函数从GUI差异模型162返回GUI元素差异条目(例如,3604、4504和4604),其表示测试脚本声明向量(例如,3802-3804-3810-3812,3802-3806-3808-3820-3822和3802-3814-3826-3818)所导航到的GUI对象。表11-对象库-<XYZRep:ObjectRepositoryxmlns:XYZRep="http:〃www.vendorXYZ.com/XYZ/ObjectRepository">-《YZR印:Objects〉L3-<XYZRep:ObjectClass-"Window"Name="StateList">+<XYZRep:Properties>+<XYZRep:Basiddentification>+<XYZRep:CustomReplay>L7-《XYZR印:ChildObjects〉+<XYZRep:ObjectClass="WinObject"Name="OpenFile">+<XYZRep:ObjectClass-"WinObject"Name="StateListbox">+<XYZRep:ObjectClass="WinObject"Name="SelectState">+<XYZRep:ObjectClass="WinObject"Name="SelectSchool">+<XYZRep:ObjectClass="WinObject"N3me="SchoolListbox">〈/XYZR印:ChildObjects〉<table>tableseeoriginaldocumentpage74</column></row><table>RegularExpression="0">WindowsFormsmLISTB。X.app4</XYZRep:Value></XYZRep:Praperty>-<XYZRep:PropertyName="nativeclass"Hidden="0"ReadOnly="0"Type="STRING"><XYZRep:ValueRegularExpressbn="0">WindowsForms1(XUSTBOX.app4</XYZRep:Value></XYZRep:Property>-<XYZRep:PropertyName="height"Hidden="0"ReadOnly="0"Type="NUMBER"><XYZRep:ValueRegularExpression="0">260</XYZRep:Value></XYZRep:Property>-<XYZRep:PropertyName="enabled"Hidden="0"ReadOnly="0"Type="BOOL"><XYZRep:ValueRegularExpression="0">-1</XYZRep:Value></XYZRep:Property>L39</XYZRep:Properties>-<XYZRep:Basicldentification><XYZRep:PropertyRef>y</XYZRep:PropertyRef><XYZRep:PrapertyRef>x</XYZRep:PrapertyRef><XYZRep:PropertyRef>windowstyle</XYZRep:PropertyRef><XYZRep:PropertyRef>windowextendedstyle</XYZRep:PropertyRef><XYZRep:PropertyRef>width</XYZRep:PropertyRef><XYZRep:PrapertyRef>visible</XYZRep:PrapertyRef><XYZRep:PropertyRef>regexpwndclass</XYZRep:PropertyRef><XYZRep:PropertyRef>objectclass</XYZRep:PropertyRef><XYZRep:PropertyRef>nativeclass</XYZRep:PropertyRef><XYZRep:PropertyRef>height</XYZRep:PropertyRef><XYZRep:PropertyRef>enabled</XYZRep:PropertyRef></XYZRep:Basicldentification>-<XYZRep:CustomRepl3y><XYZRep:BehaviorName="simclass"Type="STRING">WindowsForms10llSTBOX.app4</XYZRep:Behavior></XYZRep:CustomReplay>-<XYZRep:Comments><XYZRep:CommentName-"miccommentproperty"/></XYZRep:Comments>〈XYZR印:ChildObjects/>〈/XYZR印:Object〉图39示出了可以实现脚本分析器170的示例脚本分析器系统(SAS)3900。SAS3900包括耦合至处理器3904的存储器3902和接口190。在一个实现中,接口190与GUI元素元数据库138以及GUI比较器160通信,以分别接收GUI元素元数据140和GUI差异模型162。接口190连接至与各种其他系统和资源进行通信的网络3906(例如,互联网)。在另一实现中,存储器3卯2包括GUI元素元数据140,以及产生GUI差异模型162的GUI差异模型逻辑2380和GUI元素差异条目3910。存储器3902还包括脚本解析器逻辑3912,其接收当前测试脚本164并产生AST168,将AST168处理为当前测试脚本表示3914,并且产生测试脚本声明向量3916(例如,3802-3804-3810-3812,3802-3806-3808-3820-3822和3802-3814-3826-3818)。存储器3902进一步包括接收GUI差异模型162的脚本分析逻辑3920,以及用于当前测试脚本164的当前测试脚本表示3914,包括测试脚本声明向量3916。在一个实现中,脚本分析逻辑3920调用OR查找逻辑172以在对象库174中定位与测试脚本声明向量3916相匹配的GUI对象条目3922。在一个实现中,脚本分析器170调用OR查找逻辑172以在各种外部源中定位与测试脚本声明向量3916相匹配的GUI对象条目3922。当测试脚本声明向量3916(例如,3802-3804-3810-3812,3802-3806-3808-3820-3822和3802-3814-3826-3818)采用常数而不是其值只能在运行时确定的表达式来标识GUI对象名称时,OR查找172函数可以使用GUI对象名称和GUI对象的性质来有效地定位正确的GUI对象条目3922,并且在GUI差异模型162中定位与GUI对象条目3922相匹配的GUI元素差异条目3910。例如,由3802-3804-3810-3812表示的测试脚本声明向量标识窗口GUI对象StateList3302和列表框GUI对象SchoolListbox3316,在图37的第6行处示出的当前测试脚本164中示出Window("StateList").WinObject("SchoolListbox").Click19,22。OR查找172函数分别使用GUI对象的已知名称,即StateList和SchoolListbox,来定位针对每个GUI对象3302和3316的GUI对7象条目3922。OR查找172函数在GUI差异模型162中定位相应的GUI元素差异条目4504和4604。脚本分析逻辑3920输出对应于3402和3406的经变换的测试脚本声明3926:Window("School").WinObject("SchoolCombobox").Click294,14。GUI类M^则逻辑3928可以^^用GUI对象名称来定位性质,该性质用于确认经变换的测试脚本声明3928不违反GUI元素脚本改变规则194和约束。在一个实现中,脚本分析器170将GUI类规则逻辑3928与约束满足引擎188结合使用,以确定GUI元素脚本改变规则194和约束的违反。例如,当经变换的测试脚本声明3926访问后续GAP版本152中不存在的GUI对象时,和/或经变换的测试脚本声明3926试图设置与该GUI对象的GUI类不兼容的GUI对象的值时,经变换的测试脚本声明3926违反了施加于GUI对象的约束。约束满足引擎188确认经变换的测试脚本声明3926,以帮助核实不正确的操作将在经变换的测试脚本声明3926中标识出来以便程序员解决。在一个实现中,约束满足引擎188接收兼容性查询消息(例如,来自于诸如GUI元素元数据库138的外部系统),其指定了两个GUI元素类型。CSE188分析该两个类型,并且返回指示该两个类型是否是兼容的兼容性核实消息。如果GUI对象改变违反了约束满足规则3932,那么兼容性核实消息提供关于该违反的详细信息。约束满足引擎188和GUI类规则逻辑3928可以推断关于GUI对象的GUI类信息,该GUI对象出现在测试脚本声明向量3916和经变换的测试脚本声明3926的导航路径中,并且其存在没有明确定义。在一个实现中,约束满足引擎188和/或GUI类规则逻辑3928<吏用编-泽时类型确i人和GUI类推断确i人的组合,A人而确iU则试脚本声明向量3916和经变换的测试脚本声明3926的正确性。例如,当测试脚本声明向量3916采用标识GUI对象的、其值仅可以在运行时确定的表达式时,OR查找172函数可以使用路径遍历逻辑3924来分别标识对象库174中可能的相应GUI对象条目3922和GUI元素差异条目3910和GUI差异模型162。GUI类规则逻辑3928和约束满足引擎188继而标识可以代替表达式的有效的GUI对象条目3922,以及满足有效的测试脚本声明向量3916和经变换的测试脚本声明3926的GUI元素差异条目3910。类似地,经变换的测试脚本声明3928采用标识GUI对象的、其值仅可以在运行时确定的表达式时,OR查找172函数使用路径遍历逻辑3924来标识可以替代表达式来标识对象的、所有可能的相应GUI元素差异条目3910,并且GUI类规则逻辑3928和约束满足引擎188确认对用以形成经变换的测试脚本声明3928的表达式的每个GUI对象替代。例如,考虑经变换的测试脚本声明3928:VBWindow("s").VBWindow(el).VBWindow(e2).VBWindow("d"),其中源节点GUI对象命名为"s",目标节点GUI对象命名为"d",但是表达式el和e2计算运行时导航路径中的中间节点值。遍历逻辑3924确定中间节点(GUI对象),其可以包括在由源节点"s"和目标节点"d"标识的可能的导航路径中。路径遍历逻辑3924分析GUI差异模型162以标识用于替代el和e2的可能常数,例如,"a"和"f,,从而使导航路径表达式"s.a.f.d,,中的替代GUI对象形成的经变换的测试脚本声明向量3928可以被GUI类规则逻辑3928和/或约束满足引擎188确认。通过标识通向以源节点s开始的目标节点d的可能的导航逻辑,GUI类规则逻辑3928和约束满足引擎188可以推断出经变换的测试脚本声明3928是否有效。如果遍历逻辑3924没有标识至少一个导航路径,那么经变换的测试脚本声明3928是无效的。可替换地,如果遍历逻辑3924通过遍历两个对象(例如,el和e2)来标识从s通向d的导航路径,假设表达式el和e2赋值为所发现的导航路径中节点的名称,则可以确认经变换的测试脚本声明3928。遍历逻辑3924推断由表达式el和e2在编译时计算的可能名称。参考图47提供遍历逻辑3924的正式描述。表达式el和e2可以利用对象名称ot和|3相应地替换,并且原始表达式转换为遍历策略S二s—a—p—d。函数"first(s),,计算可以从节点s遍历的边的集合。这些边得到由变量a表示的对象的集合。函数"first(s)"可以使用路径遍历逻辑3924中所包括的图可达性算法来计算,并且遍历逻辑3924返回可以导航到目标节点的边。根据图47,a={a,b,c}。那么对于oc的每个元素,可以计算函数"first"。结果,得到卩二(e,f,g),其中"first(a)"={e,g},且"first(b)"={e},以及"first(c)"={^,以及"first(e),,={0},"irst(f),,=(d》,以及"first(g)"={d}。根据计算的节点值,路径遍历逻辑3924形成包括所有已计算路径的集合的工作列表W,W={(s,a,e),(s,a,g,d),(s,b,e),(s,c,f,d)}。路径遍历逻辑3924分析W的每个导航路径以确定该导航路径是否包含节点s和d。被路径遍历逻辑3924标识为包括节点s和d(作为源和目标节点)的导航路径被认为是有效的导航路径。如果遍历逻辑3924没有标识导航路径,那么经变换的测试脚本声明3928是无效的,因为从指定的起始GUI元素开始不能达到目标GUI元素。遍历逻辑3924类似地确认测试脚本声明向量3916。再次参考图47,无效的表达式的示例是VBWindow("s").VBWindow(el).VBWindow(e2).VBWindow(e3).VBWindow("d")。节点s和d之间的所有导航路径最多具有两个对象。因此,不论在运行时针对表达式el、e2和e3计算什么值,表达式都不能标识源对象和目标对象之间的有效导航路径中的对象。无效的表达式的另一示例是VBWindow("s").VBWindow("b").VBWindow(el).VBWindow("d"),因为针对表达式el不存在使得导航路径有效的值(即,其形成从"s,,到"d"的完整路径)。约束满足引擎188和GUI类规则逻辑3928可以推断关于GUI对象的GUI类信息,该GUI对象出现在测试脚本声明向量3916和经变换的测试脚本声明3926的导航路径中。SAA108的一个特征是维持对连续测试脚本之间的GUI对象的操作的兼容性。当经变换的测试脚本声明3926试图访问在后续GAP版本152中不存在的GUI对象和/或试图设置与GUI对象的类型不兼容的GUI对象的值时,经变换的测试脚本声明3926违反了GUI元素脚本改变规则条目3930和/或对GUI对象施加的约束^L则3932。在经变换的测试脚本178中包括向量之前,约束满足引擎188和GUI类规则逻辑3928对经变换的测试脚本声明3926进行类型检查,从而可以标识无效的操作,并且可以输出相应的改变向导消息3938。约束满足引擎188和GUI类规则逻辑3928使用GUI对象的类之间的继承的和子型(sub-typing)关系。类的概念包括分层的容纳(例如,GUI范围和系统层次)。对象库174和GUI差异模型162包括针对每个GUI对象条目3922和GUI元素差异条目3910的GUI类信息(例如,对GUI对象的类进行注释)。例如,参考表12的第1行,SchoolListBox是具有第3-39行处所列出的性质的WinObject类。在另一个示例中,参考图36、图45和图46,每个GUI差异条目(例如,3604、4504和4604)的第l行处,指示了GUIElement类型。分别如图36、图45和图46中的第7、8和8行所示,指示了每个GUI对象的类。GUI对象的类指示GUI对象包括与相同类中的其他GUI对象共同的特有属性、性质和/或特性,这些共同的属性、性质和/或特性可以扩展到孩子GUI对象和/或由孩子GUI对象继承。例如,图36的第7行处指示StateListboxGUI对象处于包括如图36的第11行处所示值的WindowsFormslO丄istBox.app4类。换言之,WindowsFormslO丄istBox.叩p4的GUI对象的一个性质是期望这些GUI对象具有值。类是GUI框架用于对GUI对象分类的概念。例如,类ListBox定义形状、功能和对于该类的GUI对象的交互规则。将类分配给GUI对象便于约束满足引擎188和GUI类规则逻辑3928跟踪连续GAP版本(例如,150和152)之间的改变,以及执行对GUI对象上的操作的正确性的扩展检查。再次参考39,在一个实现中,GUI类规则逻辑3928和约束满足引擎188确定GUI对象是否已经改变,并且设置GUI元素改变状态3934。例如,GUI元素改变状态3934可以分别使用数值指示符0、1和2来指示GUI对象未改变、改变而违反GUI元素脚本改变^L则194和/或约束满足规则3932、改变而不违反GUI元素脚本改变规则194和/或约束满足规则3932。脚本分析逻辑3920可以使用GUI元素改变状态3934、GUI元素脚本改变规则条目3930和约束满足规则3932来搜索改变向导消息库192,并且标识合适的改变说明符184和改变向导消息标识符3936。GUI元素脚本改变规则条目3930可以指示GUI对象的元素是否可以按照特定方变。例如,GUI元素脚本改变规则条目3930可以指示特定GUI对象的元素不能从只读改变为可编辑。在另一示例中,改变GUI对象的类可能导致孩子GUI对象违反GUI元素脚本改变规则条目3920,因为孩子GUI对象的一个或多个属性与父GUI元素的类改变冲突。此外,可以利用菜单项代替按钮,并且用于访问和操纵按钮的正确动作将对菜单无效。在另一个实现中,GUI元素改变状态3934是才是供改变的详细描述的消息。GUI元素改变状态3934还可以利用数值指示符(例如,-1)来指示GUI对象已经从后续GAP版本152中删除。当GUI对象已经从后续GAP版本152中删除、并且经变换的测试脚本声明3926包括对该GUI对象的引用时,脚本分析逻辑3920输出指示GUI对象已经删除的改变向导消息3938。在一个实现中,脚本分析逻辑3920输出改变说明符184,其包括违反GUI元素脚本改变规则194和/或约束满足规则3932的经变换的测试脚本声明3926,从而程序员可以评估是否对经变换的测试脚本声明3926和/或后续的GAP版本152进行修改,以获取期望的结果和/或满足看起来尚未满足的期望要求。在另一个实现中,脚足规则3932的经变换测试脚本声明3926的输出。GUI元素脚本改变规则194和约束满足规则3932的每一个可以包括指示符,该指示符指示违反的程度或严重程度,以及即使违反已经发生,脚本分析逻辑3920是否可以输出经变换的测试脚本声明3926。不论脚本分析逻辑3920是否输出经变换的测试脚本声明3926,脚本分析逻辑3920可以输出改变向导180,其包括与每个违反相对应的改变向导消息3938。对于指示违反GUI元素脚本改变规则194和/或约束满足规则3932中的改变的每个相应的GUI元素改变状态3934,脚本分析逻辑3920输出改变向导消息标识符3936和相应的改变向导消息3938的集合。改变向导消息3938可以包括错误路径删除类型(WP-1)3940、错误路径相同(WP-2)类型3942和改变元素(CE-l和CE-2)类型3944。改变向导180和包括3940、3942和3944的改变向导消息3938在下面进一步详细描述。图40示出了用于从对象库(OR)174获取GUI对象条目3922的性质的流程图900。脚本解析逻辑3912将测试脚本声明向量3916解析为表示导航到GUI对象的函数和参数的有序节点序列(4002)。脚本解析逻辑3912评估有序节点序列的第一节点(4004),并且将第一节点标识为源节点以及分配指明源节点在有序序列中位置的序列标识符(4006)。脚本解析逻辑3912评估有序节点序列的下一节点,以确定下一节点是否是最后的节点(4008),当下一节点不是最后节点时,将下一节点标识为中间节点(4010)。为中间节点分配指明该中间节点在有序序列中位置的序列标识符。脚本解析逻辑3912可以标识源节点和目标节点之间的中间节点。脚本解析逻辑3912将有序序列中的最后节点标识为目标节点,并且为该目标节点分配指明目标节点在有序序列中位置的序列标识符(4012)。OR查找172针对测试脚本声明向量导航到的、对应于有序节点序列的每个GUI对象执行对象库查找,从而标识每个GUI对象条目3922(4014)。在一个实现中,有序节点序列由路径遍历逻辑3924、GUI类规则逻辑3928和/或约束满足引擎188使用,以确认当前测试脚本164的声明。在一个实现中,脚本分析器170使用有序节点序列来推断GUI对象的GUI类和继承(子类)。如果源节点、目标节点和/或中间节点中的至少一个是仅可在运行时标识的表达式,则路径遍历逻辑可以标识可能的GUI对象条目3922,并且GUI类规则逻辑3928和/或约束满足引擎188确定满足测试脚本声明向量3916而不违反GUI类规则逻辑3928和约束满足规则3932的GUI对象条目3922。OR查找172获取测试脚本声明向量所导航到的GUI对象条目3922的性质(4016)。图41示出了用于标识对应于GUI对象条目3922的GUI差异条目3910的流程图4100。OR查找172接收对应于测试脚本声明向量3916的源节点、目标节点和所有中间节点的GUI对象的性质。在一个实现中,OR查找172采用路径遍历逻辑3924来标识由对应于测试脚本声明向量所导航到的源节点和目标节点标识的导航路径的可能的GUI差异条目3910(4102)。如果GUI元素差异条目3910中的至少一个是仅可以在运行时标识的表达式,则^各径遍历逻辑3924标识形成源节点和目标节点之间导航路径的一个或多个可能的GUI差异条目3910(4104)。路径遍历逻辑3924确定GUI差异条目3910是否形成相应的源和目标节点GUI差异条目3910之间的有效导航路径(4106)。GUI类规则逻辑3928和/或约束满足引擎188确定行动导航路径的GUI差异条目3910是否违反GUI类规则逻辑3928(4108)和约束满足规则3932(4110)。GUI类规则逻辑3928和/或约束满足引擎188指示与形成有效导航路径的每个GUI对象条目3922相对应的GUI元素差异条目3910(4112)。基于GUI差异条目3910,脚本分析逻辑3^0基于GUI类规则逻辑3928指示的GUI元素改变(例如,GUI元素改变状态3934)的类型来确定输出改变说明符和约束满足引擎188结果(4114)。当^^径遍历逻辑3924标识遍历相应的源和目标节点GUI差异条目3910之间的无效号码的GUI差异条目3910的导航路径时,路径遍历逻辑3924指示该导航路径无效(4116)。在一个实现中,GUI类规则逻辑3928和约束满足引擎188不对无效的导航路径进行分析,并且不将经变换的测试脚本声明3926作为结果输出。在一个实现中,路径遍历逻辑3924输出标识无效导航路径的警告消息。在另一个实现中,改变向导包括指示无效导航路径的警告消息。改变向导180可以包括各种警告消息,这些警告消息反映在脚本分析器170处理期间标识的任何数量的情形。改变向导180可以包括对应于脚本分析器170和/或脚本分析器170的任何逻辑(例如,脚本解析逻辑3912、脚本分析逻辑3920、OR查找逻辑172、路径遍历逻辑3924和GUI类规则逻辑3928)和/或约束满足引擎188所遇情形的警告和/或信息性消息。脚本分析逻辑3920可以输出改变向导180(4118),其具有与所记录的GUI类规则逻辑3928和约束满足规则3932违反相对应的改变向导消息3938(例如,3940、3942和3944)。图42示出了用于后续GAP版本152的经变换的测试脚本178。经变换的测试脚本178可以包括脚本分析逻辑3920自动变换的声明。经变换的测试脚本178还可以包括在一全测改变向导180之后人工输入的声明。在图42示出的示例中,脚本分析逻辑3920输出在第1、6-11、14-19和21-22行处具有经变换测试脚本声明的经变换测试脚本178,而脚本编写者已经人工输入第2-4行。脚本分析逻辑3920基于GUI类规则逻辑3928和GUI元素脚本改变规则194,来确定要输出至经变换测试脚本178的经变换的测试脚本声明3926。可以在任一复杂性级别处指定GUI类^L则逻辑3928和GUI元素脚本改变规则194的复杂性以及GUI差异模型162和GUI元素元数据的丰富程度,以便在无需程序员输入的情况下得到脚本分析逻辑3920输出了多少经变换的测试脚本178。例如,脚本分析逻辑3920将图37中所示的当前测试脚本164的第1-3行变换为图42中所示的第1、5-7行的经变换测试脚本声明3926。程序员可以输入经变换测试脚本178的第2-4行,因为那些行包括新的GUI对象(例如,"ToolbarWindow32"和值"MyComputer(我的电脑)",针对所述新的GUI对象,GUI差异模型162可以不包括标识当前GAP版本150中的相应GUI对象的信息。在一个实现中,假设第6行中的"university.data"表示路径遍历中的目的地,^^据其可以确定中间测试脚本声明,则GUI差异^t型162和GUI元素元数据提供脚本分析逻辑3920所需的GUI类、GUI定型和映射信息,以推断经变换的测试脚本178的行2-4。在另一个示例中,GUI差异模型162和/或GUI元素元数据包括GUI类和映射信息,脚本分析器可以将GUI类和映射信息用来将表示WinObject"保存文件,,的当前测试脚本164的第11行变换为表示WinObject"menuStripl"的"保存文件"孩子GUI对象的经变换的测试脚本声明3926的第16-17行。图43示出了脚本分析器180可以输出的改变向导180。在一个实现中,脚本分析逻辑3920基于由GUI类规则逻辑3928和/或约束满足引擎188执行的分析,来输出指示经变换测试脚本声明3928是否违反GUI元素改变规则194的改变说明符184。脚本分析器170输出的改变说明符184还可以包括经变换测试脚本声明3926。脚本分析器170确定对于GUI对象和经变换测试脚本声明3928的修改,该修改受到对经变换测试脚本声明3928表示的GUI对象的修改影响。在一个实现中,脚本分析逻辑184确定当前测试脚本164引用的、在后续GAP版本152中被删除的GUI对象。脚本分析器170输出可以包括改变向导消息3938、经变换测试脚本声明3926和/或两者的改变说明符184。在一个实现中,脚本分析器170输出的改变说明符184包括改变向导消息标识符3930、经变换的测试脚本声明3926和/或两者。脚本分析器170可以在改变向导消息3938中标识的、连续GAP发布之间的GUI对象的某些类型的改变包括(A)添加到后续GAP版本152中的新GUI对象;(B)从后续GAP版本152中删除的GUI对象;(C)GUI对象的一个或多个属性的值被修改;(D)GUI对象的值是不同的;以及(E)GUI对象的类型是不同的。当从当前GAP版本150和后续GAP版本152中相应添加和移除GUI对象时,发生GUI对象的A类和B类改变。例如,将WinObjectmenustrip13408添加到后续GAP版本152中是A类改变,而将WinObject"选择学校"3304移除是B类GUI对象改变。参考图4,注意已经在412处移除了"选择学校"。C类改变的示例是窗口名称从StateList3302改变为学校3402。从诸如列表和复合框的GUI对象中添加或移除值是D类改变的修改示例。例如,当前GAP版本150中的列表框StateListbox3312在后续GAP版本152中标识为StateListbox3404,并且参考GUI差异条目3604,SeqNumber的值二"8"分别是用于连续GAP版本的"哥伦比亚区"和"佛罗里达州"。改变GUI对象的"类型,,可以包括替换用于表示对象的窗口的类和/或改变描述GUI对象所采用的值的高级概念。例如,将静态标签的类型改变为只读复合框是E类修改。另一个E类改变的示例包括将列表框"SchoolListbox"3316改变为复合框"SchoolCombobox"3406。脚本分析器170对GUI类规则逻辑3928和/或约束满足引擎188标识的改变类型进行分类,包括错误路径类型l(WP-l)差错,其在脚本访问可以在后续GAP版本152中删除的GUI对象时发生(例如,参见"选择学校,,3318和图4示出的412)。WP类型2(WP-2)差错发生在对错误的GUI对象进行读或写的脚本中。在经变换的测试脚本声明3926导航到错误的GUI对象并且读取错误的GUI对象的值和/或调用关于错误的GUI对象的方法时发生WP-2差错。例如,分别考虑当前测试脚本164和经变换的测试脚本178的第2行和第6行中的声明Window("StateList").Dialog("Open").WinListView("SysListView32").Select"university,data"。该声明从WinListView"SysListView32"中选择了"university.data,,。然而,经变换的测试脚本178的第2-4行可以导航到以及调用对于错误的GUI对象"university.data,,的"选择"方法,因为在经变换的测试脚本178的第2-4行中引用的GUI对象是当前测试脚本164中未引用的新GUI对象。因此,当现有GUI对象的性质被修改和/或其他GUI对象被添加到后续GAP版本152中时,这些操作的推断结果是经变换的测试脚本声明3926可以访问以及读取与那些本来作为目标的对象不同的对象的值。已改变元素(CE)差错发生在声明试图访问其类型、性质、或默认值在后续GAP版本152中改变的GUI对象时(CE-1)。例如,GUI差异条目3604指示针对连续的GAP版本来说,对于SeqNumber的值="8"是"哥伦比亚区,,和"佛罗里达州"存在不同的值,并且脚本分析逻辑3920因而可以发出指示已经发生CE-1类型差错的改变向导消息3944。当经变换的测试脚本声明3926尝试对没有考虑对元素施加的新约束的GUI对象进行操作时,例如试图向只读文本框写数据时,脚本分析逻辑3920可以发出对应于CE-2类差错的改变向导消息3944。参考表13中示出的GUI元素差异条目,在当前测试脚本164的第18行处引用的WinObject"AcadScale,,是可编辑对象,而该对象在后续GAP版本152中已经被变换成了只读的WinObject"Academics(1-5)"对象。在一个实现中,脚本分析逻辑3920输出改变向导消息3944以指示已经发生CE-2类型。<table>tableseeoriginaldocumentpage87</column></row><table></GLHEIement></GUIEIement></V6rsion><Version>1-<GUIEIementAlias="Academics(1-5)"><UniquelD>0x2ff</UniquelD><HWND>0x70d0e</HWND><l_ocationx="597"y="388"width="111"height="17"/><Class>WindowsForms10.STATIC.app.0.378734a</Class><Style>0x5600000d</Style><ExStyle>0xc0000800</ExStyle>-<GUIEIementAlias="Academics(1-5)"><UniquelD>0x308</UniquelD><HWND>0x70d0e</HWND><Locationx="597"y="388"width="111"height="17"/><Class>WindowsForms10.STATIC.app.0.378734a</Class><Style>0x5600000d</Style><ExStyle>0xc0000800</ExStyle>-<V3lU6S><V3lueSeqNumber="3">Ac3demics(1-5)<A/3lue><A/3lU6S></GUIEIement></GUIEIement></Vsrsion></GLMEIement>了解针对GUI对象的修改类型便于脚本分析逻辑3920确定要输出的合适的改变向导消息3938和经变换的测试脚本声明3926。例如,当经变换的测试脚本声明3926试图在文本框对象中设置值时,尽管对象的类型已经改变为只读复合框,脚本分析逻辑3920使用合适的接口输出改变向导消息3944,该消息建议如何修改变换的测试脚本声明3926以选择复合框中的值。图44示出了用于输出经变换的测试脚本声明3926的流程图。脚本分析逻辑3920检查当前测试脚本178、当前GAP版本150和/或经变换的测试脚本声明3926中所引用的每个GUI对象的GUI元素改变状态3934(4402)。脚本分析逻辑3920确定经变换的测试脚本声明的GUI对象是否已经添加到后续GAP版本152中(4404)。GUI类规则逻辑3928和/或约束满足引擎188可以分析所添加的GUI对象,以确定是否由于经变换的测试脚本声明3926导航到了错误的GUI对象(例如,不正确使用同一别名的两个GUI对象)以及读取错误的GUI对象的值和/或调用关于错误的GUI对象的方法而发生了WP-2差错(4406)。经变换的测试脚本声明3926包括在经变换的测试脚本178中,并且输出相应的改变向导消息3938(4408)。当脚本分析逻辑3920确定GUI对象已经从当前GAP版本150中移除时(4410)。脚本分析逻辑3920在当前测试脚本178中定位引用这些移除对象的声明。脚本分析器170将这些声明称作第一引用声明(FRS)(4412)。获取这些声明中使用的变量,并且使用其值在FRS中定义的变量的声明被称作次级引用声明(SRS)(4414)。GUI类规则逻辑3928和/或约束满足引擎188可以分析GUI对象以确定WP-1差错是否已经基于脚本声明试图访问已经在后续GAP版本152中删除的GUI对象而发生(4416)。在当前测试脚本178的声明引用其值指向已移除GUI对象的变量时,当前测试脚本178的声明被认为是SRS。在一个实现中,脚本分析器170输出标识的SRS为经变换的测试脚本声明3926和相应的改变向导消息3938,从而使测试人员可以检查并且决定如何修改SRS(4408)。当修改了GUI对象的一个或多个属性的值时,执行C类修改(4418)。针对具有修改的属性的GUI对象在经变换的测试脚本声明3926中标识FRS和SRS,并且输出测试脚本声明3928。当GUI对象的值被添加或移除时,发生D类修改(4418)。在对引用其值已经改变的GUI对象的FRS进行定位之后,发现SRS并且脚本分析器确定归因于SRS的影响。当GUI对象的类型被修改时,那么E类修改发生,其包括定位FRS、检测GUI对象的新类型、调用相应的类型包容(sub-sumption)规则(例如,GUI类规则逻辑3928可以应用的规则)(4418)。GUI类规则逻辑3928和/或约束满足引擎188可以分析修改的GUI对象,以确定是否由于以下原因而发生了CE-1和CE-1差错(4420):经变换的测试脚本声明3926试图访问其类型、性质或默认值在后续GAP版本152中发生改变的GUI对象和/或试图对没有考虑施加于GUI对象的元素的新约束的GUI对象进行操作。在一个实现中,脚本分析器170输出所标识的SRS作为经变换的测试脚本声明3926以及相应的改变向导消息3938,从而使测试人员可以检查并且决定如何修改SRS(4408)。图48示出了用于输出GAP改变说明符184的流程图。GUI差异模型162产生(4802)并且脚本分析器170接收GUI差异模型162和GUI元素元数据140(4804)。脚本分析器170接收包括测试脚本声明向量3916的当前测试脚本表示3914(4806)。脚本解析逻辑3912将测试脚本声明向量3916解析为向量节点,以确定测试脚本声明向量3916导航到的GUI对象。脚本解析逻辑3914针对测试脚本声明向量3916所标识的每个GUI对象调用OR查找172,以从对象库174获取GUI对象的性质(4810)。路径遍历逻辑3924分析对应于测试脚本声明向量3916标识的GUI对象的GUI元素差异条目3910的导航路径(4812)。GUI类规则逻辑3928基于GUI类规则逻辑3928和GUI元素脚本改变^L则3930来分析GUI元素差异条目3910,以标识导航路径对应的有效的GUI元素差异条目3910(4814)。约束满足引擎188基于约束满足规则3932分析GUI元素差异条目3910,以确定要输出的改变说明符的类型,包括是否输出经变换的测试脚本声明3926、改变向导消息3938或两者(4816)。脚本分析逻辑3920输出对应于由GUI类规则逻辑3928以及约束满足规则3932标识的GUI元素改变类型的改变说明符(4818)。在一个实现中,SAA108使用自适应编程,该自适应编程包括类和对象图,以及同样对待所有对象的抽象。遍历逻辑3924、约束满足引擎188和GUI类规则逻辑3928可以区分复合和简单的GUI对象类型。复合类型包含字段,而简单类型不包含字段。设T是类型名称的有限集,并且F是字段名称或标签的有限集,并且两个区分符号该GF和^eF。类型图是有向图G=(V,E,L),从而VGT,节点是类型名称L:F,边由字段名称标记,或在字段不具有名称时由""标记。由""标记的边称作聚合边,并且由字段名称标记的边称作引用边。聚合边和引用边之间的差异随着以下示例变得清楚。面向对象语言中的类字段指明了某些类的实例,并且这些字段具有用于引用字段的名称。类的每个字段由字段名称和该字段是其实例的类(类型)名称来定义。字段名称是类型图中相应引用边的标签。当类指明了GUI对象ok并且其他类指明了包含在对象ok对中的GUI对象On时,类型图具有两个节点一个针对对象Ok并且另一个针对对象Ok包含的对象On。相应类的名称充当它们的类型。两个无名对象之间的关系使用类型图中标记为""的边表示。E;LxVxV,边是标签和节点的向量积;对于每个vgV,所有具有异常",,的出边(outgoingedge)的标签是不同的;对于每个vEV,其中v表示具体(concrete)类型,v~^>vEE。对象图是有标记的有向图O二(V,,E,,L,),在将对象映射到它们的类的给定函数Class的情况下,该图是类型图G-(V,E,L)的实例,如果满足以下条件对于所有对象ogV,,o是由函数Class(o)给出的具体类型的实例;对于每个对象oev,,其出引用边的标签完全是那些包括从父类继承的边和其标签的Class(o)的引用的标签集合;对于每个边。^。'ge,,Class(o)具有引用边v"^",使得v是Class(o)的父类型,并且u是Class(o,)的父类型。对象图是GAP中表示的对象及其相互引用的模型。对象图中的字段集合是字段名称标记的边的集合。对象图中的聚合边的集合是由""标记的边的集合。类型图G=(V,E,L)中的路径是节点和标签的序歹'jPg=(^e/,v/e2v..ev),其中VjeV并且viei+'>vi+l,O^i^n。具体路径定义为指明引用边的类型名称和标签的交替序列。通常,具体路径Pe是相应的类型路径pG的子集,即Pc^pG。对象图具有特殊对象OrGV',Or是由函数rOOt给出的对象图0中的根对象Or[V'的集合0—cv该对象具有类型Class(or)=root,并且其与其集合中对象的关系通过Or—40,EE,表示。如果给出某些类型的对象o,则遍历逻辑3924、约束满足引擎188和GUI类规则逻辑3928—起工作来标识满足特定条件的一个或多个可达对象。执行的任务等同于确定描述导航路径的测试脚本声明向量3916和/或经变换的测试脚本声明3926是否有效。在经变换的测试脚本声明3926中指定的导航路径可以认为是对于对象可达能力的约束规范。经由遍历来完成对可读对象的发现。标记为e的边的遍历对应于获取e字段的值。对象图中的每条边是类型图中具有部分边的图像仅当存在类型v,和vj寸在O中存在边e(o,,o2),从而对象o,处于类型v,中,v,具有类型vj々e部分,并且02处于类型V2中。路径P的第一节点称作P的源,并且最后节点称作P的目标。由对象v,开始并且由来自于一组路径p的路径引导的对对象图O的遍历通过对O执行深度优先搜索来进行,其中p用于精简搜索。得到的遍历历史是沿与给定具体路径集合一致的对象路径的对对象图的深度优先遍历。从满足特定标准的给定对象o标识所有可达对象的问题形式化如下。对于每对类c和c,,边e的集合可以通过计算FIRST(c,c,)来标识,当且仅当对于类型c的对象,通过以边e开始的路径达到类型c,的对象是可能的。更准确地,FIRST(c,c,)=eeE,从而存在C的对象图O和对象o以及o,,使得1)Class(o)=c;2)Class(o,)=c,;以及3)oe'o'。最后的条件,oe'o,指示在对象图中从o到o,存在(曰)路径,包括标记为e的边,后面是图中任何边的序列。缺少关于实际图的信息由存在运算符3表示。当外部组件的名称定义为字符串常量时,对测试脚本(例如,经变换的测试脚本178)的静态检查任务被极大地简化。当使用表达式指定GUI对象的名称时,可能直到运行时才确定这些表达式的值。类型图便于脚本分析器系统3900推断保持GUI对象名称的表达式和变量类型。脚本分析器系统3900基于在推断表达式和变量类型的自适应编程中定义的遍历图分析(TGA)应用概念。自适应策略S二(R,兀,5)表示对象图中的路径,其中R^s,d》,其中s和d是对象图中路径的源GUI对象和目标GUI对象,并且R£O,其中O是类型图中的对象集合,兀={e,a},其中e是字段的集合并且cc是指明某些边aee的集合的变量集合,并且5={』,"}是分别表示对象和属性的转换边的集合。策略S中的每个元素是某些对象的名称,或者是指明对象和/或属性的变量。表达式兀(0,0,)指明对象{0,}的集合,使得该集合中每个对象o,是由某些边ee兀表示的对象的一部分,从而e(o,o,)。例如,测试脚本声明可以被认为是如下策略,该策略针对测试脚本声明Window("a,').VBWindow("b")和Window("a").VBWindow("b").property("ReadOnly")分别定义了策略图边a」b和a"b。因此,策略是测试脚本声明(例如,经变换的测试脚本声明3926)的抽象、以及类型图中路径集合的抽象。例如,公司的组织结构的类型图可以包括作为某些GUI对象的根类型的CEO,其包含整数类型的GUI对象"股份"和并且聚合类型CTO。CTO是这样的类型,其具有薪水类型的GUI对象"支票"和CEO类型的老板。支票类型依次具有浮点类型字段amount(量)和CEO类型的发布者(issuer)。针对以下测试脚本声明的策略CEO"al』a2^amount:上述用于类型图的Window("CEO").Window(strexpl).Window(strexp2).property("amount")指明策略S,其中s:CEO,d=amount、oc1是指明经由字符串表达式strexpl计算的对象的变量,以及a2指明经由字符串表达式strexp2算的属性对象的变量。计算兀(CEO,o,)来获取类型{CTO},并且计算ti(CTO,o,)来获取类型(CEO,check(支票)}。策略中的每个节点被分配以不同的序列号,并且节点表示为对(i,兀)。如果给出函数:NxN—5和A兀兀x兀—S以及两个连续的自然数k和k+l,则函数AZ计算在S中被分配了这些数字的节点之间的转换边;如果不存在转换边,则为0。相应地,如果在某些类型图中给出两个兀q和兀r,函数A兀计算节点之间的转换边;如果不存在转换边,则为0。当直到运行时才能计算测试脚本声明中字符串表达式的值时,可以推断该字符串表达式。路径遍历逻辑3924、约束满足引擎188和GUI类规则路径3928—起工作,以通过将经变换的测试脚本声明3926变换为具有替代字符串表达式的变量的自适应策略,从而使用类型图来分析经变换的测试脚本声明。约束满足引擎188和/或GUI类规则路径3928针对每个变量计算可能的值,并且针对每个策略生成遍历路径。如果源对象和目标对象之间没有标识路径,则可以报告类型GUI元素脚本改变规则条目3930、改变向导消息3938和改变说明符184。如果标识了至少一个路径,则生成相应的改变向导消息3938和改变说明符184,因为计算对象名称的表达式的值可能不在所计算的路径中。在一个实现中,路径遍历逻辑3924、约束满足引擎188和GUI类规则路径3928可以类似地应用于确认当前测试脚本164中的测试脚本声明。路径遍历逻辑3924标识一个或多个可能的路径,而约束满足引擎188和GUI类规则路径3928确认针对该表达式和声明的路径。针对类c和c,的每个配对,约束满足引擎188和GUI类规则路径3928通过计算其中存在类型c的对象的FIRST(c,c,)来计算边e的集合,该计算可以通过以边e开始的路径到达类型c,的对象。如上所述,FIRST(c,c,)-eeE,从而存在C的对象图O和对象o以及o,,使得1)Class(o)=c;2)Class(o,)=c';以及3)oe'o'。最后的条件,oe'o,指示在对象图中存在(3)从o到o,的路径,其包括标记为e的边,后面是图中任何边的序列。在一个实现中,方法FIRST使用两个逻辑集合实现路径遍历逻辑3924和GUI类规则路径3928。表14说明了路径遍历逻辑3924和GUI类规则路径3928。路径遍历逻辑3924采用S中的源和目标組件的集合R,并且集合TT为输入参数。路径遍历逻辑3924输出满足给定策略的类型图中的有效路径的树。不能让某些输入组件进入路径树,因为它们不发起任何有效路径。在一个实现中,路径遍历逻辑3924调用GUI类规则逻辑3928,其依次递归地调用自己。GUI类规则逻辑3928使用三个参数作为路径中潜在当前模式的组件o、策略S中节点的序列号i以及S中被分配了两个连续自然数i和i+l的节点之间的转换边5。GUI类规则路径3928的目标是将路径中的潜在当前模式的组件o染色为红色或蓝色。染为红色的对象o被认为是类型图中的路径的尽头,该路径不通往指明的目标节点。否则,节点染为蓝色,并且将该颜色传播至随后包括在路径树中的源节点。GUI类规则路径3928在序列号i等于或大于策略中的节点数量l兀l时,和/或不存在来自于当前节点的转换边时完成。当GUI类规则路径3928完成时,GUI类规则路径3928将当前节点染为蓝色。在调用检查节点颜色的过程中,并且其中节点时蓝色时,将节点附接至路径树中的其父节点。在一个实现中,约束满足引擎188和GUI类规则逻辑3928—起工作来计算用于每对类c和c,的边e的集合,其中标识可以通过以边e开始的路径到达类型c,的对象的类型c的对象。对每个经变换的测试脚本声明3926独立地应用逻辑,其中,使用其值在执行经变换的测试脚本178之前未知的字符串表达式来指定外部GAP对象。约束满足引擎188和经变换的测试脚本声明3926—起工作来推断字符串表达式可以在运行时赋值的外部对象的可能的名称。表14-路径遍历和GUI类规则逻辑PathTraversalLogic(ReS,tteS)forallseRdoGUIclassruleslogic(s,0,A/(0,1))ifcolor(s)=redthenremovesfromRendifendforGUIclassruleslogic(ogO,/eN,Se5)if/'5|tt|or3=0thencolor(o)—blueelseforallo'gtt/'(0,o')doifAtt(o,o')=3thenGUIclassruleslogic(o',/+1,厶/'(/',/+1))ifcolor(o')=bluethenAddChildToTree(o,o')endifendifsndfo厂ifchildren(cO=0thencolor(o)4redelsecolor(o)—blueendifendif通常,相同的字符串表达式在相同脚本范围中的不同声明中使用。相同的表达式计算相同的值,其中表达式位于相同的范围中,假设在这些表达式中使用的变量值没有改变。使用程序分析技术,路径遍历逻辑3924、约束满足引擎188和GUI类规则路径3928—起工作,以便在编译时检测其变量在运行时未改变的表达式。路径遍历逻辑3924标识可以替换测试脚本声明中的字符串表达式的外部GUI对象的一个或多个可能的名称。虽然从外部GUI对象可能的名称中标识约束满足引擎188和GUI类规则逻辑3928,但是那些GUI对象不违反约束满足规则3932和/或GUI元素脚本改变规则194。如果给出在相同的脚本范围中的不同声明中使用的相同的表达式,并且如果在这些表达式中使用的变量值没有被这些声明之间执行的其他表达式改变,则约束满足引擎188和/或GUI类规则逻辑3928标识通过这些字符串表达式计算的外部GUI元素的名称的集合。通过采用路径遍历逻辑3924计算的名称的集合的交集来获取GUI对象的集合。例如,针对经变换的测试脚本声明3926表达式Window("CEO").Window(strexpl).Window(strexp2).property("amount"),考虑上面讨论的用于类型图的策略图SlCEO』al』a2,amount。约束满足引擎188和/或GUI类规则逻辑3928计算用于类型模式变量al二"[CTO》和a2={boss,salary)的值。假设存在不同的策略图S2,其中针对某些其他类型图,Programmer"a2^bonus用于y["Progmmmer"][strexp2].attribute("bonus")的。注意,在两个声明中,字符串表达式变量strexp2是相同的,并且因此,字符串表达式变量strexp2在两个策略图中是由相同的类型模式变量指定的。假设通过应用路径遍历逻辑3924,计算类型模式变量a2=(salary》的值。在一个实现中,为了确定满足Sl和S2两者的变量cc2的值,GUI类规则路径3928标识针对这两个策略而计算的a2的值的集合的交集。得到的集合a2=(salary)是精简导航路径的结果。该示例示出了可以由约束满足引擎188和/或GUI类规则路径3928使用的、使用上下文敏感数据流分析的精简导航路径的思想。通过确定在给定范围内指明GUI对象名称的变量的定义和使用,针对使用变量的每个经变换的测试脚本声明来计算值的集合。然后,采用这些值的交集以确定该变量在考虑的范围中可以采用的公共值。脚本分析器系统3900提供模块化完整性,以作为用于确保经变换的测试脚本178的可维护性的机制。模块化完整性规定经变换的测试脚本178中的每个声明仅可以直接与属于该经变换的测试脚本178所创建的GUI的对象通信。其中通过调用由经变换的测试脚本178导出的函数来访问GUI对象的经变换的测试脚本178的组成不应该违反模块化完整性。脚本分析器系统3900通过分析经变换的测试脚本声明3924的组成,来确保经变换的测试脚本178的模块化完整性,从而构建当前测试脚本164和经变换的测试脚本178之间的迁移关系。例如,声明Func("y","z")(在相关测试脚本族中发现)导航到导出函数Func的某些测试脚本中的外部GUI对象y的字段z。因此,相关的测试脚本族中的某些测试脚本可能通过隐含地经由函数Func互操作测试脚本而违反模块化完整性,即使该通信可能由给定的测试族的约束禁止。在一个实现中,脚本分析器系统3900在使用作为每个测试脚本中的全局注释的一部分的关键字约束来定义测试脚本时,对模块化约束进行编码。这些约束定义了GAP和它们的GUI屏幕,以及给定的测试脚本可与之通信的其他测试脚本。示例是指定约束为'constraintsscreen(约束屏幕)("Q")test—scripts("P,S")的声明。该约束有效地禁止了给定的测试脚本明确或隐含地与其他GAP、GUI屏幕和测试脚本的通信(除了屏幕Q和测试脚本P和S之外)。在一个实现中,约束满足引擎188通过维护施加在测试脚本和GAP上的约束满足规则3932来确保不违反此类约束,并且约束满足引擎188在违反这些约束时发出改变向导消息3938。路径遍历逻辑3924、约束满足引擎188和GUI类规则路径3928的时间复杂度是每个经变换的测试脚本178的类型图大小的指数。因为路径遍历逻辑3924、约束满足引擎188和GUI类规则路径3928包括在类型图中搜索一个或多个节点或边,其中包含每个节点的循环,时间复杂度是0((V+E广a+l)),其中V是节点数量、E是类型图中的边的数量,并且max是策略中节点的最大数量。在变量表中存储后续者的操作的时间复杂度为O(l)。通常,策略中节点的数量max(|tt|)远远小于类型图中的节点数量。在策略中,针对每个节点可以不必遍历所有图节点。关于路径遍历逻辑3924、约束满足引擎188和GUI类规则路径3928的计算复杂度的理论极限是指数级。然而,实验性评估示出,在实际中,对于大模式,其运行时间小,因为通常路径表达式短。图49示出了具有经济成本引擎("经济成本引擎架构")110的测试脚本变换分析器。尽管将在下面进一步提供经济成本引擎架构110特征的详细描述,但是将首先给出对经济成本引擎架构110的简要介绍。在一个实现中,经济成本引擎架构U0接收指定当前GAP版本150和后续GAP版本152之间GUI元素差异的GUI差异模型162。GUI差异模型162可以表示为XML模式。GUI元素差异模型162可以包括对应于当前GAP版本150和后续GAP版本152的当前和后续GAP树状模型。在一个实现中,经济成本引擎182从GUI元素差异模型162接收当前GAP树状模型。在另一实现中,当前和后续GAP树状模型以及GUI差异模型162实现为存储在数据库中的关系模型。经济成本引擎架构110采用接口190来接收输入并且与包括GUI元素元数据库138的各种组件进行通信。GUI元素元数据库138可以提供关于GUI差异模型162、当前GAP版本150和后续GAP版本152中表示的GUI元素的详细信息。经济成本引擎架构IIO包括脚本解析器166,其解析当前测试脚本164以获取当前测试脚本164的中间表示。中间表示可以是抽象语法树(AST)168或当前测试脚本164的其他表示。在一个实现中,经济成本引擎架构IIO采用对AST168和GUI差异模型162进行分析的经济成本引擎182。经济成本引擎182可以调用对象库(OR)查找逻辑172来搜索对象库174和GUI差异模型162,以便在GUI差异模型162中定位由AST168表示的GUI元素。经济成本引擎182包括经济成本模型逻辑4996,其使用由AST168标识的GUI元素和GUI差异模型162来生成综合GAP改变说明符4984,其被用以在经济模型176库中搜索相应的GUI元素改变成本规则。在一个实现中,经济成本模型逻辑4996使用GAP改变说明符184和综合GAP改变说明符4984,来在经济模型176库中搜索相应的GUI元素改变成本规则。经济成本引擎182应用每个GUI元素改变成本规则,以荻取相应的GUI变换成本,从该GUI变换成本生成测试脚本变换成本才艮告186,下面进一步讨论。经济成本引擎182还可以使用来自于性能度量库4998和成本报告库5288的历史测试度量以便于获取GUI变换成本,将在下文详细讨论。经济成本引擎182可以基于可用信息的不同组合来生成测试脚本变换成本报告186,包括1)GAP改变说明符184和/或综合GAP改变说明符4984;2)GAP改变说明符和当前测试脚本164;3)GAP改变说明符184、当前测试脚本164和当前GAP版本150(例如,当前GAP树状模型);4)当前测试脚本164和具有GUI元素差异条目的GUI差异模型162;以及5)GAP改变说明符184、当前测试脚本164和GUI差异模型162。相同或不同信息的其他组合也可以采用。可用信息的各种组合由经济成本引擎182用于分析接收的综合GAP改变说明符4984和/或生成综合GAP改变说明符4984,该综合GAP改变说明符4984被经济成本模型逻辑4996用于定位和获取GUI变换成本以及生成测试脚本变换成本才艮告。GUI变换成本的准确性可以部分地依赖于实际成本与GUI变换成本所指示的成本之间的变化有多小。大的变化对应于较低的准确性,而小的变化对应于较高的准确性。换言之,GUI变换成本的度。在一个实现中,GUI变换成本的准确性由于由经济成本引擎182接收的信息粒度而改变。例如,作为接收GAP改变说明符184、当前测试脚本164和GUI差异模型162的经济成本引擎182的结果而生成的GUI变换成本的准确度可以比仅基于GAP改变说明符184而生成的GUI变换成本更高。经济成本引擎182可以采用对提供给经济成本引擎182的信息粒度的缺失进行补偿的各种经济模型,在下面进一步详细讨论。在一个实现中,经济成本引擎182接收GAP改变说明符184、当前测试脚本164和当前GAP版本150,并且生成GUI差异模型162。换言之,经济成本引擎182可以基于AST168、当前GAP版本150和GAP改变说明符184(下面进一步讨论),在不依赖于实际的后续GAP版本152的情况下,来生成测试脚本变换成本报告186。例如,经济成本引擎182分析GAP改变说明符184和当前GAP版本150(例如,从GUI差异模型162接收的当前GAP树状模型),并且生成综合GAP改变说明符4984。在另一个实现中,经济成本引擎182基于GAP改变说明符184来生成测试脚本变换成本报告186,而不分析GUI差异模型162和/或AST168。经济成本引擎182可以利用从改变向导消息库192获取的改变向导消息,来生成测试脚本变换成本报告186。改变向导消息可以提供关于对应于GAP改变说明符184、GUI元素改变成本规则和/或GUI差异条目的各种改变的信息。图34示出了后续GAP版本152的GUI。在一个实现中,GUI差异模型162从表6中示出的当前GAP树状模型和表8中示出的后续GAP树状模型之间的比较中得出。在另一个实现中,经济成本引擎182使用GAP改变说明符184来分析当前GAP树状模型,以确定可以产生后续GAP树状模型的GAP改变,经济成本引擎182根据该GAP改变来生成综合GAP改变说明符4984。例如,在实际构建后续GAP版本152之前,程序员可以使用GAP改变说明符184来标识对当前GAP版本150提出的各种改变。经济成本引擎182分析GAP改变说明符184和当前GAP树状模型,以生成与所提出的后续GAP树状模型相对应的综合GAP改变说明符4984。在一个实现中,经济成本引擎182包括GAP改变说明符逻辑,其使用当前GAP树状模型和接收的GAP改变说明符184来生成综合GAP改变说明符4984。在一个实现中,经济成本引擎架构IIO生成综合GAP改变说明符4984,作为在与当前GAP版本150进行交互会话期间记录由程序员标识的各种提出的改变的结果。图50示出了用于当前GAPGUI的当前测试脚本5000。当前测试脚本5000包括导航声明(例如,LI和L6),该声明导航到GUI对象、对GUI对象执行读、写或其他动作(函数),以及这些函数的其他参数。例如,当前测试脚本5000的第l行导航到窗口StateList,定位标识为窗口StateList的孩子GUI对象的"打开文件,,,并且对XY坐标"86,12"处的"打开文件"GUI对象执行动作"点击"。通过一系列导航和动作声明,当前测试脚本5000打开如第2-3行所指示的文件"university.data"。基于第4-6行从StateListbox中选择"州,,并且激活SchoolListbox。基于第8行处的WinObject"选择学校"中的坐标67、School—Constant,作为第7-17行处导航和动作声明的结果,当前测试脚本5000通过使用"针对下一循环"继续从SchoolUstbox中选择位于"州"中的学校"顶级大学"和"州立大学"。当前测试脚本5000使用第11-15行处的条件分支来将"顶级大学"的学术度量为改变"3",并且将"州立大学"的学术度量改变为"2",并且作为行16的结果,将单独改变进行保存。作为第18-20行处声明的结果,当前测试脚本5000将所有改变保存到新文件"university—revise.data"。图51示出了脚本解析器166产生的、作为当前测试脚本5000的中间表示的当前测试脚本表示5100。在一个实现中,经济成本引擎架构110将当前测试脚本表示实现为抽象语法树(AST)168。当前测试脚本表示5100表示向量(例如,当前测试脚本5000),该向量的元素是表示当前测试脚本5000的导航声明的向量。换言之,当前测试脚本表示5100表示导航声明为导航到GUI对象并且对那些GUI对象执行的动作的测试脚本声明向量。脚本解析器166将测试脚本声明向量表示为节点的有序序列,其中节点包含函数名称和导航到GUI对象的那些函数的参数。测试脚本声明向量的节点包括源节点和目标节点。例如,脚本解析器166可以将对应于当前测试脚本5000第1行的测试脚本声明向量表示为源节点StateList5102和目标节点"打开文件"5104。测试脚本声明向量的节点还可以包括位于源节点和目标节点之间的中间节点。例如,脚本解析器166可以将对应于当前测试脚本5000第19行的测试脚本声明向量表示为源节点StateList5102、中间节点"保存数据记录"5106和目标节点"文件名称,,5108。对应于当前测试脚本5000第19行的测试脚本声明向量可以进一步表示为(5102-5106-5108-5120-5122),其中包括方法"设置"5120和值"university—revise.data"5122。测试脚本声明向量可以包括循环和条件分支节点(例如,分别是循环5124和分支5126)。在一个实现中,循环5124节点之后是循环变量(例如,school—constant5130),下界到上界(例如,J5132和K5134)的值的范围被赋值给该循环变量,并且在循环5124的范围内的表达式中使用(例如,67,school—constant坐标5136)。分支5126随后可以是一个或多个条件(例如,条件-15138和条件-25140)。经济成本引擎182可以使用循环5124和分支5126节点以及范围值和条件(例如,J5132、K5134、条件陽l5138和条件-25140)来迭代地评估当前测试脚本表示5100。在一个实现中,GAP改变说明符184包括模型说明符(在下面进一步详细讨论),该模型说明符标识为了获得对应于循环5124的GUI变换成本而使用的GUI元素改变成本规则。循环5124的GUI元素改变成本规则可以得到获取GUI变换成本的经济成本模型逻辑4996,该逻辑表示与应用于循环5124的范围(例如,图50中的行8-16)内的测试脚本声明的GUI变换成本的从下界到上界(例如,J5132和K5134)的范围中的值的数量相等的乘数。例如,基于下界到上界(例如,J5132和K5134),对应于循环5124的GUI变换成本可以等于10,并且对应于循环5124的范围(例如,图50中的行8-16)内的测试脚本声明的GUI变换成本可以等于500,从而对于包括循环5124(例如,行7-17)的测试脚本声明而得出总GUI变换成本5000。在另一个示例中,通过应用循环5124的GUI元素改变成本规则获取的GUI变换成本可以表示单个加一又的值(例如,50),经济成本模型逻辑4996将该加权值与对应于循环5124的范围内的测试脚本声明的GUI变换成本相加,从而针对包括循环5124(例如,第7-17行)的测试脚本声明而得到550的总GUI变换成本。分支5126的GUI元素改变成本规则可以得到GUI变换成本,该GUI变换成本是基于分支5126的范围内的条件(例如,条件-15138和条件-25140)数量而获取的,并且针对分支5126的GUI变换成本和分支5126的范围内的测试脚本声明相加以获取总GUI变换成本。在另一个实现中,对应于分支5126的GUI变换成本是应用于对应于分支5126的范围内的测试脚本声明的GUI变换成本的乘数。例如,两个条件(例如,条件-15138和条件-25140)存在于分支5126的范围内,对应于针对分支5126的GUI变换成本为2,并且分支5126的范围内的各行的GUI变换成本是IOO,从而针对包括分支5126(例如,第11-15行)的测试脚本声明而得出总GUI变换成本200。脚本解析器166将导航和动作函数的参数赋值为表达式、变量和常数。参数表示了测试脚本声明向量所导航到的GUI对象的物理性质和用于对那些GUI对象执行动作的值。例如,"86,12"坐标5U2标识了指示设备在"打开文件"5104GUI对象上执行动作"点击"5110的位置,"打开文件"5104GUI对象是窗口StateList5102的孩子GUI对象。经济成本引擎182使用测试脚本声明向量所导航到的GUI对象的名称(例如,StateList5102和"打开文件"5104),来定位存储在对象库174中的GUI对象的相应物理性质,标识相应的GUI差异条目,并生成综合GAP改变说明符4984。在一个实现中,经济成本引擎182使用OR查找逻辑172在对象库174中定位测试脚本声明向量所导^t到的GUI对象的相应物理性质,并且在GUI差异模型162中定位相应的GUI差异条目。经济成本引擎182生成综合GAP改变说明符4984,并调用经济成本模型逻辑4996来使用GAP改变说明符184和综合GAP改变说明符4984在经济模型176库中定位相应的GUI元素改变成本规则。在一个实现中,OR查找逻辑172被划分为两个子函数l)查找逻辑,其适于定位并获取测试脚本声明向量(例如,5102-5104、5102-5106-5108和5102-5114)所导航到的GUI对象的物理性质;以及2)定位符逻辑,其发现并返回对应于具有给定物理性质的GUI对象的GUI差异模型162中的GUI元素差异条目(节点)。经济成本模型逻辑4996生成综合GAP改变说明符4984,其被用于根据源自OR查找逻辑172的查找逻辑和定位符逻辑来定位GUI元素改变成本规则。OR查找逻辑172可以包括路径遍历逻辑(将在下面进一步详细讨论),以标识源节点GUI对象和测试脚本声明向量所导所航到的目标节点GUI对象之间的测试脚本声明向量的可能导航路径。经济成本?I擎182可以查询对象库174以标识由当前测试脚本表示5100表示的测试脚本声明向量所导航到的GUI对象的物理性质。GUI对象的物理性质可以指示GUI对象是否隐藏、只读、数量和默认值,如表12所示。例如,经济成本引擎182分析测试脚本声明向量中的GUI对象5102-5114。"19,22"坐标5118标识了指示设备在GUI对象SchooListbox5114上执行动作"点击"5116的位置,GUI对象SchooListbox5114是窗口StateList5102的孩子GUI对象。经济成本引擎182调用OR查找逻辑172来定位GUI对象5102和5114的物理性质。OR查找逻辑172定位窗口StateList5102和WinObjectSdioolListbox5114的物理性质,如表11的第3和12行处所示。经济成本引擎182使用获取自对象库174的物理性质来定位GUI差异模型162中相应的GUI差异条目(例如,4504和4604)。GUI差异条目4504和4604指示当前GAP版本150中的StateList5102和WinObjectSchoolListbox5114分别对应于后续GAP版本152中的窗口School3402和WinObjectSchoolCombobox3406。在一个实现中,经济成本引擎182采用OR查找逻辑172来使用测试脚本声明向量所导航到的GUI对象的物理性质遍历GUI差异模型162。OR查找逻辑172函数从GUI差异模型162返回表示测试脚本声明向量(例如,5102-5104-5110-5112、5102-5106-5108-5120-5122和5102-5114-5126-5118)所导航到的GUI对象的GUI元素差异条目,并且经济成本模型逻辑4996生成相应的综合GAP改变说明符4984。表12示出了可以针对对应于SchoolListbox5114的GUI对象条目而在对象库中定位的物理性质。图52示出了可以实现经济成本引擎182的经济成本引擎系统5200。经济成本引擎182包括耦合至处理器5204的存储器5202和接口190。在一个实现中,接口190与GUI元素元数据库138和GUI差异模型162通信,以分别接收GUI元素元数据140和GUI差异条目3910。接口190连接至与各种其他系统和资源通信的网络3906(例如,互联网)。在另一个实现中,存储器5202包括GUI元素元数据140、产生GUI差异模型162和GUI差异条目3910的GAP改变说明符逻辑5290。存储器5202还包括脚本解析器逻辑3912,其接收当前测试脚本164并且产生AST168;处理AST168作为当前测试脚本表示3914;并且产生测试脚本声明向量3916(例如,5102-5104-5110-5112、5102-5106-5108-5120-5122和5102-5114-5126-5118)。存储器5202还包括经济成本模型逻辑4996,在一个实现中,经济成本模型逻辑4996调用OR查找逻辑172在对象库174中定位测试脚本声明向量3916所引用的GUI对象条目3922。在另一个实现中,经济成本引擎182调用OR查找逻辑172在各种外部源中定位与测试脚本声明向量3916相匹配的GUI对象条目3922。当测试脚本声明向量3916(例如,5102-5104-5110-5112、5102-5106-5108-5120-5122和5102-5114-5126-5118)采用常数而不是其值仅可以在运行时确定的表达式来标识GUI对象名称时,OR查找逻辑172函数可以使用GUI对象名称和GUI对象性质来有效地定位正确的GUI对象条目3922,并且在GUI差异模型162中定位与GUI对象条目3922相匹配的GUI元素差异条目3910。例如,由5102-5104-5110-5112表示的测试脚本声明向量表示窗口GUI对象StateList3302和列表框GUI对象SchoolListbox3316,在图50的第6行处示出的当前测试脚本164导航声明中示出Window("StateList").WinObject("SchoolListbox").Click19,22。针对GUI对象3302和3316,OR查找逻辑172分别使用GUI对象的已知名称,即StateList和SchoolListbox,来定位每个GUI对象条目3922。OR查找逻辑172在GUI差异模型162中定位相应的GUI元素差异条目4504和4604。在一个实现中,经济成本模型逻辑4996分析GUI元素差异条目4504和4604,并且生成一个或多个相应的综合GAP改变说明符4984。使用GAP改变说明符184,经济成本模型逻辑4996在经济模型176库中定位一个或多个相应的GUI元素改变成本^L则5246,并且应用该成本^L则来获得GUI变换成本5248。GUI变换成本5248可以包括对应于改变当前测试脚本164和测试后续GAP版本152的成本。换言之,经济成本模型逻辑4996确定生成对应于GUI对象School3402和SchoolCombobox3406的经变换的测试脚本声明的成本,并且确定使用该经变换的测试脚本声明来测试后续GAP版本152的成本Window("School").WinObject("SchoolCombobox"),Click294,14。每个GUI元素改变成本规则5246可以包括各种属性,包括改变说明符标识符5250、系统资源利用标识符5252、GUI改变成本估计5254(其指示估计时间和/或测试相应GUI元素改变所需的资源)、从属改变说明符标识符5256、从属性等级5258、质量等级5260、复杂度等级5262和从属GUI元素改变成本5264。驻留在经济模型176库中和/或经济模型176库外部的每个经济模型(经济成本模型逻辑4996通过接口190对其进行利用)可以包括更多、更少或不同的GUI元素改变成本规则5246属性。经济成本模型逻辑4996使用GAP改变说明符184和综合GAP改变说明符4984在经济模型176库中定位对应于改变说明符标识符5250的可应用的GUI元素改变成本规则5246。系统资源利用标识符5252指示用于测试特定GUI元素改变的资源。在一个实现中,系统资源利用标识符5252具有从1到10的值,其标识测试相应的GAP改变所需的测试环境的处理和基础设施能力的量。例如,对于测试环境处理能力,值为3的系统资源利用标识符5252可以指示测试相应的GAP改变需要三分之一的可用处理能力。对于测试环境处理能力,值为10的系统资源利用标识符5252可以指示测试相应的GAP改变将需要最多的可用计算资源(例如,处理能力)。在另一个实现中,系统资源利用标识符5252提供测试相应GAP改变所需的资源的描述。例如,系统资源利用标识符5252可以详细说明测试者的技能、系统组件(例如,输入和输出设备以及网络带宽)以及分配给用于测试相应GUI元素改变的系统进程的优先级设置。在一个实现中,系统资源利用标识符5252提供指示测试环境处理能力的离散值和测试相应GUI元素改变所需的各种资源的详细描述的组合。经济成本模型逻辑4996可以使用从属改变说明符标识符5256来定位其他可应用的GUI元素改变成本M^则5246,其依赖于改变i兌明符标识符5250所标识的特定GUI元素改变成本M^则5246。从属改变说明符标识符5256可以标识依赖于与改变说明符标识符5250相对应的GUI元素改变的一个或多个相应的GUI元素改变成本MJ'J5246。例如,父GUI对象的类从列表框改变为复合框(例如,SchoolListbox3316和SchoolCombobox3406)可以对父GUI对象的孩子GUI对象施加GUI元素改变,从而使对应于特定GAP改变说明符184和/或综合GAP改变说明符4984的改变说明符标识符5250标识一个或多个从属改变说明符标识符5256。在一个实现中,从属性等级5258是从0到10的值,其指示GAP可以具有的对特定GUI元素的从属度。从属性等级5258可以对应于GUI元素的可见性和范围。例如,当前GAP150中的窗口Statelist3302改变为后续GAP版本152中的School3402(如图14所示)可以对应于10的从属性等级5258,而Statelistbox3312中的值改变为Statelistbox3404中的值(如图5所示)可以对应于4的从属性等级5258。经济成本模型逻辑4996使用从属性等级5258来促进获取变换成本5248。在一个实现中,经济成本模型逻辑4996使用从属性等级5258来确定如何使用和/或是否使用GUI改变效率因子5286,在下面将进一步详细讨论。在一个实现中,质量等级5260是从1到IO的值,其指示GUI元素改变对后续GAP版本152的质量的贡献。例如,对高从属性等级5258值所对应的GUI元素实施完整性纟企查的特定GUI元素改变可以对应于10的质量等级5260。在另一个示例中,不可察觉和/或对应于低从属性等级5258值的GUI元素改变可以对应于0的质量等级5260。在一个实现中,经济成本模型逻辑4996使用用户可选择的质量偏好标识符来生成测试脚本变换成本报告186,其中GUI变换成本5248对应于符合或超过质量偏好标识符的质量等级5260,从而可以基于质量因子来评估测试计划。在一个实现中,复杂性等级5262是从1到IO的值,其指示测试相应GUI元素改变的困难程度,其中复杂度IO是高复杂度,并且复杂度O是低复杂度。在另一个实现中,复杂性等级5262指示GUI元素改变对后续GAP版本152的复杂度的贡献。例如,对高从属性等级5258值所对应的GUI元素实施完整性检查的特定的GUI元素改变可以对应于10的复杂性等级5262。在另一个示例中,不可察觉和/或对应于低从属性等级5258值的GUI元素改变可以对应于0的复杂性等级5262。在一个实现中,经济成本模型逻辑4996使用用户可选择的复杂性偏好标识符,对于符合或超过复杂性偏好标识符的复杂性等级5262,来生成具有GUI变换成本5248的测试脚本变换成本报告186,从而可以基于复杂性来评估测试计划。从属GUI元素改变成本5264可以表示对应于从属改变说明符标识符5256的聚合GUI变换成本5248。在一个实现中,经济成本模型逻辑4996使用从属GUI元素改变成本5264,而不是获取对应于一个或多个从属改变说明符标识符5256的每个GUI元素改变成本规则5246,来生成测试脚本变换成本报告186。在一个实现中,经济成本模型逻辑4996使用用户可选择的偏好标识符5266并基于以下一个或多个的离散值或值的范围,来定位GUI元素改变成本规则5246:系统资源利用标识符5252、GUI改变成本轨迹5254、从属性等级5258、质量等级5260、复杂性等级5262和从属GUI元素改变成本5264。偏好标识符5266基于以下一个或多个来标识用以生成测试脚本变换成本才艮告186的GUI变换成本5248:改变说明符标识符5250、系统资源利用标识符5252、指示估计时间和/或测试对应于GUI元素改变的资源(例如,金钱和劳动力)的GUI改变成本估计5254、从属改变说明符标识符5256、从属性等级5258、质量等级5260、复杂性等级5262和从属GUI元素改变成本5264。GUI变换成本5248可以包括时间分量和资源分量。GUI变换成本5248的时间分量可以指示改变测试脚本声明和/或测试相应的GUI元素改变所需的流逝的时间。GUI变换成本5248的资源分量可以指示改变测试脚本声明和/或测试相应的GUI元素改变所需的金钱、技能领域和/或系统基础实施(例如,人和技术单元)。回想经济成本引擎182可以基于如下可用信息的多个组合生成测试脚本变换成本报告186,包括1)GAP改变说明符184;2)GAP改变说明符和当前测试脚本164;3)GAP改变说明符184、当前测试脚本164和当前GAP版本150(例如,当前GAP树状模型);4)当前测试脚本164和具有GUI元素差异条目的GUI差异模型162;以及5)GAP改变"i兌明符184、当前测试脚本164、和GUI差异才莫型162。可用信息的各种组合由经济成本引擎182用于分析所接收的GAP改变标识符184和/或所生成的综合GAP改变说明符4984,该综合GAP改变说明符4984被经济成本模型逻辑4996用于定位和获取GUI变换成本5248以及生成测试脚本变换成本纟艮告186。在一个实现中,经济成本引擎182接收GAP改变说明符184,经济成本引擎182将其用于从经济模型176库中定位以及获取GUI元素改变成本规则5248。接收的GAP改变说明符184可以是根据对当前GAP版本150、当前测试脚本164和/或GUI差异模型162的先前分析而得到的。在一个实现中,经济成本引擎182可以接收GAP改变说明符184和当前测试脚本164。脚本解析器逻辑3912基于当前测试脚本164产生测试脚本声明向量3916。经济成本才莫型逻辑4996分析测试脚本声明向量3916,以生成综合GAP改变说明符4984。经济成本模型逻辑4996使用所接收的GAP改变说明符184和所生成的综合GAP改变说明符4984,来从经济模型176库中定位以及获取GUI元素改变成本规则5248。在一个实现中,接收的GAP改变说明符184和生成的综合GAP改变说明符4984对于其来源是不可区分的,使得经济成本模型逻辑4996统一地处理接收的GAP改变说明符184和生成的综合GAP改变说明符4984,而不考虑其来源。在另一个实现中,经济成本引擎182接收GAP改变说明符184、当前测试脚本164和当前GAP版本150。经济成本引擎182分析GAP改变说明符184和当前GAP版本150(例如,当前GAP树状^f莫型)以生成综合GAP改变说明符4984。经济成本引擎182分析对应于当前测试脚本164的测试脚本声明向量3916和GUI差异模型162,以生成综合GAP改变说明符4984。经济成本模型逻辑4996使用接收的GAP改变说明符184和生成的综合GAP改变说明符4984,来从经济模型176库中定位以及获取GUI元素改变成本规则5248,并且生成测试脚本变换成本报告186。在一个实现中,经济成本引擎182接收当前测试脚本164和GUI差异模型162,而不接收GAP改变说明符184。经济成本引擎182分析对应于当前测试脚本164的测试脚本声明向量3916和GUI差异模型162,以生成综合GAP改变说明符4984。在一个实现中,经济成本引擎182接收GAP改变说明符184、当前测试脚本164、对应于GAP版本150和后续GAP版本152的GUI差异模型162。经济成本引擎182分析对应于当前测试脚本164的测试脚本声明向量3916和GUI差异;f莫型162,以生成综合GAP改变说明符4984。经济成本引擎182使用接收的GAP改变说明符184和生成的综合GAP改变说明符4984,来从经济模型176库中定位以及获取GUI元素改变成本^L则5248,并且生成测试脚本变换成本报告186。在一个实现中,GUI变换成本5248的准确度由于经济成本引擎182接收信息的粒度而改变。例如,作为接收GAP改变说明符184、当前测试脚本164和GUI差异模型162的经济成本引擎182的结果而生成的GUI变换成本5248的准确度可以比仅基于GAP改变说明符184而生成的GUI变换成本5248更高。经济成本引擎182可以采用各种经济模型来保留GUI变换成本5248的准确度,并且对提供给经济成本引擎182的变化的信息粒度进行补偿。在一个实现中,GAP改变说明符184和/或综合GAP改变说明符4984包括模型说明符5268、GUI改变频率5270、技能系数5272、复杂性标识符5274、质量标识符5276、改变百分比5278、错误路径删除类型5280、错误路径相同类型5282和已改变元素类型5284说明符。模型说明符5268从经济模型逻辑4996可访问的多个经济模型中指定要使用的一个或多个经济模型。在一个实现中,模型说明符5268指定用于经济成本模型逻辑4996的一个或多个经济模型,以对应于提供给经济成本引擎182的信息的改变粒度来使用,从而保留了GUI变换成本5248的准确度。例如,模型说明符5268可以指定对应于经济成本引擎182接收的可用信息的多个组合中一个或多个的模型,包括1)用GAP改变说明符184的模型-l;2)用于GAP改变说明符184和当前测试脚本164的模型-2;3)用于GAP改变说明符184、当前测试脚本164和当前GAP版本150的模型-3;4)用于当前测试脚本164和具有GUI差异条目3910的GUI差异模型162的模型-4;以及5)用于GAP改变"i兌明符184、当前测试脚本164和具有GUI差异条目3910的GUI差异模型162的模型-5。GUI改变频率5270指示特定GUI元素改变发生的数量。在一个实现中,经济成本模型逻辑4996包括用户可调节GUI改变效率因子5286,该因子指示在特定阈值之上的GUI改变频率5270是否导致较低的GUI变换成本5248。例如,0.50的GUI改变效率因子5286表示针对给定的GUI元素改变来说,对于超过100次出现以上的每次改变,GUI变换成本5248由百分之50的效率因子来调整。换言之,如果标识的特定GUI元素改变是发生120次,则针对超过阈值100以上的20次改变,经济成本模型逻辑186向GUI变换成本5248应用0.50的GUI改变效率因子5286。在另一个示例中,0.00的GUI改变效率因子5286可以指示没有实现效率,而不论GUI改变频率5270的值。在一个实现中,技能系数5272包括用于描述期望测试后续GAP版本152的测试者的经验水平的一个或多个系数。技能系数5272可以包括用于测试经验的特定领域的独立系数。例如,技能系数5272可以根据测试(诸如单元、整体、系统的特定阶段以及最终测试阶段)对应于测试者的技能和经验水平,从而使每个阶段由一个或多个系数表示。在另一个示例中,技能系数5272可以与对应于测试后续GAP版本152的特定方面的技能和经验相对应,特定方面诸如安全性和用户认证、专用于GAP的数值计算以及网络和基础设施。在另一个实现中,根据位于性能度量库4998和/或成本报告库5288中的性能度量来校准技能系数5272。可以根据在性能度量库4998和/或成本报告库5288中找到的历史性能度量,来构造和/或生成GAP改变说明符184和/或综合GAP改变说明符4984。构造的GAP改变说明符184和/或综合GAP改变说明符4984的技能系数5272可以通过多次迭代来调整,以获得在性能度量库4998中反映的实际成本差额的可接受利润(marginofvariance)之内的GUI变换成本5248和测试变换成本报告186。经济成本模型逻辑4996获取的GUI变换成本5248的准确度可以是基于技能系数5272被校准以反映可用于测试后续GAP版本152的测试资源的程度。在一个实现中,技能系数5272影响复杂性标识符5274,在下面进一步详细讨论。经济成本模型逻辑4996使用技能系数5272来获取GUI变换成本5248。例如,1.0的技能系数5272值可以指示期望将几乎没有经验的测试者用于测试后续GAP版本152以及较高的GUI变换成本5248可以导致反映低的经验。在另一个实现中,8.0的技能系数5272值可以指示具有高于平均测试经验的测试者以及较低的GUI变换成本5248可以导致反映高于平均经验的经验。经济成本模型逻辑4996可以分析技能系数5272和复杂性等级5262是否相关,并且相应地获取更高或更低的GUI变换成本5248。例如,技能系数5272可以指示测试者能够测试具有特定复杂度的GAP,如复杂性等级5262所指示,从而获取较低的GUI变换成本5248。在另一个示例中,技能系数5272可以指示测试者缺乏用于测试具有对应于复杂性等级5262的特定复杂度的GAP的技能和经验,从而获取了较高的GUI变换成本5248来反映测试者缺乏技能和经历,以及缺乏测试后续GAP版本152的期望时间和资源。在一个实现中,复杂性标识符5274在数值上标识GUI元素改变的复杂度(例如,值O到IO),该GUI元素改变的复杂度由经济成本模型逻辑4996确定,其对应于生成的综合GAP改变说明符4984。在另一个实现中,复杂性标识符5274标识由测试者确定,并由具有GAP改变说明符184的经济成本模型逻辑4996接收的复杂度。GAP改变说明符184和/或综合GAP改变说明符4984的复杂性标识符5274与GUI元素改变成本规则5246的复杂性等级5258是不同的,复杂性标识符5274表示经济模型176库外部的分析。经济成本模型逻辑4996可以分析复杂性等级5262和复杂性标识符5274,以评估通过应用GUI元素改变成本规则5246获取的GUI变换成本5248的准确度。例如,经济成本模型逻辑4996可以确定对应于特定GUI元素改变的复杂性等级5262和复杂性标识符5274处于可接受的差额利润内,从而作为结果不调整GUI变换成本5248。在另一个示例中,经济成本模型逻辑4996可以确定对应于特定GUI元素改变的复杂性等级5262和复杂性标识符5274处于可接受的差额利润之外,并且通过乘数向上调整GUI变换成本5248。通过分析复杂性等级5262和复杂性标识符5274,而确定的差额利润和乘数可以由用户选择和/或调整。在一个实现中,复杂性标识符5274基于技能系数5272,从而使得GUI元素改变的复杂性是相对于可用测试者的技能和经验来评估的。可以校准技能系数5272,使经济成本模型逻辑4996生成的复杂性等级5262和复杂性标识符5274处于可接受的差额利润内。在一个实现中,质量标识符5276在数值上标识GUI元素改变贡献的质量等级(例如,0到10的值),该质量等级由经济成本模型逻辑4996确定,其对应于生成的综合GAP改变说明符4984。在另一个实现中,质量标识符5276标识由测试者确定、并由具有GAP改变说明符184的经济成本模型逻辑4996接收的质量等级。GAP改变说明符184和/或综合GAP改变说明符4984的质量标识符5276与GUI元素改变成本规则5246的质量等级5260是不同的,质量标识符5276表示经济模型176库外部的分析。经济成本模型逻辑4996可以分析质量等级5260和质量标识符5276,以评估通过应用GUI元素改变成本规则5246获取的GUI变换成本5248的准确度。例如,经济成本才莫型逻辑4996可以确定对应于特定GUI元素改变的质量等级5260和质量标识符5276处于可接受的差额利润内,从而作为结果不调整GUI变换成本5248。在另一个示例中,经济成本模型逻辑4996可以确定对应于特定GUI元素改变的质量等级5260和质量标识符5276处于可接受的差额利润之外,并且通过乘数向上调整GUI变换成本5248。通过分析质量等级5260和质量标识符5276而确定的差额利润和乘数可以由用户选择和/或调整。在一个实现中,经济成本引擎182接收包括改变百分比5278值的GAP改变说明符184,其包括改变百分比5278值、当前测试脚本5000以及与经济成本引擎182用来生成综合GAP改变说明符4984并且从经济模型176库定位和获取GUI元素改变成本规则5248的当前GAP版本150相对应的当前GAP树状模型。例如经济成本模型逻辑4996分析当前GAP版本150(例如,由当前GAP树状才莫型表示)并且生成综合GAP改变说明符4984,该综合GAP改变说明符4984反映对应于改变百分比5278值(例如,范围从l到100)的对当前GAP版本150的改变百分比。经济成本模型逻辑4996分析当前GAP版本150,并且标识对应于改变百分比5278值的经处理的GUI元素改变的集合。经济成本模型逻辑4996可以如下标识所提出的GUI元素按照随机顺序、GUI元素呈现在树状模型中的从上到下或从下到上的顺序来分析标识当前GAP版本150的GAP树状模型中的GUI元素。在一个实现中,所提出的GUI元素改变可以基于包括在接收的GAP改变说明符184中的复杂性标识符5274和/或质量标识符5276来确定。例如,经济成本模型逻辑4996接收GAP改变说明符184,该GAP改变说明符184包括值为1的复杂性标识符5274和值为2的质量标识符5276,并且针对要改变的每个提出的GUI元素,确定对应于值为1的复杂性标识符5274和值为2的质量标识符5276的提出的改变。经济成本模型逻辑4996可以在性能度量库4998和/或成本报告库5288中定位对应于复杂性标识符5274值和质量标识符5276值的提出的GUI元素改变。在一个实现中,作为分析提出的GUI元素改变的结果,经济成本模型逻辑4996生成综合GAP改变说明符4984。在另一个实现中,经济成本模型逻辑4996标识对应于复杂性标识符5274值、质量标识符5276和技能系数5272的提出的GUI元素改变。经济成本才莫型逻辑4996分析当前测试脚本5000和GUI差异模型162,以便基于有效的GUI元素改变(例如,GUI元素差异条目)来生成综合GAP改变说明符4984。例如,经济成本模型逻辑4996确定由于GUI对象在当前测试脚本5000中被引用并且存在于当前GAP版本150中、但不存在于后续GAP版本152中,而需要修改的测试脚本声明向量3916,经济成本模型逻辑4996生成反映当前测试脚本5000所需修改的综合GAP改变说明符4984。经济成本模型逻辑4996标识对测试脚本声明向量3916的改变,其设置了与GUI对象的类型兼容的GUI对象的值,从而不违反作为改变结果而施加于GUI对象的约束。在一个实现中,经济成本模型逻辑4996核实没有被用于获取GUI变换成本5248的GAP改变说明符184和/或综合GAP改变说明符4984所指出的不正确操作。经济成本模型逻辑4996可以推断出现在测试脚本声明向量3916的导航路径中、并且其出现没有明确定义的GUI对象的GUI类信息。例如,当测试脚本声明向量3916采用仅可以在运行时确定其值的表达式来标识GUI对象时,OR查找逻辑172可以使用路径遍历逻辑3924,来分别标识对象库174和GUI差异模型162中可能的相应GUI对象条目3922和GUI元素差异条目3910。然后,经济成本模型逻辑4996标识可以替换表达式的有效GUI对象条目3922和满足有效测试脚本声明向量3916的GUI元素差异条目3910,并且经济成本模型逻辑4996生成相应的综合GAP改变说明符4984。例如,考虑测试脚本声明向量3916:VBWindow("s").VBWindow(el).VBWindow(e2).VBWindow("d"),其中源节点GUI对象命名为"s,,,目标节点GUI对象命名为"d",但是表达式el和e2计算运行时导航路径中的中间节点的值。遍历逻辑3924确定中间节点(GUI对象),其可以包括在由源节点"s"和目标节点"d"所标识的可能的导航路径中。路径遍历逻辑3924分析GUI差异模型162以标识用于替代el和e2的可能的常数(例如,"a"和"f,),从而使由导航路径表达式"s.a.f.d"中的替代GUI对象所形成的测试脚本声明向量3916可以得到经济成本模型逻辑4996确认。通过标识以源节点"s"开始、通向目标节点d的可能的导航路径,经济成本模型逻辑4996可以推断是否基于替代的GUI对象来生成综合GAP改变说明符4984。如果遍历逻辑3924没有标识至少一个导航路径,那么经变换的测试脚本声明3928是无效的。可替换地,如果遍历逻辑3924通过遍历两个对象(例如,el和e2)来标识从"s"通向"d"的导航路径,则在假设表达式el和e2赋值为所发现路径中节点的名称时,经变换的测试脚本声明3928可以是有效的。遍历逻辑3924推断由表达式el和e2在编译时计算的可能名称。换言之,在测试脚本的复杂性与变换测试脚本并^f吏用那些测试脚本来测试后续GAP版本152的经济成本之间存在直接的联系。该复杂性是所引用的GUI对象的数量和对GUI对象执行的操作,以及处理提取并且置于那些GUI对象中的数据所需的逻辑量的函数。参考图47,经济成本模型逻辑4996可以推断出现在测试脚本声明向量3916的导航路径中的GUI对象的GUI类信息。经济成本模型逻辑4996标识GAP改变说明符184和/或综合GAP改变说明符4984,GAP改变说明符184和/或综合GAP改变说明符4984解析试图访问后续GAP版本152中不存在的GUI对象和/或试图设置与GUI对象类不兼容的GUI对象的值的测试脚本声明向量3916。经济成本模型逻辑4996在生成相应的GAP改变说明符184之前,针对GUI差异模型162类型检查测试脚本声明向量3916。经济成本模型逻辑4996使用GUI对象的类之间的继承的和子型关系,以确认接收的GAP改变说明符184并生成有效的综合GAP改变说明符4984。类的概念包括层级式的包含(例如,GUI范围和系统层次)。对象库174和GUI差异模型162包括针对每个GUI对象条目3922和GUI元素差异条目3910的GUI类信息(例如,对GUI对象的类进行注释)。例如,参考表12的第1行,SchoolListBox是具有在第3-39行处所列性质的WinObject类。在另一个示例中,参考图36、图45和图46,每个GUI差异条目(例如,3604、4504和4604)的第1行处,指示了GUIElement类型。如图36、图45和图46中第7、8和8行处所示,分别指示每个GUI对象的类。GUI对象的类指示GUI对象包括与同一类中其他GUI对象共同的特定属性、性质和/或特性,这些共同的属性、性质和/或特性可以扩展到孩子GUI对象和/或由孩子GUI对象继承。例如,图36的第7行处指示StateListboxGUI对象是包括如图36的第ll行处所示值的WindowsFormslO丄istBox.app4类。再次参考图52,在一个实现中,经济成本模型逻辑4996确定GUI对象是否已经改变,并且设置GUI元素改变状态3934。例如GUI元素改变状态3934可以分别使用0、l和2的数值指示符,来指示未改变以及具有和不具有特定约束违反的改变。经济成本模型逻辑4996可以^(吏用GUI元素改变状态3934来促进标识合适的GAP改变说明符184和/或综合GAP改变说明符4984。在另一个实现中,GUI元素改变状态3934是一是供改变详细描述的消息。GUI元素改变状态3934还可以通过数值指示符(例如,-1)来指示GUI对象已经从后续GAP版本152中删除。当GUI对象已经从后续GAP版本152中删除,经济成本模型逻辑4996生成标识对应于当前测试脚本5000和当前GAP版本150的改变的一个或多个综合GAP改变说明符4984。在一个实现中,经济成本模型逻辑4996生成与用来改变当前测试脚本5000和当前GAP版本150的不同的、但在程序上等同的方法相对应的综合GAP改变说明符4984,从而程序员可以评估GUI变换成本5248和测试脚本变换成本报告。图40示出了用于从对象库(OR)174获取GUI对象条目3922的流程图400。脚本解析逻辑3912将测试脚本声明向量3916解析为有序节点序列,其中节点表示导航到GUI对象的函数和参数(4002)。脚本解析逻辑3912评估有序节点序列的第一节点(4004),并且将第一节点标识为源节点,并且分配指示源节点在有序序列中位置的序列标识符(4006)。脚本解析逻辑3912评估有序节点序列的下一节点,以确定下一节点是否是最后的节点(4008),并且在当下一节点不是最后节点时将下一节点标识为中间节点(4010)。给中间节点分配指示中间节点在有序序列中位置的序列标识符。脚本解析逻辑3912可以标识源节点和目标节点之间的中间节点。脚本解析逻辑3912将有序序列中的最后节点标识为目标节点,并且为该目标节点分配序列标识符,该序列标识符指示目标节点在有序序列中的位置(4012)。OR查找172针对测试脚本声明向量所导航到的、对应于有序节点序列的每个GUI对象执行对象库查找,从而标识每个GUI对象条目3922(4014)。在一个实现中,有序节点序列由路径遍历逻辑3924、经济成本模型逻辑4996使用,以确认当前测试脚本5000的声明,和/或确认接收的GAP改变说明符184并且生成有效的综合GAP改变说明符4984。在一个实现中,经济成本引擎182使用有序节点序列来推断GUI对象的GUI类和继承(子类)。在源节点、目标节点和/或中间节点中的至少一个是仅可在运行时标识的表达式的情况下,路径遍历逻辑可以标识可能的GUI对象条目3922,并且经济成本模型逻辑4996确定满足测试脚本声明向量3916的GUI对象条目3922。OR查找172获取测试脚本声明向量所导航到的GUI对象条目3922的性质(4016)。图53示出了用于标识对应于GUI对象条目3922的GUI差异条目3910的流程图5300。OR查找逻辑172接收对应于测试脚本声明向量3916的源节点、目标节点和所有中间节点的GUI对象的性质。在一个实现中,OR查找逻辑172采用路径遍历逻辑3924来标识与测试脚本声明向量所导航到的源节点和目标节点所标识的导航路径相对应的可能的GUI差异条目3910(5302)。在至少一个GUI元素差异条目3910是仅可以在运行时标识的表达式的情况下,路径遍历逻辑3924标识形成源节点和目标节点之间的导航路径的一个或多个可能的GUI元素差异条目3910(5304)。路径遍历逻辑3924确定GUI元素差异条目3910是否形成相应的源和目标节点GUI差异条目3910之间的有效的导航路径(5306)。经济成本模型逻辑4996确定形成导航路径的GUI差异条目3910是否是有效的(5308)。经济成本模型逻辑4996标识与形成有效导航路径的每个GUI对象条目3922相对应的GUI元素差异条目3910(5310)。基于分析GUI对象条目3922和GUI元素差异条目3910,经济成本模型逻辑4996确定综合GAP改变说明符4984,以基于GUI元素的改变(例如,5280、5282、5284和/或GUI元素改变状态3934)的类型来生成和/或确认GAP改变说明符184(5312)。经济成本模型逻辑49964984。当^^径遍历逻辑3924标识遍历了相应源和目标节点GUI差异条目3910之间无效号码的GUI元素差异条目3910时,路径遍历逻辑3924指示导航路径无效(5314)。图54示出了用于后续GAP版本152的经变换的测试脚本5400。经济成本模型逻辑4996可以生成综合GAP改变说明符4984,其指定了为获取经变换的测试脚本5400所需的改变。例如,经济成本模型逻辑4996生成用于当前测试脚本5000(图50中所示)的第1-3行的综合GAP改变说明符4984,其对应于图54中示出的经变换的测试脚本第1、5-7行。在一个实现中,^假设经变换的测试脚本178的第6行中的"university.data"表示路径遍历中的目的地,根据其可以确定有效的GAP改变说明符184和/或综合GAP改变说明符4984,则GUI差异模型162和GUI元素元数据提供经济成本模型逻辑4996推断经变换的测试脚本5400的第2-4行所需的GUI类、GUI定型和映射信息。在另一个示例中,GUI差异模型162和/或GUI元素元数据包括GUI类和映射信息,经济成本引擎182将其用于生成一个或多个综合GAP改变说明符4984,其指出了如何将图50中所示的引用WinObject"保存文件"的当前测试脚本5000中第16行变换为引用WinObject"menuStripl"的"保存文件"孩子GUI对象的行24-25。图55示出用于生成综合GAP改变说明符4984的流程图5500。。在一个实现中,经济成本模型逻辑4996确认GAP改变说明符184和/或生成综合GAP改变说明符4984,其指定连续的GAP版本之间的GUI对象类型的改变,包括(A)添加到后续GAP版本152中的新GUI对象;(B)从后续GAP版本152中删除的GUI对象;(C)GUI对象的一个或多个属性的值被修改;(D)在连续的GAP版本之间修改GUI对象的值;以及(E)GUl对象的类型是不同的。经济成本引擎182分析在当前测试脚本5000、当前GAP版本150和GAP改变说明符184中引用的GUI对象(5502)。经济成本引擎182从对象库174获取每个GUI对象的性质(例如,GUI对象条目3922),并且在GUI差异模型162中定位相应的GUI元素差异条目3910(5504)。在一个实现中,经济成本引擎182从GUI差异模型162和GAP改变说明符184接收当前GAP版本150的当前GAP树状模型表示,并且使用GAP改变说明符逻辑5290来生成综合GAP改变说明符4984。经济成本才莫型逻辑4996分析GUI对象改变。在从当前GAP版本150和后续GAP版本152中相应添加和移除GUI对象时发生GUI对象A类改变(5508)和B类改变(5510)。例如,将WinObjectmenustripl308添加到后续GAP版本152中是A类改变,而将WinObject"选择学校"3304移除是B类GUI对象改变。参考图35,注意已经在3512处移除了"选择学校"。C类改变的示例是,窗口名称从StateList3302改变为学校3402。从诸如列表和复合框的GUI对象中添加或移除值是D类改变的修改示例(5512)。例如,当前GAP版本150中的列表框StateListbox3312在后续GAP版本152中标识为StateListbox3404,并且参考GUI差异条目3604,SeqNumber的值="8"分别是用于连续GAP版本的"哥伦比亚区"和"佛罗里达州"。改变GUI对象的"类型"可以包括替换用于表示对象的窗口的类和/或改变描述GUI对象所采用的值的高级概念。例如,将改变静态标签的类型为只读复合框是E类修改(5512)。另一个E类改变的示例包括将列表框"SchoolListbox"3316改变为复合框"SchoolCombobox"3406。经济成本模型逻辑4996接收GAP改变说明符184并且生成综合GAP改变说明符4984,其包括错误路径删除类型5280、错误路径名称类型5282和已改变元素类型5284说明符。错误路径删除类型5280指出尽管当前测试脚本5000引用了该GUI对象(5514),当前GAP版本150中的GUI对象可能从后续GAP版本152中删除(例如,参见图35示出的"选择学校"3318和3512)。错误路径名称类型5282指出GAP改变可能导致对错误的GUI对象的读和/或写。例如,可以基于特定GAP改变调用关于错误GUI对象的方法。错误路径名称类型5282指出当前GAP版本150中的GUI对象已经修改,和/或已经将另一GUI对象添加到后续GAP版本152中,这可以导致测试脚本声明导航到错误的GUI对象(5516)。例如,分别考虑当前测试脚本5000和经变换的测试脚本5400的第2行和第6行中的声明Window("StateList").Dialog("Open").WinListView("SysListView32").Select"university.data"。该声明从WinListView"SysListView32"中选择了"university,data"。然而,经变换的测试脚本5400的第2-4行可以导航到以及调用关于错误的GUI对象"university.data,,的"选择"方法,因为在经变换的测试脚本5400的第2-4行中引用的GUI对象是当前测试脚本5000中未引用的新GUI对象。因此,当现有GUI对象的性质被修改和/或其他GUI对象被添加到后续GAP版本152中时,这些操作的推断结果是将GAP改变说明符184和/或综合GAP改变说明符4984应用于当前测试脚本声明向量3916而得到经变换的测试脚本声明,该经变换的测试脚本声明可以访问以及读取与原始期望对象不同的对象的值。已改变元素5284指出测试脚本声明向量3916引用的GUI对象的类型、性质和/或默认值已经在后续GAP版本152中改变(5518)。例如,GUI差异条目3604指示对于连续的GAP版本来说,SeqNumber的值二"8"具有不同的值"哥伦比亚区,,和"佛罗里达州",并且经济成本模型逻辑4996因而可以生成包括已改变元素5284的综合GAP说明符4984。已改变元素5284还可以指定新的约束已经施加于与测试脚本声明向量3916冲突的GUI对象,例如,测试脚本声明向量3916试图向已经改变为只读文本框的之前的可写文本框写入数据。参考表13中示出的GUI元素差异条目,在当前测试脚本5000的第18行处所引用的WinObject"AcadScale,,在可编辑的对象,而其后续GAP版本152中已经变换成了只读的WinObject"Academics(1-5)"。经济成本;f莫型逻辑4996确认GAP改变说明符184和/或生成具有指定GAP改变类型的综合GAP改变说明符4984(5520),并且更新GUI元素改变状态3934(5522)。在一个实现中,经济成本模型逻辑4996不生成用于在连续的GAP版本之间未改变的GUI对象的综合GAP改变说明符4984(5524)。了解针对GUI对象的修改类型便于经济成本模型逻辑4996确定合适的综合GAP改变说明符4984,以生成和/或确认接收的GAP改变说明符184。例如,经济成本模型逻辑4996可以确认GAP改变说明符184和/或生成一个或多个综合GAP改变说明符4984,其指定对尝试在已经改变为只读复合框的文本框对象中设置值的测试脚本声明向量3916的改变。GAP改变说明符184和/或综合GAP改变说明符4984可以指明经修改(经变换)测试脚本声明向量3916使用合适的接口在复合框中选择值,而不是试图在文本框中设置值。经济成本4莫型逻辑4996确定GUI对象是否已经从当前GAP版本150中移除,并且在当前测试脚本5000中定位引用这些移除的对象的测试脚本声明向量3916。经济成本引擎182将这些声明称作第一引用声明(FRS)。获取这些声明中使用的变量,并且使用其值在FRS中定义的变量的声明被称作次级引用声明(SRS)。经济成本模型逻辑4996确定GUI对象是否可能已经在后续GAP版本152中删除,并且确认接收的GAP改变说明符184以及生成具有4晉误路径删除5284的一个或多个相应的综合GAP改变说明符4984。在当前测试脚本5000的声明引用其值指向移除的GUI对象的变量时,当前测试脚本3926的声明被认为是SRS。在一个实现中,经济成本引擎182生成一个或多个综合GAP改变说明符4984和/或确认对应于标识的SRS的接收的GAP改变说明符184。当修改了GUI对象的一个或多个属性的值时,执行C类修改。针对具有修改的属性的GUI对象标识FRS和SRS,并且生成相应的综合GAP改变说明符4984和/或确认接收的GAP改变说明符184。当GUI对象的值被添加或移除时,发生D类修改。在定位引用其值已经改变的GUI对象的FRS之后,找到SRS,并且经济成本引擎182确定归因于SRS的影响。当GUI对象的类型被修改时,那么E类的修改发生,其包括定位FRS、检测GUI对象的新类型、调用相应的类型包容(sub-sumption)规则。经济成本模型逻辑4996可以分析修改的GUI对象,以确定是否生成具有改变元素类型5284的综合GAP改变说明符4984,其中其类型、性质或默认值在后续GAP版本152中都改变的GUI对象、和/或尝试对没有考虑施加于GUI对象的元素上的新约束的GUI对象的操作。经济成本才莫型逻辑4996分析在当前测试脚本164和/或当前测试脚本5000中引用的每个GUI对象、当前GAP版本150、接收的GAP改变说明符184、生成的综合GAP改变说明符4984和/或GUI元素改变状态3934。经济成本模型逻辑4996在经济模型176库中定位模型说明符5268标识的经济模型,并且获取具有与GAP改变说明符184和/或综合GAP改变说明符4984相对应的改变说明符标识符5250的GUI元素改变成本M^则5246。在一个实现中,经济成本模型逻辑4996合并具有GUI元素改变状态3934、模型说明符5268、错误路径删除类型5289、错误路径相同类型5282和/或已改变元素类型5284的GUI对象(例如,类型和/或类)的一个或多个属性,以形成用于在由某些说明符5268指定的经济模型中定位相应的改变说明符标识符5250。经济成本才莫型逻辑4996分析GUI元素改变成本规则5246分量、GAP改变说明符184和/或综合GAP改变说明符4984分量、偏好标识符5266和GUI改变效率因子5286,以确定是否调整GUI改变成本估计5254。例如,根据技能系数5272、复杂性标识符5274、质量标识符5276、系统资源利用标识符5252、质量等级5260和/或复杂性等级5262是否处于如偏好标识符5266所指示的可接受差额之内,经济成本模型逻辑4996调整GUI改变成本估计5254。经济成本模型逻辑4996基于调整的GUI改变成本估计5254来获取GUI变换成本5248。换言之,调整GUI改变成本估计5254以获取针对GAP改变说明符184和/或综合GAP改变说明符4984的GUI变换成本。经济成本模型逻辑4996处理每个接收的GAP改变说明符184和/或所生成的综合GAP改变说明符4984,以获取相应的GUI变换成本5248并且生成具有GUI变换成本5248的测试脚本变换成本报告186。图56示出了用于基于GUI差异模型162输出测试脚本变换成本报告186的流程图。经济成本引擎182接收GUI差异模型162和GUI元素元数据140(5604)。经济成本引擎182接收包括测试脚本声明向量3916的当前测试脚本表示3914(5606)。脚本解析器逻辑3912将测试脚本声明向量3916解析为向量节点,以确定测试脚本声明向量3916所导航到的GUI对象(5608)。经济成本引擎182针对测试脚本声明向量3916标识的每个GUI对象调用OR查找逻辑172从对象库174中获取GUI对象的性质(5610)。路径遍历逻辑3924分析与测试脚本声明向量3916所标识的GUI对象相对应的GUI元素差异条目3910的导航路径(5612)。经济成本模型逻辑4996确认GAP改变说明符184和/或确定要生成的综合GAP改变说明符4984的类型(5614)。经济成本;^莫型逻辑4996通过分析当前测试脚本164、当前GAP版本150(例如,当前GAP树状模型)和GUI差异模型162,来生成对应于所标识的GUI元素改变类型的综合GAP改变说明符4984(5616)。经济成本模型逻辑4996在模型说明符5268指定的经济模型中定位对应于GAP改变说明符184和/或综合GAP改变说明符4984的GUI元素改变成本规则5246,并且应用GUI元素改变成本规则5246来获取GUI变换成本5248(5618)。经济成本模型逻辑4996基于GUI变换成本5248生成测试脚本变换成本报告186(5620)。在一个实现中,经济成本引擎架构IIO使用自适应编程,该自适应编程包括类和对象图,以及对于所有对象一致的抽象。路径遍历逻辑3924和经济成本模型逻辑4996可以区分复合和简单的GUI对象类型。如果给出某些类型的GUI对象,则遍历逻辑3924和经济成本模型逻辑4996—起工作来标识满足特定标准的一个或多个可达对象。执行的任务等同于确定描述导航路径的测试脚本声明向量3916是否有效。当外部组件的名称被定义为字符串时,对测试脚本(例如,经变换的测试脚本5400)的静态检查任务极大地简化。当使用表达式指定GUI对象的名称时,直到运行时才能确定这些表达式的值。类型图便于经济引擎系统5200推断保持GUI对象名称的表达式和变量类型。经济引擎系统5200基于在推断表达式和变量类型的自适应编程中定义的遍历图分析(TGA)应用概念。当测试脚本声明中的字符串表达式的值直到运行时才能计算时,可以推断该字符串表达式。路径遍历逻辑3924和经济成本模型逻辑4996—起工作以通过将经变换的测试脚本声明3926变换为具有替代字符串表达式的变量的自适应策略来使用类型图分析测试声明向量3916。经济成本模型逻辑4996针对每个变量计算可能的值并且针对每个策略生成遍历路径。在标识了至少一个路径的情况下,确认GAP改变说明符184和/或生成综合GAP改变说明符4984,因为计算对象名称的表达式的值可能不在计算的路径中。路径遍历逻辑3924可以标识一个或多个可能的路径,而经济成本模型逻辑4996确认用于表达式和声明的路径。经济引擎系统5200提供模块化完整性,作为用于确保GAP改变说明符184和/或综合GAP改变说明符4984的有效性的机制。模块化完整性规定由要改变的GAP改变说明符184和/或综合GAP改变说明符4984所标识的每个当前测试脚本声明仅可以直接与属于针对其创建当前测试脚本声明的GUI的对象通信,其中当前测试脚本声明由GAP改变说明符184和/或综合GAP改变说明符4984改变。由GAP改变说明符184和/或综合GAP改变说明符4984所指定的改变的当前测试脚本声明的组成不应该违反模块化完整性,其中通过调用指定的改变的当前测试脚本声明所导出的函数来访问GUI对象。经济引擎系统5200通过分析由GAP改变说明符184和/或综合GAP改变说明符4984所指定的改变的当前测试脚本声明的组成来确保GAP改变说明符184和/或综合GAP改变说明符4984的模块化完整性,从而构建当前测试脚本164与GAP改变说明符184和/或综合GAP改变说明符4984所指定的改变的当前测试脚本164(例如,经变换的测试脚本178和5400)之间的迁移关系。例如,声明Fimc("y","z")(在相关测试脚本族中发现)导航到导出函数Func的某些测试脚本中的外部GUI对象y的字段z。因此,即使该通信可能由给定的测试族的约束禁止,相关的测试脚本族中的某些测试脚本可能通过隐含地经由函数Func互操作测试脚本而违反模块化完整性。在一个实现中,经济引擎系统5200在使用作为每个测试脚本中的全局注释的一部分的关键字约束定义测试脚本时,对模块化约束进行编码。这些约束定义了GAP及其GUI屏幕,以及给定的测试脚本可与之通信的其他测试脚本。示例是指定约束为约束屏幕("Q")test一scripts("P,S")的声明。该约束有效地禁止了给定的测试脚本明确地或隐含地与其他GAP、GUI屏幕和测试脚本的通信(除了屏幕Q和测试脚本P和S之外)。路径遍历逻辑3924的时间复杂度和经济成本模型逻辑4996与每个测试脚本164的类型图大小呈指数关系。因为路径遍历逻辑3924和经济成本模型逻辑4996包括在类型图中搜索一个或多个节点或边,在该处理中包含每个节点的循环,时间复杂度是0((V+E)—w)),其中V是节点数量、E是类型图中的边的数量,并且max(|tt|)是策略中节点的最大数量。在变量表中存储后续者的操作的时间复杂度是O(l)。通常,策略中节点的数量max(|tt|)远远小于类型图中的节点数量。在策略中,不必针对每个节点遍历所有图节点。系统可以按照多种不同的方式来实现。例如,尽管示出的某些特征存储在计算机可读存储器中(例如,如实现为计算机可执行指令或存储器的数据结构的逻辑),但是所有或部分系统、逻辑和数据结构可以存储在其上、在期间分布或从其他机器可读介质读取。介质可以包括硬盘、软盘、CD-ROM、信号,诸如从网络接收的信号或划分为段的信号以及在通过网络传送的多个分组中接收的信号。系统可以以软件、硬件或软件和硬件的组合实现。而且,系统可以利用附加的、不同的或较少的组件实现。作为一个示例,处理器或任何其他逻辑可以利用微处理器、微控制器、DSP、专用集成电路(ASIC)、程序指令、离散仿真或数字逻辑、或其他类型的电路或逻辑的组合实现。作为另一个示例,存储器可以是DRAM、SRAM、闪存或任何其他类型的存储器。系统可以分布在多个组件之间,诸如多个处理器和存储器之间,可选地包括多个分布式处理系统。诸如程序或电路的逻辑可以组合或在多个程序之间分割,分布在多个存储器和处理器上以及可以由功能库实现或实现为功能库,诸如动态链接库(DLL)或其他共享库。虽然已经描述了各种实施方式,本领域的技术人员应该清楚,在本发明的范围内很多其他的实施方式和实现是可能的。因而,本发明仅受到根据所附权利要求书和其等价物的限制。权利要求1.一种产品,包括存储器;存储在所述存储器中的相似性阈值;存储在所述存储器中的当前图形用户接口(GUI)应用(GAP)GUI模型,所述当前GAPGUI模型包括第一源GUI元素;存储在所述存储器中的后续GAPGUI模型,所述后续GAPGUI模型包括第一目标GUI元素;以及存储在所述存储器中的GAP比较逻辑,所述GAP比较逻辑包括加权分析逻辑,可用于基于所述第一源GUI元素和所述第一目标GUI元素来确定相似性值;以及匹配构建逻辑,可用于在所述相似性值超过所述相似性阈值时,创建所述第一源GUI元素和所述第一目标GUI元素之间的第一GUI元素链接。2.根据权利要求1所述的产品,进一步包括映射获取逻辑,可用于获得所述当前GAPGUI模型中的第二源GUI元素和所述后续GAPGUI模型中的第二目标GUI元素之间的GUI元素版本映射。3.根据权利要求2所述的产品,其中所述匹配构建逻辑进一步可用于创建所述第二源GUI元素和所述第二GUI目标元素之间的第二GUI元素链接。4.根据权利要求3所述的产品,其中GAP比较逻辑进一步可用于在获得所述GUI元素版本映射时,放弃执行所述加权分析逻辑。5.根据权利要求1所述的产品,其中所述GAP比较逻辑进一步包括加权分析逻辑,可用于确定所述相似性值。6.根据权利要求5所述的产品,其中所述加权分析逻辑可用于确定所述相似性值作为GUI元素特征的加权和。7.—种产品,包括存储器;存储在所述存储器中的基础GUI差异模型;以及存储在所述存储器中的GAP比较逻辑,可用于针对后续图形用户接口应用(GAP)版本中的第二GUI元素来分析当前GAP版本中的第一GUI元素,以确定第一相似性值;以及当所述第一相似性值超过相似性阈值时,将从所述第一GUI元素到所述第二GUI元素的GUI元素链接插入所述基础GUI差异模型中。8.根据权利要求7所述的产品,进一步包括权重表,存储在所述存储器中并且包括GUI特征权重;并且其中所述GAP比较逻辑获取所述GUI特征权重以确定所述相似性值。9.根据权利要求8所述的产品,其中所述相似性值包括由所述GUI特征权重加权的GUI元素特征的和。10.根据权利要求7所述的产品,其中所述GAP比较逻辑进一步可用于基于操作者输入来修改所述相似性值。11.根据权利要求IO所述的产品,其中所述GAP比较逻辑进一步可用于响应于所述相似性值,高亮显示在所述当前GAP版本和所述后续GAP版本之间相匹配的GUI元素。12.根据权利要求7所述的产品,其中所述GUI元素链接包括所述第二GUI元素的标识符。13.根据权利要求7所述的产品,其中所述GUI元素链接进一步包括基于所述第一相似性值的匹配分数。14.根据权利要求7所述的产品,其中所述GAP比较逻辑进一步可用于针对所述后续GAP版本中的多个GUI元素来分析所述第一GUI元素,以确定包括所述第一相似性值的多个相似性值,其中所述多个GUI元素包括所述第二GUI元素。15.—种方法,包括针对后续图形用户接口应用(GAP)版本中的第二GUI元素来分析当前GAP版本中的第一GUI元素;以及当所述第一相似性值超过相似性阈值时,将从所述第一GUI元素到所述第二GUI元素的GUI元素链接插入所述基础GUI差异模型中。16.根据权利要求15所述的方法,进一步包括为了确定所述相似性值,从权重表获取GUI特征权重。17.根据权利要求16所述的方法,进一步包括确定由所述GUI特征权重加权的GUI元素特征的和,作为所述第一相似性值。18.根据权利要求15所述的方法,进一步包括基于操作者输入来修改所述相似性阔值。19.根据权利要求18所述的方法,进一步包括响应于所述相似性阈值,高亮显示在所述当前GAP版本和所述后续GAP版本之间相匹配的GUI元素。20.根据权利要求15所述的方法,进一步包括针对所述后续GAP版本中的多个GUI元素来分析所述第一GUI元素,以确定包括所述第一相似性值的多个相似性值,其中所述多个GUI元素包括所述第二GUI元素。全文摘要本发明涉及一种图形用户接口(GUI)应用比较器,帮助应用设计者创建无错误的图形用户接口应用(GAP)。该比较器发现用于组成当前GAP版本和后续GAP版本之间的接口的GUI元素中的差异。一个益处在于测试脚本编写者可以更好地理解GAP已经如何演进,从而编写更好的测试脚本。另一个益处在于,该比较器输出可以由用于测试脚本自动分析的后续处理系统分析。文档编号G06F11/36GK101520731SQ20091011853公开日2009年9月2日申请日期2009年2月26日优先权日2008年2月27日发明者M·格雷查尼克,忱傅,晴谢申请人:埃森哲环球服务有限公司