CN101957791B - 将针对图形用户界面的测试脚本模块化和方面化 - Google Patents
将针对图形用户界面的测试脚本模块化和方面化 Download PDFInfo
- Publication number
- CN101957791B CN101957791B CN201010232300.4A CN201010232300A CN101957791B CN 101957791 B CN101957791 B CN 101957791B CN 201010232300 A CN201010232300 A CN 201010232300A CN 101957791 B CN101957791 B CN 101957791B
- Authority
- CN
- China
- Prior art keywords
- gap
- gui object
- test
- gui
- test script
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/368—Test management for test version control, e.g. updating test cases to a new software version
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明涉及将针对图形用户界面的测试脚本模块化和方面化。具体地,涉及一种用于测试图形用户界面应用(GAP)的测试结构通过将定义GAP测试逻辑的语句与导航至GAP对象的语句分离而对测试脚本进行模块化。组合规则将语句编织在一起以生成执行用以测试GAP的测试脚本。因为测试结构是模块化的,所以可以跨不同的GAP和相同GAP的不同版本来复用测试逻辑。复用测试逻辑不仅从测试工程师的角度来看是有效的实践,而且还导致了测试编程错误的减少。模块化测试结构还促进了将底层GAP的修改纳入考虑的测试脚本的有效修改,极大地减少了完成更新的测试脚本所需要的时间、成本和资源消耗。
Description
技术领域
本公开涉及使用测试脚本来测试图形用户界面(GUI)应用,并且具体地,涉及用于创建对不同的GUI应用和/或GUI应用的不同版本进行测试的可复用和/或可调整的测试脚本的系统和方法。
背景技术
先进技术的不断发展产生了有助于令日常生活的几乎每个方面自动化的复杂计算机软件应用。目前,存在用以对各方面进行协助的应用,从写小说、填写所得税申报表到分析婴儿名字历史趋势。这些应用的一个几乎普遍存在的特征在于其采用图形用户界面(GUI)。GUI实现了图形窗口、指针、图标和其他特征,用户通过这些特征与底层程序进行交互。利用GUI实现的程序称为GUI应用(GAP)。GAP在发布之前需要进行全面测试。
过去,将GUI实现于应用中比全面测试GAP要容易。对于任何很复杂的GAP而言,GUI元素的排列和组合产生了可能具有从轻微到致命故障的任何严重程度错误的潜在命令和命令序列。由此,GAP必须进行全面测试以便保证GUI按照预期来与用户进行交互。手动测试大型企业GAP是乏味、易错且繁重的。作为对手动测试的替代,测试工程师开发了测试脚本来使GAP测试自动化。
测试脚本包括导航语句和逻辑语句。导航语句访问和操纵或者获取GUI对象的特性,而逻辑语句确定GAP是否按照预期运行。在执行时,这些测试脚本通过借由在GUI对象执行动作来模仿用户与GAP进行交互的活动,而在不同状态中驱动GAP。测试脚本处理输入数据、使用该数据来设置GUI对象的值、对该GUI对象执行动作以使GAP执行计算、访问其他GUI对象以获取计算结果,以及将结果与期望结果进行比较。为了测试GAP的不同GUI和功能,必须编写多个不同的测试脚本。作为一个示例,测试旅行预订GAP将需要不同的测试脚本来测试不同的GUI对象,在用户通过GAP进行导航以预订出发航班、预订酒店和/或汽车、预订返回航班以及做出其他旅行安排时显示这些GUI对象。一个测试脚本可以确定GAP是否响应于用户选择特定出发航班而显示了正确的返回日期选项,而另一测试脚本可以确定响应于该相同用户选择的酒店预订日期是否是正确的。为了全面测试旅行预订GAP,必须编写更多的测试脚本。
虽然确定是否显示了正确日期是适用于多种不同类型GAP的普遍存在的测试,但是测试脚本(例如,旅行预订测试脚本)不可移植以用于测试其他类型的GAP,因为逻辑语句夹杂了GAP相关的导航语句以便访问和测试GAP内的GUI对象。同样,当修改GAP(即,相同GAP的不同版本)时,测试脚本难于更新,因为必须重写的导航语句分散在多个不同的测试脚本之间。测试工程师已经发现,测试脚本即使在相同GAP的不同版本之间也是不易于移植的,并且在多数情况下,更希望从头编写新的测试脚本而不是修改现有测试脚本。
生成跨不同的GAP或者相同GAP的不同版本可移植的测试脚本存在其他障碍。在一种生成测试脚本的方法中,捕获/重放工具被用于记录鼠标坐标和用户动作。然而,因为捕获/重放工具使用鼠标坐标,所以(即使轻微地)改变GUI布局,通常将使测试脚本无效。另一生成测试脚本的方法称为“利用对象映射来测试”,其捕获GUI对象的特性值(而不仅仅是鼠标坐标)。测试工程师给GUI对象的特性值集合指派唯一的名称,并且继而在测试脚本中使用这些名称来引用对象。理论上,对GUI布局的改变可以通过修改GUI对象的特性值来说明,这些GUI对象通常存储在对象库中。然而,即使在由于以下所阐述的相关性而对GUI做出很小的改变时,更新基于对象映射的GUI测试(如果不是禁止的)也是困难的。
导航和操纵表达式(NAME)是在测试脚本导航GUI对象、设置或获取GUI对象的值或者对其执行动作时使用的表达式。NAME包括应用编程接口(API)调用,其具有保持正在接受测试的GUI对象的特性值的对象。不同的测试架构导出不同的API调用来访问和操纵GUI对象。由此,NAME依赖于GUI对象类型(例如,列表框、文本框等)、屏幕上对象的位置以及底层GUI测试架构。因为NAME通过GUI对象的特性来引用GUI,所以即使GUI对象最细微的改变也可使引用该GUI对象的测试脚本内的所有NAME无效。例如,将GUI对象从组合框改变为文本框将几乎一定会使引用GUI对象的原始测试脚本中所有NAME无效。NAME和测试逻辑之间的互相依赖使得测试脚本硬连线至特定GAP和测试架构。因为GUI对象的创建依赖于底层GUI框架,其在不同的GAP之间可能是不同的,所以测试脚本的可移植性进一步恶化。由于这些原因,迄今为止,基于NAME的测试脚本即使在具有相同功能性的GAP之间都是不可复用的,从而丧失了测试自动化的潜在益处。
测试GAP时存在另外的困难,因为涉及三种“类型系统”:用来编写GAP源代码的语言的类型系统、底层GUI架构的类型系统以及用来编写测试脚本的语言的类型系统。如果修改了GUI对象的类型,则测试脚本的类型系统“将不知道”发生了该修改,这使得维护和演进测试脚本的过程复杂化。测试脚本不包含任何录入信息。测试脚本不使用GUI架构的类型系统,其不是脚本语言解释器的一部分,并且测试脚本没有对编写GAP的编程语言的类型系统的访问权。由于测试脚本语言中不存在类型系统,所以程序员无法静态地检测错误、获得足够的文档以及有效地维护和演进测试脚本。
由于其所有的限制,基于测试脚本的测试与手动测试相比较,造成了用于测试GAP的工作整体减少。为了帮助进一步减少测试GAP的工作,测试工程师创建了GAP的模型,并且通过使用处理模型化GAP的工具来生成测试脚本。基于模型的测试包括建立GAP的高层模型以及实现构造测试用例的算法。然而,该用于生成测试脚本的建模过程存在显著的限制。例如,建立GAP的高层模型是费力和困难的,并且直接根据GAP的源代码建立模型存在障碍。例如,GUI对象的变量值仅在运行时,即与API调用的执行相结合时是已知的。由此,GUI模型不能单独从源代码推导出。同样,从源代码推导模型将需要:(a)知道创建和操纵GUI对象的API调用的语义,(b)开发从GUI资源库提取GUI模型的工具,以及(c)知道GUI应用语言。目前,存在(a)、(b)和(c)的成千上万种组合,使得难以开发推导GUI模型的通用方法。另外,GAP的源代码通常对于订有合约来测试专有GUI软件的独立测试机构而言是不可用的。由此,针对基于模型的测试脚本生成存在重大挑战。
存在禁止使用其他技术来进行GAP测试的若干障碍。例如,因为GUI对象是动态(即,仅在执行GAP时)创建的,所以GAP无法静态地进行测试(诸如通过查看GAP源代码来进行测试)。另外,因为测试脚本在GAP平台外部的平台上运行,所以GUI对象无法作为存在于集成程序内的编程对象来访问。并且,因为GUI对象的完整说明通常是不可用的,所以难以静态地分析GUI对象如何由NAME访问和操纵。
因此,需要实现易于修改和复用的测试脚本的GAP测试结构。
发明内容
一种用于测试图形用户界面应用(GAP)的测试结构,通过将定义测试逻辑的语句与向GAP对象导航的语句分离来将测试脚本模块化。组合规则将这两种语句编织(weave)在一起以生成执行用以测试GAP的测试脚本。将逻辑语句与导航语句分离提供了模块化测试结构,从而可以跨不同的GAP和相同GAP的不同版本来复用相同的测试逻辑。复用测试逻辑不仅从工程师的角度来看是有效实践,还导致了测试编程错误减少。模块化测试结构还促进了将底层GAP中的修改纳入考虑的测试脚本的有效修改,大大地减少了完成更新测试脚本所需要的时间、成本和资源消耗。
测试结构实现了面向对象的导航代码,其中GAP表示为编程对象,而GUI对象表示为编程对象内的域。测试结构包括测试逻辑,以调取对编程对象执行动作的方法。在GAP中的编程对象上经由可访问性接口来调取该方法,该可访问性接口当GUI对象在GAP中变得可用时提供对其的访问。方法调用调取NAME来定位GUI对象并提取其值。上述值通过可访问性接口从GAP传递回测试逻辑。
使用该测试结构,测试逻辑不需要与NAME交织来测试特定的GAP。相反,使用面向方面类型的编程语言,通过在GAP中定义切入点而将测试逻辑应用于GAP。当GAP激活连接点时,测试逻辑被激活。因此,可以通过在GAP中定义GAP特定切入点而将相同的测试逻辑应用于不同的GAP。如果修改了GAP,则简单地重新定义切入点来维护测试逻辑的有效性。
通过查看以下附图和详细描述,其他系统、方法、特征和优点对于本领域技术人员将是明显的或者将变得明显。所有此类附加系统、方法、特征和优点包括在本说明书中,落在要求保护的主题的范围内,并且由所附权利要求保护。
附图说明
参考以下附图和描述可以更好地理解该系统。附图中的元件未必是按比例的,而是将重点放在说明该系统的原理。在附图中,相似的参考编号贯穿不同视图指示相应部分。
图1图示了包括具有程序元素的存储器的系统,该程序元素用于测试来自存储器的由处理器执行的图形用户界面应用程序。
图2示出了图1的测试脚本的格式。
图3图示了示出GUI屏幕的状态的示意性状态机。
图4示出了可以执行用以构造GAP测试的动作。
图5示出了用于创建测试脚本的操作工作流。
图6示出了用于指定GUI对象的功能的动作。
图7是示出GUI对象的生命周期的状态图。
图8图示了测试脚本与GAP之间的反射连接器。
图9示出了用于向编程类添加编程对象的录入对话框的版本的方法步骤。
图10示出了录入对话框窗口的一个示例。
图11、图12和图13示出了可以用于对连接点应用通知的一组精简规则。
图14示出了用于图11、图12和图13中示出的精简规则的帮助器函数。
具体实施方式
图1图示了包括存储器120的测试脚本执行系统100(“系统100”),存储器120具有用于测试来自存储器152的、由处理器160执行的图形用户界面应用(GAP)150的程序元素。GAP 150通常绘制为具有GAP管理逻辑154,其用于实现图形用户界面(GUI)程序的逻辑执行,以及生成图形用户界面(例如,GUI1-GUIN(156(a)-156(f)))。处理器160执行GAP管理逻辑154,其继而可以导致GUI1-GUIN(156(a)-156(f))中的一个或者多个GUI在屏幕162上出现。每个GUI 156(a)-156(f)可以包括任意数目的GUI元素164(诸如文本框、单选按钮、下拉菜单、滚动条或者其他GUI元素)。图1中标注了特定的GUI元素166。
存储在存储器120中的程序元素包括GAP测试环境122和反射连接器140。GAP测试环境122包括测试脚本128、测试逻辑176、测试脚本解释器186、编程类(诸如编程类124)、类定义168、异常处理机170和录入对话框172。处理器160执行GAP测试环境122以测试GAP 150的任何期望的逻辑。尽管图1中仅示出了一个测试脚本128,但是GAP测试环境122可以包括任意数目的测试脚本来部分地或者全部地测试GAP 150。测试脚本128可以作为插件来与诸如EclipseTM的主程序(未示出)交互。
如下文详述,举例来说,GAP测试环境122生成针对GUI对象164的特定GUI对象166的编程类124。编程类124包括由测试脚本128内的测试脚本语句130调用的用来定位GUI对象的方法174以及值操纵方法126。在执行时,测试脚本语句130引用GUI对象164作为编程对象,并且反射连接器140提供对GUI对象164的访问。与执行测试脚本语句130相结合地,定位GUI对象的方法174和值操纵方法126中的一个或多个通过反射连接器140进行交互,以获得和/或操纵编程对象166的一个或多个值。反射连接器140可以在可访问性层中实现,下文详述。
用于测试GAP 150的程序元素将测试脚本128分为两个正交的关注点:测试GAP计算的高层测试逻辑176和指定如何定位GUI对象以及对GAP进行操纵的低层指令序列(测试脚本语句130)。测试脚本可以由组合规则自动生成,该组合规则将高层测试逻辑176与测试脚本语句130进行编织。高层测试逻辑176独立于GAP和测试平台,并且可以按照模块化方式应用于测试不同的GUI和GAP。
在一个实现中,测试脚本128的编程语言类似于面向方面的编程范式的编程语言。编程语言支持类型间声明、切入点和通知。图2示出了测试脚本128的格式的版本。测试逻辑声明为方面200。切入点202定义一组条件204(a)-204(c)作为连接点,其必须在执行通知206之前得到满足。测试脚本128内的每个元素的细节在下文中进一步讨论。
表1提供了对旅行GAP的GUI中显示的日期进行测试的测试脚本的一个示例。
在此示例中,测试逻辑被声明为第1行中的方面TestTravelReservationLogic。在第2-8行中,切入点TravelDates指定了GAP中触发定义为通知的测试逻辑(第9-17行)的连接点。第3行和第4行指定了将具有GUIObjectDate类型的编程对象retDate和depDate绑定到其相应的GUI对象,其资格由“当前(current)”和“活跃(active)”说明符限定。换言之,相应的GUI对象必须在可应用的GAP(App1、App2或者App3中的任意一个)(第5行)的GUI屏幕上具有活跃的绑定和当前实例化。然而,测试逻辑不应当应用于第6行中指定的GAP App4。GAP不可以生成事件异常(第7行),并且GAP应当在测试逻辑被触发之前结束加载GUI屏幕(第8行)。
在该编程语言版本中,存在三种类型的通知:before(前置)、around和after。通知“before”添加指定和验证检查点的代码,例如,GAP中目前没有活跃的对话框窗口或弹出窗口。通知“before”还保证选择的GUI对象可以在测试逻辑中、在“around”和“after”通知中使用。在此示例中,通知“before”检查按钮“Search(搜索)”是否启用,以便验证GUI屏幕是否处于测试的正确状态。
通知“around”和“after”引用测试逻辑和将要在GUI对象上执行的动作(诸如将GAP切换到新状态)。具体地,当触发“around”通知时,执行表2所示的函数TestLogic4Dates(),以测试返回日期是否早于出发日期的时间。
表2:测试逻辑“TestLogic4Dates” |
1 void TestLogic4Dates(){2 GUIObjectDate retDate,depDate;3 depDate.setValue(GetRandomDate());4 retDate.setValue(GetRandomDate());5 int diff=retDate.get Value()-6 depDate.getValue();7 if(diff<=0)//报告测试失败;8 else //报告通过测试} |
测试逻辑封装在函数178 TestLogic4Dates(第1行)中,其中声明了两个编程对象180 retDate和depDate(第2行)。这些对象表示旅行GAP上保持返回日期和出发日期的值的GUI对象。使用方法182setValue将出发日期值设置为使用函数GetRandomDate随机生成的日期(第3行)。还设置了返回日期值(第4行)。计算184返回日期值和出发日期值之间的差值(第5-6行)。如果该差值小于或者等于0,则测试逻辑176报告失败(第7行);否则测试逻辑176报告通过(第7行)。
该示例示出了如何在测试逻辑176中模块化GAP的横切关注点。GUI对象164在测试逻辑中表示为编程对象180,从而利用关于编程对象的、GUI结构中立的操作代替了NAME。NAME与测试逻辑176没有冲突;该逻辑可以普遍地应用于不同的GAP或者相同GAP的不同版本。当调取测试方法时和/或当设置或者获取对象值时,测试逻辑操作随后可以转译为NAME。一旦将操作转译为NAME,其即由底层测试架构执行。该示例演示了可以不引用并且独立于所有的NAME来编写测试逻辑。
表2中的测试逻辑包含单个关注点(验证日期),其可以按照模块化方式应用于不同的GAP。当激活了必需的GUI屏幕并且其GUI对象变得可用时,执行引用可用对象的测试逻辑。由此,单独编写(以及可以使用)测试逻辑176和测试脚本128,并且自动地将其编织在一起以测试GAP 150,而不是执行复杂、费力的将测试逻辑直接编写到测试脚本中的任务。
如上所述,在当前公开的测试结构中,GUI对象被表示为编程对象。该测试结构提供了用于设置和获取GAP中的GUI对象的特性值的机制,并且提供了用以调取GUI操作的访问权。表征测试结构的该方面的另一方式是将GUI对象视为驻留于web服务内部的类。图3中形象地表示了该表征,图3图示了示出在GAP 302的屏幕304(a)、306(a)、304(b)、306(b)之间的转移的示意性状态机300。GUI屏幕包括GUI对象308(a)、310(a)、312(a)、308(b)、310(b)、312(b)的集合体,并且因此还可以视作这样的类,该类具有作为其GUI对象的类的实例的域。在较高层,GAP还可以视作这样的类,该类具有作为其GUI屏幕的类的实例的域。在图3中,GAP 302视作其状态定义为GUI对象308(a)、310(a)、312(a)、308(b)、310(b)、312(b)的集合体,并且具有GUI对象特性(例如,样式、只读状态等)和GUI对象值的状态机。在一种新状态中,GUI对象可以保持相同,但是可以改变其值和特性。响应于由web服务提示的动作314,GAP转移到新状态。由此,GAP 302是编程对象,其通过web服务在状态之间转移。
GAP测试环境122包括将GAP状态标识为最终状态或者中间状态的元素,并且可以仅将测试逻辑应用于最终状态。GAP最终状态的一个示例是目的地页(诸如,示出了出发航班的网页)。GAP中间状态的一个示例是进度页(诸如,动画沙漏)。GAP测试环境122通过分析GAP及其GUI对象的结构来标识最终状态。该分析包括遍历GUI树,并且将其与响应于用户操作而记录的树进行比较。
构造GAP测试环境122的过程的一个实施方式的概述将提供用于解释如何遍历GUI树以标识最终状态的设置。图4示出了可以执行用以构造GAP测试的逻辑400。在402,使用包括类型和名称的编程对象语言来编写测试逻辑。编程对象表示GUI对应(counterpart)对象。在404,捕获/重放工具捕获GUI对象的特性。在406,将编程对象的类型和名称指派给相应的GUI对象。在408,在编程对象上调取方法,其引起NAME被执行。在410,用户(例如,测试工程师)与GAP交互,并且捕获NAME和GAP的结构和状态。所捕获的NAME是指定如何导航至GUI对象的低层指令序列。低层指令还指定必须在NAME上被调取以便重现用户动作的方法。在412,指定了GUI对象的类型和名称,以便随后用于测试脚本中。在414,创建编程对象与GUI对象之间的绑定(下文解释)。该绑定允许编程对象在针对不同GAP的不同脚本中使用,因为底层NAME提供了到GUI对象的GAP特定导航路径。在416,编写测试脚本(图2;表1)。如果修改了GAP,则无效的NAME可以在418重新生成。
图5示出了用于创建测试脚本的操作工作流程500。在502,用户通过对GUI对象执行动作来与GAP进行交互。例如,与旅行GAP交互的用户可以输入出发日期和城市,以及返回日期和城市。在504,随着用户与GAP进行交互,屏幕的结构以及用户与GUI对象进行的交互被记录。在一个版本中,使用支持可访问性的接口在可访问性层(下文解释)处捕获用户的动作和屏幕序列。所捕获的信息由GAP测试环境122使用,以允许测试脚本定位GAP中的GUI对象,以便设置或获取值或者执行动作。在506,将动作转编码(trans-code)为编程指令(即,NAME),其随后由产生的测试脚本来执行。
从测试者的角度看,GUI对象具有多达四个功能:动作产生器,输入数据接受器,输出数据获取器以及状态检查点。动作产生器使得GAP能够切换到不同的状态。按钮类型GUI对象是动作产生器的一个示例;点击按钮将GAP切换到不同的状态。输入数据接受器是从用户(例如,文本框)接收数据的GUI对象。输出数据获取器是包含数据(例如,列表视图或者文本框)的GUI对象。这些对象充当用于生成单元测试用例的数据供应器。状态检查点对象是必须在屏幕上存在的对象,用于使GAP正确地运行。输出GUI对象也是状态检查点对象,因为测试脚本无法从没有初始化的输出GUI对象获取数据。某些GUI对象可以具有所有四个功能,例如,组合框可以是状态检查点,可以包含输出数据,可以接受输入数据,并且可以在用户做出选择时产生某些动作。GUI对象的功能(特别是哪些GUI对象接收值或者充当输入,以及哪些GUI对象产生输出结果)被用于在测试脚本中定义编程对象。由此,必须指定GUI对象的功能。
图6示出了用于指定GUI对象的一个或多个功能的逻辑600。在602,用户与GAP进行交互。在604,用户在GUI对象之上移动光标。在606,可访问性API调用用于获得关于GUI对象的信息。在608,通过在GUI对象周围绘出框来确认GUI对象的选择。在610,工具提示窗口显示关于所选择的GUI对象的信息。在612,用户调取上下文弹出菜单(例如,通过右击鼠标)。上下文弹出菜单具有指定所选择的GUI对象的功能、类型和名称的条目。在614,选择了功能菜单条目以显示特性对话框。在616,用户指定GUI对象的功能(例如,输入、输出、动作或者检查点)。
在GUI架构内,将GUI对象内部地表示为其记录指定这些对象的特性值的数据结构。一旦GAP程序被执行,GUI对象随着用户与GUI屏幕的交互而创建、激活以及销毁。图7是示出了GUI对象的生命周期的状态图700。椭圆形包含GUI对象的状态的名称。状态之间的转移利用箭头示出。
GUI对象的初始状态是创建状态702。为了创建GUI对象,必须分配记录,并且将该记录的域初始化为初始值。一旦创建了GUI对象,其状态即转移至去激活状态704,因为此时GUI对象对于用户而言是不可访问的。如上所述,GUI对象仅在当其在某些GUI屏幕上被激活或者与某些GUI屏幕的执行有关时对于用户才是可访问的。在激活状态706,GUI对象是用户可见和可访问的。直到其进入销毁状态708之前,GUI对象可以在激活状态和去激活状态之间转移任意多次。作为一个示例,在屏幕之间来回移动隐藏(去激活)一个屏幕及其GUI对象,并且呈现(激活)另一屏幕及其GUI对象。仅是在状态之间进行切换(没有用户输入数据或者命令按钮)不改变由GUI对象保持的值。并且用户不能在去激活的GUI对象上进行动作。相同的限制适用于GAP与测试脚本之间;测试脚本不能在已经去激活的GUI对象上进行动作(例如,读取或者写入)。另外,测试脚本(以及用户)不能随意激活或者去激活GUI对象,因为在GAP程序执行时,GAP异步地执行这些动作。换言之,GAP动作在GAP程序中是锁定的,并且不可由外部程序修改。如下文详述,本公开的GAP测试环境122包括称为绑定的程序元素,其保证在试图访问GUI对象之前,GAP程序已经初始化和激活这些GUI对象。
在测试逻辑中的编程对象与GAP中的GUI对象之间定义绑定。GUI对象存在于GAP的上下文内。测试逻辑中的编程对象表示相应的GUI对象。编程对象与GUI对象之间的绑定指示哪些操作可以和不可以对测试脚本的编程对象执行,从而防止运行时异常。
图8图示了测试脚本802与GAP 804之间的交互,并且提供了用于描述如何通过反射连接器800创建绑定的基础。测试脚本802的语句由脚本语言解释器806来处理,该脚本语言解释器806提供有测试平台808。当解释器806遇到访问和操纵GUI对象的语句时,其向测试平台808传递控制。测试平台808将语句转译为由底层GUI架构810和操作系统812执行的一系列指令。反射外露出给定GUI对象的类型,并且其使得测试脚本能够调取其类在GAP运行之前并非静态已知的对象的方法。该模型将脚本和GAP之间的连接器800与反射进行组合,以使得测试脚本可以在运行时访问和操纵GUI对象。在测试脚本中,访问和操纵GUI对象的语句包括以下操作:(1)导航至某些目标GUI对象;以及(2)调取在该对象上执行动作的方法,该方法包括得到和设置值。利用反射和连接器的概念的实现,测试脚本中的语句可以导航至GAP中的GUI对象,并且在这些对象上执行操作。
测试脚本中的编程对象的生命周期与其表示的GUI对象的生命周期紧密联系。测试脚本语句中的绑定定义在执行相应的测试脚本操作之前必须满足的GUI对象的状态。换言之,可以在编程对象上安全执行的操作基于相应的GUI对象在时间的实例(例如,过去、当前或者将来)时的状态。由于GUI对象的状态属于编程对象,所以可以将其称为绑定类型。表3示出了根据时间和绑定类型可以在GUI对象上执行的操作。
GUI对象实例列可以相对于当前实例的三个时间点之一。第一,GUI对象可以是在过去已经实例化的,也就是其可能曾经是,但是现在不是用户可用的。第二,GUI对象可能当前可由用户对其进行动作。第三,GUI对象可能还没有被实例化,但是将在将来某时进行实例化。注意,尽管不能预知将来要进行实例化的GUI将保持的值,但是这些值可以在测试脚本中设置(经由对应的编程对象),以使得当GUI对象被实例化时,其值将经由反射连接器设置。
表3还示出了存在三种绑定类型:活跃、不活跃和静态。活跃绑定意味着在GUI屏幕上激活了对应于编程对象的GUI对象。不活跃绑定意味着去激活了GUI对象。静态绑定意味着GUI对象存在于例如由另一屏幕(例如web浏览器中的层)遮蔽的屏幕上。虽然被遮蔽的对象对于用户而言是不可访问的,但是可以在其上进行测试脚本操作。静态绑定对应于Java中的静态变量,其在重新进入其范围时被激活。
表3还示出了存在操作在其中被禁止的三种GUI对象实例/绑定类型组合:过去/活跃、当前/不活跃和将来/活跃。过去/活跃操作被禁止,因为如果GUI对象不再可用,则其不能具有活跃绑定。当前/不活跃操作被禁止,仅因为当前可用的GUI对象不是不活跃的。将来/活跃操作被禁止,因为GUI对象如果还不可用,则不能具有活跃绑定。
对于非禁止的组合,存在可以在GUI对象上执行的三种类型的操作:从其读取值,向其写入值以及在其上调取方法(即,对其进行动作)。对于当前/活跃GUI对象,可以执行所有三种操作。如果不活跃GUI对象已经被实例化(过去/不活跃)则可以从其进行读取,因为虽然GUI对象不是活跃的,但是其值可以被测试逻辑获取。还没有实例化的不活跃GUI对象(将来/不活跃)可以通过在测试逻辑中设置GUI对象中的值来对其进行写入。设置的值将被存储,并且当创建和激活GUI对象时,将设置其值。去激活的(静态绑定)GUI对象如果先前或者当前存在,则可以对其进行读取或者写入。如果GUI对象还没有被实例化,则不能从其读取;然而,其可以被写入。再次参考图1和图2,测试脚本语句将切入点202内的绑定实现为用于执行测试逻辑的GAP条件204(a)-204(c)。
如上所述,系统100支持具有面向方面的编程特征的测试脚本语句。例如,系统100可以实现基于底层AspectJTM的切入点语法,而利用GAP测试扩展来扩展该语法。GAP测试扩展的示例以下在表4中以斜体字示出。GAP测试扩展包括“实例化时间(insttime)”和“绑定”规则,针对“实例化时间”和“绑定”规则的“过去”、“当前”、“将来”、“活跃”、“不活跃”和“静态”指示符,以及针对“指示符”规则的附加指示符“对象”、“GAP”、“处理机”和“事件”。
因此,系统100建立测试脚本编程语言,其使用标准指示符(例如call和execution)来指定通知交织的连接点。已经添加了指示符“object(对象)”、“GAP”和“event(事件)”,以使得测试逻辑可以动态地编织到GAP的执行中。指示符“object”指定表示相应GUI对象的编程对象(测试逻辑内)。当激活指定的GUI对象时,触发通知。“指示符”event指定触发通知的执行的事件。指示符“GAP”指定充当连接点的GAP。指示符“GAP”允许测试工程师指定充当用于特别指定的GAP(与在Java中指定针对其应用特定通知的包相似)的连接点的事件和对象。
当触发通知时,GAP测试环境122通过可访问性层与GAP 150进行交互。图1中的反射连接器140可以在可访问性层中实现。可访问性层允许GAP测试环境122获取GUI元素的属性,设置和获取属性值,以及生成和拦截事件。测试逻辑被编织到GAP中,其中测试脚本响应于GAP事件而与GAP交叉。多数计算平台包括符合1973年美国复健法案第508项设置的电子和信息可访问标准的可访问技术。例如,Microsoft Active Accessibility(微软主动式辅助,MSAA)改进了辅助功能配合运行在Windows上的应用的方式,而SunMicrosystems Accessibility(Sun微系统可访问)技术辅助在Java虚拟机(JVM)顶部运行软件的残疾用户。可访问技术被并入这些以及其他计算平台中以及库和应用中,以便暴露关于用户接口元素的信息。例如,Windows GUI元素实现称为“IAccessible”的接口,以使得该元素可以使用MSAA API调用来访问和控制。
GAP测试环境122使用可访问性层和钩子而将事件监听器注入到GAP中。钩子是用户定义的库,其包含根据可访问技术指示的规则、使用高层可访问性API调用编写的回调函数(“回调”)。钩子使得用户能够扩展GAP的功能性,而不改变GAP源代码。钩子的主功能是接收命令以对GUI元素执行动作,报告GAP内发生的事件,以及响应于某些命令和事件而调取预定义的函数。编写钩子不需要任何关于GAP源代码的知识。关于钩子、可访问性层、GUI元素、GAP和GAP测试的附加细节在名称为“Automatic Test Generation forReference Testing”,美国公开号2008/0250051 A1(Grechanik等人)中进行了描述,从而此处通过引用其全部内容将其并入。
GAP测试环境122包括钩子库,其对于所有的GAP是通用的。当开始目标GAP时,可访问性层在GAP的进程空间中加载预定义的钩子库,并且注册应当响应于指定的事件而被调取的回调的地址。因为钩子“生存”于GAP的进程空间中,所以其回调可能影响这些GAP的执行的每个方面。注入到GAP中的钩子监听由GAP生成的事件,并且执行从集成系统接收的指令。例如,钩子可以包括禁用按钮直到预定义事件发生的指令。
注入的事件监听器响应于GAP事件。该事件在高层处由切入点指定。例如,切入点“object(static current GUIObjectDate retDate)”规定了映射至GUIObjectDate类型的Java对象retDate的GUI对象对于某些GUI屏幕上的动作当前必须是可用的(屏幕本身不必是活跃的)。针对切入点规范来检查对象的功能。
通过事件监听器,GAP测试环境122捕获GUI对象,接收描述GAP状态的输入,以及生成编程类(例如124)。类包括通过设置和得到GUI对象值来控制GAP的方法。该方法还发起使得GAP能够切换至不同状态的动作。随着GAP切换状态,GAP测试环境122记录每个状态。换言之,GAP测试环境122后序遍历GAP的GUI树。针对树的每个节点,GAP测试环境122发出定义节点的编程类的代码。
表5示出了声明节点的编程类的格式。
所生成的类链接至GUI对象,并且包含用于定位GAP中的对象174、设置和得到其值以及在其上执行动作126的方法。当GAP开始时,操作系统给每个窗口(GUI对象)指派正整数,其是GUI对象在通过GUI跳格(tab)时关注的序号。该序号由私有变量ElementId来表示,该变量利用负数来初始化为默认值(第2行)。私有方法“Locate(定位)”采用GAP的进程标识符作为其参数,并且获取GAP的给定GUI对象的ElementId(第3行)。当GAP测试环境122发出“Locate”方法的代码时,其使用可访问性API函数来获得关于GUI树中位于去往GUI对象的路径中的元素的信息。当在第4-5行中在构造函数中执行时,该信息用于导航至GUI对象并且获得其标识符,其将在方法setValue、getValue和DoIt(执行之)中被用于直接访问GUI对象。
第6行和第7行中所示的方法setValue和getValue分别设置和获取GUI对象的值。数据类型默认是“string(字符串)”。然而,其可以另外指定,诸如“integar(整型)”或者“float(浮点型)”。这些方法的代码使用具有ElementId的可访问性API函数来定位GUI中的给定对象,以及设置或者获取该元素的值。最后,方法DoIt(第8行)采用指定针对GUI对象所采取的动作的自变量。如果该自变量为空,则执行由可访问性API函数提供的默认动作。如果遇到问题,则这些方法抛出异常。
事件监听器检测异常。GAP测试环境122包括异常处理机170,其发出响应于异常的代码(例如,显示告知用户关于输入格式不正确的消息框的代码)。
如上所述,测试逻辑包括GUI类,其包括绑定到GUI对象的编程对象(GUI变量)。GUI类反映语义概念。例如,名称为“GUIObjectDate”的GUI类可以包括显示日期的GUI对象,诸如出发(“depDate”)日期和返回(“retDate”)日期。GUI对象与编程对象之间的绑定由GUI对象录入来指定。
表6示出了GUI类“GUIObjectDate”的定义的示例,该GUI类具有表示包含日期信息的GUI对象的类对象。
在定义内,声明了一组“抽象”方法。抽象方法可以称为访问方法,其是由测试逻辑调用以访问和操纵GUI对象的方法。上述方法与GAP和GUI对象相关,因此不能在测试逻辑中提供。相反,一旦在程序对象和GUI对象之间建立了绑定,即自动生成上述方法。与编程类相关联的方法是类定义的成员。类定义对可以在编程类上调取的方法进行定义。
例如,参考表2,“TestLogic4Dates”包括在编程对象“depDate”上执行的方法调用“setValue”(第3行),该编程对象“depDate”对应于例如显示出发日期的GUI对象。“depDate”是GUI类“GUIObjectDate”的成员(第2行)。表6声明了可以在GUI类“GUIObjectDate”的成员上调用的方法。在该示例中,可以调用的方法是“getDate”和“setDate”。“getDate”和“setDate”方法是通过上述可访问性层执行的程序。程序可以在可访问技术库中定义,或者可以是定制设计的程序。该程序通过类定义与编程对象相关联。例如,编程对象“depDate”在其可以作为表2第2行的编程对象引用之前,必须添加到编程类“GUIObjectDate”中。通过引用编程对象在GUI屏幕上的相应GUI对象并且打开录入对话框172而将编程对象添加到编程类中。录入对话框172连接表5和表6之间的代码,并且将GUI对象绑定到GUI方面中指定的GUI参数。
图9示出了用于将编程对象添加到编程类中的录入对话框172的版本的方法步骤。在902,用户打开GAP/GUI屏幕并且选择GUI对象。作为响应,录入对话框172打开录入对话框窗口(904)。图10示出了录入对话框窗口1000的一个示例。录入对话框窗口1000包括概念域1002和变量域1004。选择的GUI对象的GUI类在概念域1002中指定(906)。切入点参数的名称在变量域1004中指定(908)。录入对话框172将选择的GUI对象绑定到“retDate”(910)。在该示例中,将选择的GUI对象指派给名称“retDate”和类“GUIObjectDate”。
一旦选择的GUI对象被指派了类,GUI类的访问方法可自动生成,以使得测试逻辑可以访问和操纵选择的GUI对象(912)。访问方法可以是预编程的方法,其存储在用户定义的访问方法的录入对话框库188中,这些用户定义的访问方法定义如何访问GUI对象。每个编程类与一个或多个可选择的访问方法相关联。编程类与访问方法之间的关联还可以存储在库188中。在图10所示的示例中,用于访问类“GUIObjectDate”的GUI对象的访问方法是“Date getDate()”和“void setDate(Date date)”。可以基于测试期间将要在选择的GUI对象上调取的动作来选择访问方法。
如上所述,GUI对象表示为测试脚本中的相应编程对象。用于访问对应于所选择的GUI对象的编程对象的方法可以在GUI对象方法域1008中指派(914)。如图10所示,录入对话框窗口1000包括用于指派访问方法的概念方法域1006,和用于指派访问编程对象的方法(其可以称为“生成的方法”)的GUI对象方法域1008。生成的方法可以是存储在录入对话框库188中的预编程的方法。
使用“映射”按钮1010,用户可以指定访问方法和生成的方法之间的映射(916),和/或指定用户定义的扩展(918)。例如,用户可以将“getValue”方法从GUI对象方法域1008映射到概念方法域1006中的“getValue”方法。录入对话框172生成用于将方法域映射到一起(例如,将“getValue”映射至“getDate”)的代码的程序框架(920)。关于GUI元素录入和映射系统的附加细节在与2008年2月27日提交的、名称是“Test Script Transformation Architecture”的、序列号12/038,665的共同拥有的、共同未决的美国专利申请(Grechanik等人)中进行讨论,从而此处通过引用其全部内容将其并入。
用户可以编辑代码以修复返回类型失配(如果有的话)。表7在左列示出了通过录入对话框生成映射代码的示例。用户编辑的代码在右列中示出。
录入对话框172在GAP中植入钩子以检测当编程对象被添加至编程类时,GUI何时在屏幕上出现或者消失。当选择的GUI对象在屏幕上出现时,GAP测试环境122更新其数据结构(例如,将“retDate”标记为活跃绑定)。如果给定切入点的所有参数存在,则自动地调取切入点调用上的通知,完成通知的自动编织。测试脚本解释器186评估由钩子检测到的切入点,以确定是否所有的切入点对于GUI对象都是存在的。
GUI对象上的主操作是(a)导航至GUI对象,以及(b)在其上调取方法,包括设置和得到其值。这些操作通过对连接点应用测试脚本通知以及根据以录入对话框窗口1000的方式收集的用户输入来自动生成访问方法而执行。这些主操作的语义在下文进行描述。
为了对连接点应用通知,在系统100中的GAP测试环境122中运行的测试脚本编程语言使用精简规则,其定义用于执行表示GUI对象的编程对象上的操作的操作语义。精简规则1100在图11、图12和图13中示出,并且包括SCRIPTNAVIGATE 1102、GETOBJECT1104、MCALL 1106、CALLRETURN 1108、EXECGAP 1110、GSNAVIGATE 1112和GSGETOBJECT 1114。
GAP测试环境122定义测试系统TS,其包括GAP G和测试脚本T,统称为程序P。程序P包括一组位置和一组值。测试系统TS的状态S是测试脚本和GAP的状态的结合。经由映射函数ProgramState:TSxP→Sp获得程序P的状态。在精简规则中,Sp是用于应用ProgramState函数以获得某些程序P的状态S的简写,某些程序P可以是测试脚本T或者GAP G。由精简规则定义的评估关系具有 的形式,其中TS=(T,e,ST),(G,a,SG),理解为“测试脚本T和GAP G是测试系统TS的成员”。执行具有初始状态ST的表达式e导致执行具有初始状态SG的动作,并且系统TS转移为新的系统TS′。在这些规则中,T和G是程序,而S是状态。 其中P是G或者T。
执行的测试脚本表达式不仅改变测试脚本的状态,还改变脚本连接到的GAP(即,由测试脚本表达式访问和控制的GUI对象)的状态。访问和操纵GUI对象的测试脚本中的语句包括以下操作:(1)导航至某些目标GUI对象,以及(2)调取方法以在GUI对象上执行动作。GSNAVIGATE和GSGETOBJECT示出了测试脚本如何通过在GAP上发起用户动作a来操纵GAP。对这些规则进行评估以在测试脚本中引用类型c的GUI对象V。在脚本侧执行SCRIPTNAVIGATE,并且其返回对象v,该对象v包含在测试脚本中使用对象oT引用的GUI对象中。返回的对象v的特性在称为p的对象寄存器(OR)中定义。在GAP侧执行规则GETOBJECT,并且其返回对象v的集合,这些对象包含在使用对象oG在GAP中引用的GUI对象中。规则MCALL示出了引用GAP对象的测试脚本表达式的评估等待在GAP上执行的动作的结果。规则CALLRETURN将方法执行结果从GAP执行返回到测试脚本,而规则EXECGAP评估GAP处的动作。E代表应用给定规则的上下文。帮助器函数1200在图14中示出,其中函数OR 1202计算其条目在对象库中标注为p的GUI对象的特性及其值的集合。函数identify 1204返回其特性值与给定值匹配的子对象。函数childOf 1206在类型δ的GUI对象是类型τ的父对象的子对象时返回真,否者其返回假。测试脚本解释器186执行以上所述的规则。
通过实现表8中所示的测试逻辑测试了若干不同的航班预定GAP。在测试的前半部分,使用Professional(QTP)来实现测试逻辑,以创建用于测试第一商业GAP中的日期的测试脚本。继而在以下过程中针对第二商业GAP使用QTP脚本调试器对测试脚本进行修改:应用测试脚本以测试第二GAP。被测试的GAP的改变使NAME(在第二GAP测试中中断的每个单独的NAME)无效,并生成异常,这导致测试终止。在QTP脚本调试器内对异常进行分析,并且继而修改测试脚本,并且测试重新运行。重复分析异常和修改测试脚本的过程,直到测试脚本在没有抛出任何异常的情况下运行。修改测试脚本的工作量接近于完全重新编写的工作量。总的来说,组合每个脚本的成本接近90分钟,变化在5分钟以内。
与通常实现多个测试逻辑的典型测试脚本相比较,实验中使用的测试脚本相对较简单。在更加复杂的测试脚本中,测试工程师引入循环以增加覆盖。考虑包含循环的测试脚本,其具有从文件中读取数据并且对来自文件的数据进行分析,根据该数据计算结果,以及将结果插入到GUI对象中的代码。取决于文件大小,计算结果可能需要花费多个小时。每次抛出异常时,必须放弃该结果,修改脚本,然后重新运行。虽然可能对某些循环添加注释以加速执行,但是这样做改变了测试逻辑。因此,进一步减小了测试脚本的可复用性。
在测试的后半部分,开发了基于表8的测试逻辑的GAP测试22,以测试三个商业机票预订GAP:GAP A、GAP B和GAP C。在类似Java的可复用测试函数TestLogic4Date()(表2)和TestLogic4()中很容易实现测试逻辑。定义了四个GUI类:GuiObjDate、GuiObjAirport、GuiObjNumber和GuiObjTrigger。编写了组合规则以使得两个函数都可以应用于测试GAP A、GAP B和GAP C。当表示所需要概念的GUI对象在GUI屏幕上出现时,应用测试,即,针对TestLogic4Date(),测试开始和结束日期,而针对TestLogic4Flight(),测试开始和结束日期、出发和目的地机场、机票数量和提交按钮。
在针对GAP测试22开发测试函数和组合规则时不需要完整的商业GAP,因为测试的这些部分属于来自软件需求的高层语义概念。为了指定从实际GUI对象到组合规则中的GUI变量的映射,运行GAP,定位映射到组合规则中的切入点标准的GUI对象,并且指定映射。将表示旅程信息的GUI对象映射到高层GUI变量。多个GUI对象形成了GUI结构:表示航线、航班号、启程和到达时间和机场的GUI对象形成了“旅程”记录,其被映射到组合规则中的旅程变量。这是一种多对一映射,因为屏幕上存在未知数目的旅程项目。将在可复用测试逻辑中的旅程变量上执行的动作转译成NAME,其在结果屏幕上的每个旅程记录上执行动作。在三种不同的映射简档下保存映射,一个映射简档用于一个旅行代理站点。
在测试会话期间,当加载每个相应的GAP时,加载个体映射简档。当期望的GUI对象出现在屏幕上时,识别切入点并且加载并执行通知。
使用此处所公开的GAP测试22的结构来测试所有三个GAP花费接近90分钟,或者等于开发用于单个应用的QTP脚本的时间。产生的测试脚本证明在共享类似功能性的GAP上是可用的。
表8:测试逻辑 |
1 set departure date to a random date(将出发日期设置为随机日期)2 s.t.random date>=today(随机日期>=今天);3 set return date to a random date;(将返回日期设置为随机日期)4 if(return date<=departure date(返回日期<=出发日期)){5 raise an exception;(产生异常)6 }7 set departure city;(设置出发城市)8 set destination city;(设置目的地城市)9 assertTrue(departure city!=destination city(出发城市!=目的地城市));10 click on search button to start search;(点击搜索按钮以开始搜索)11 assertTrue(a transition screen with progress bar12 appears for<=I min(具有进度条的转移屏幕出 |
现<=1分钟));13 assertTrue(a screen with a list of tickets14 satisfying the above criteria appears(具有满足以上标准的票列表的屏幕出现)); |
而且,使用GAP测试环境122来演进测试逻辑要比使用其他测试环境容易得多。例如,如果修改GAP以接受城市名称代替机场代码,则仅需要改变GAP测试环境122中的测试逻辑176来更新GAP测试。更新的GAP测试继而可以用于测试已经进行修改以接受城市名称代替机场代码的任何和全部的GAP。相反,在其他测试环境(例如QTP)中,必须改变引用修改的GUI对象的所有测试脚本,因为测试逻辑掺杂在每个独立的测试脚本中(用于每个GAP)。由此,GAP测试环境122内的测试脚本不仅是可复用的,而且还是可修改的。
在一个实现中,用于图形用户界面应用测试的方法包括:在计算机可读存储器中生成针对图形用户界面应用(GAP)中的图形用户界面(GUI)对象的编程类;在针对GUI对象的编程类中提供值操纵方法;在存储器中读取来自测试脚本的测试脚本语句,该测试脚本语句利用测试脚本中定义的编程对象来引用GUI对象。编程对象包括编程对象值。在存储器中,用于图形用户界面应用测试的方法建立测试脚本语句和GAP中的GUI对象之间的反射连接器;以及与执行测试脚本语句相结合地,该方法进一步包括通过连接器调用值操纵方法以操纵编程对象值。
以上所述的逻辑、电路和处理可以编码或者存储在机器可读或者计算机可读介质(诸如压缩盘只读存储器(CDROM)、磁盘或者光盘、闪存、随机访问存储器(RAM)或者只读存储器(ROM)、可擦除可编程只读存储器(EPROM)或者其他机器可读介质)中,作为例如由处理器、控制器或者其他处理设备执行的指令。介质可以实现为包含、存储、通信、传播或者传送可执行指令以便由指令可执行系统、装置或设备使用或者与其结合的任何设备。备选地或者附加地,逻辑可以使用硬件(诸如一个或多个集成电路或者执行指令的一个或多个处理器)实现为模拟或者数字逻辑,或者在应用编程接口(API或者动态链接库(DLL)中的软件中,实现为可用于共享存储器或者定义为本地或者远程过程调用的函数;或者实现为硬件和软件的组合。
在其他实现中,可以在信号或者传播信号的介质中表示逻辑。例如,实现任何给定程序的逻辑的指令可以采用电子、磁、光、电磁、红外或者其他信号类型的形式。以上所述的系统可以在通信接口处接收此类信号,通信接口诸如光纤接口、天线或者其他模拟或者数字信号接口,恢复来自信号的指令,将其存储在机器可读存储器中,和/或利用处理器执行之。
系统可以包括附加的或者不同的逻辑,并且可以按照多种不同方式实现。处理器可以实现为控制器、微处理器、微控制器、专用集成电路(ASIC)、离散逻辑或者其他类型的电路或者逻辑的组合。类似地,存储器可以是DRAM、SRAM、闪存或者其他类型的存储器。参数(例如,条件和阈值)和其他数据结构可以是独立存储和管理的,可以并入单个存储器或者数据库中,或者可以逻辑地或者物理地以多种不同的方式组织。程序和指令可以是单个程序的一部分、独立程序或者跨若干存储器和处理器分布。
虽然已经描述了话音检测器的各种实施方式,但是将对本领域技术人员而言明显的是,本发明的范围内的多种实施方式和实现是可能的。因此,根据所附权利要求及其等同物来限定本发明。
Claims (14)
1.一种用于图形用户界面应用测试的方法,包括:
在计算机可读存储器中生成针对图形用户界面应用GAP的图形用户界面GUI对象的编程类,其中所述GUI对象包括GUI对象值;
在针对所述GUI对象的所述编程类中提供值操纵方法,其中所述值操纵方法通过访问所述GUI对象来设置或者获得所述GUI对象值;
在所述存储器中读取来自测试脚本的测试脚本语句,所述测试脚本语句包括表示所述GUI对象的编程对象,所述编程对象包括表示所述GUI对象值的编程对象值;
在所述存储器中建立所述测试脚本语句与所述GAP的所述GUI对象之间的反射连接器以通过经过可访问性层来链接所述测试脚本语句和所述GUI对象提供对所述GUI对象的访问,其中所述反射连接器在可访问性层中实现,并且其中所述反射连接器连接所述编程对象与GUI对象,使得所述GUI对象值的改变反射在所述编程对象值中;以及
与执行所述测试脚本语句相结合地,通过所述反射连接器调用所述值操纵方法,以更新所述编程对象值。
2.如权利要求1的方法,进一步包括:
从所述测试脚本读取指定执行所述测试脚本语句需要满足的条件的定义。
3.如权利要求2的方法,其中所述条件包括:
GUI元素条件的说明,其中所述GUI元素条件指定所述GUI元素的条件。
4.如权利要求2的方法,其中所述定义包括:
实例化时间规则,其指定可以实例化GUI对象的时间。
5.如权利要求4的方法,其中所述实例化时间规则包括:
“过去”指示符,其指示在所述GAP的执行期间,所述GUI对象的在前可用性;
“当前”指示符,其指示在所述GAP的执行期间,所述GUI对象的现有可用性;或者
“将来”指示符,其指示在所述GAP的执行期间,所述GUI对象的后续可用性。
6.如权利要求2的方法,其中所述定义包括:
绑定规则。
7.如权利要求6的方法,其中所述绑定规则包括:
“活跃”指示符,其指示所述GAP中的所述GUI对象的当前可用性;
“不活跃”指示符,其指示所述GAP中的所述GUI对象的去激活;或者
“静态”指示符,其指示所述GAP中的所述GUI对象的不可访问存在。
8.一种用于图形用户界面应用测试的系统,包括:
生成装置,用于在计算机可读存储器中生成针对图形用户界面应用GAP的图形用户界面GUI对象的编程类,其中所述GUI对象包括GUI对象值;
提供装置,用于在针对所述GUI对象的所述编程类中提供值操纵方法,其中所述值操纵方法通过访问所述GUI对象来设置或者获得所述GUI对象值;
读取装置,用于在所述存储器中读取来自测试脚本的测试脚本语句,所述测试脚本语句包括表示所述GUI对象的编程对象,所述编程对象包括表示所述GUI对象值的编程对象值;
建立装置,用于在所述存储器中建立所述测试脚本语句与所述GAP的所述GUI对象之间的反射连接器以通过经过可访问性层来链接所述测试脚本语句和所述GUI对象提供对所述GUI对象的访问,其中所述反射连接器在可访问性层中实现,并且其中所述反射连接器连接所述编程对象与GUI对象,使得所述GUI对象值的改变反射在所述编程对象值中;以及
调用装置,用于与执行所述测试脚本语句相结合地,通过所述反射连接器调用所述值操纵方法,以更新所述编程对象值。
9.如权利要求8的系统,进一步包括:
读取装置,用于从所述测试脚本读取指定执行所述测试脚本语句需要满足的条件的定义。
10.如权利要求9的系统,其中所述条件包括:
GUI元素条件的说明,其中所述GUI元素条件指定所述GUI元素的条件。
11.如权利要求9的系统,其中所述定义包括:
实例化时间规则,其指定可以实例化GUI对象的时间。
12.如权利要求11的系统,其中所述实例化时间规则包括:
“过去”指示符,其指示在所述GAP的执行期间,所述GUI对象的在前可用性;
“当前”指示符,其指示在所述GAP的执行期间,所述GUI对象的现有可用性;或者
“将来”指示符,其指示在所述GAP的执行期间,所述GUI对象的后续可用性。
13.如权利要求9的系统,其中所述定义包括:
绑定规则。
14.如权利要求13的系统,其中所述绑定规则包括:
“活跃”指示符,其指示所述GAP中的所述GUI对象的当前可用性;
“不活跃”指示符,其指示所述GAP中的所述GUI对象的去激活;或者
“静态”指示符,其指示所述GAP中的所述GUI对象的不可访问存在。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US12/504,467 | 2009-07-16 | ||
US12/504,467 US8370811B2 (en) | 2009-07-16 | 2009-07-16 | Modularizing and aspectizing graphical user interface directed test scripts |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101957791A CN101957791A (zh) | 2011-01-26 |
CN101957791B true CN101957791B (zh) | 2015-07-29 |
Family
ID=43086848
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201010232300.4A Active CN101957791B (zh) | 2009-07-16 | 2010-07-15 | 将针对图形用户界面的测试脚本模块化和方面化 |
Country Status (4)
Country | Link |
---|---|
US (1) | US8370811B2 (zh) |
EP (1) | EP2278469A3 (zh) |
CN (1) | CN101957791B (zh) |
CA (1) | CA2708685C (zh) |
Families Citing this family (58)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA2454290C (en) * | 2003-12-29 | 2013-05-21 | Ibm Canada Limited-Ibm Canada Limitee | Graphical user interface (gui) script generation and documentation |
US8914679B2 (en) * | 2006-02-28 | 2014-12-16 | International Business Machines Corporation | Software testing automation framework |
US8850395B2 (en) * | 2009-12-03 | 2014-09-30 | International Business Machines Corporation | Managing graphical user interface (GUI) objects in a testing environment |
US20110296376A1 (en) * | 2010-05-26 | 2011-12-01 | Sybase, Inc. | Dynamically Injecting Behaviors Into Flex View Components |
US8881110B2 (en) | 2010-06-11 | 2014-11-04 | Hewlett-Packard Development Company, L.P. | Role-based automation scripts |
US9053241B2 (en) * | 2010-06-11 | 2015-06-09 | Hewlett-Packard Development Company, L.P. | Scripting application with role identification |
US8782434B1 (en) | 2010-07-15 | 2014-07-15 | The Research Foundation For The State University Of New York | System and method for validating program execution at run-time |
US8589883B2 (en) * | 2010-07-22 | 2013-11-19 | Sap Ag | Automation of testing for user interface applications |
US8667467B2 (en) * | 2010-07-26 | 2014-03-04 | Sap Aktiengesellschaft | Dynamic test scripts |
US8543980B2 (en) * | 2010-08-23 | 2013-09-24 | Micro Focus (Us), Inc. | State driven testing |
US9043759B1 (en) | 2011-01-27 | 2015-05-26 | Trimble Navigation Limited | System and method for generating software unit tests simultaneously with API documentation |
US9280442B1 (en) | 2011-01-27 | 2016-03-08 | Trimble Navigation Limited | System and method for generating coverage reports for software unit tests |
WO2012150932A1 (en) | 2011-05-03 | 2012-11-08 | Hewlett-Packard Development Company L.P. | Automatic classification adjustment of recorded actions for automation script |
US9268665B2 (en) | 2011-07-26 | 2016-02-23 | Trimble Navigation Limited | System and method for identifying fault prone computer code files |
CN103034583B (zh) | 2011-09-30 | 2016-03-30 | 国际商业机器公司 | 一种用于处理软件自动测试脚本的方法和系统 |
US8776025B2 (en) | 2011-11-04 | 2014-07-08 | International Business Machines Corporation | Integrated debugger and code coverage tool |
US9087153B2 (en) | 2011-11-04 | 2015-07-21 | International Business Machines Corporation | Code coverage framework |
US8893084B2 (en) * | 2012-01-04 | 2014-11-18 | Apple Inc. | Methods and apparatuses for deferred object customization |
US11599907B2 (en) | 2012-05-14 | 2023-03-07 | Iqzone, Inc. | Displaying media content on portable devices based upon user interface state transitions |
US8924252B2 (en) * | 2012-05-14 | 2014-12-30 | Iqzone, Inc. | Systems and methods for providing timely advertising to portable devices |
US11663628B2 (en) | 2012-05-14 | 2023-05-30 | Iqzone, Inc. | Systems and methods for unobtrusively displaying media content on portable devices |
US9594544B2 (en) * | 2012-06-07 | 2017-03-14 | Microsoft Technology Licensing, Llc | Visualized code review |
US9122873B2 (en) | 2012-09-14 | 2015-09-01 | The Research Foundation For The State University Of New York | Continuous run-time validation of program execution: a practical approach |
CN103713958B (zh) | 2012-09-28 | 2016-12-21 | 国际商业机器公司 | 在不同语言的机器间同步图形用户界面操作的方法和设备 |
US9069782B2 (en) | 2012-10-01 | 2015-06-30 | The Research Foundation For The State University Of New York | System and method for security and privacy aware virtual machine checkpointing |
CN102929775B (zh) * | 2012-10-23 | 2015-03-25 | 中标软件有限公司 | 一种Web应用系统测试方法 |
CN104956326A (zh) * | 2013-02-01 | 2015-09-30 | 惠普发展公司,有限责任合伙企业 | 基于抽象测试用户控制的测试脚本创建 |
CN103123605B (zh) * | 2013-02-07 | 2018-12-14 | 百度在线网络技术(北京)有限公司 | 一种Android平台自动化集成测试方法和装置 |
US8904355B2 (en) * | 2013-03-14 | 2014-12-02 | Accenture Global Services Limited | Test script generation system |
US9606784B2 (en) | 2013-12-24 | 2017-03-28 | International Business Machines Corporation | Data object with common sequential statements |
US9170921B2 (en) * | 2014-01-24 | 2015-10-27 | Bank Of America Corporation | Application testing automation |
US10296362B2 (en) * | 2014-02-26 | 2019-05-21 | Red Hat Israel, Ltd. | Execution of a script based on properties of a virtual device associated with a virtual machine |
CA2945328C (en) | 2014-04-08 | 2017-10-31 | Turnkey Solutions Corp. | Software test automation system and method |
US9767009B2 (en) * | 2014-11-10 | 2017-09-19 | International Business Machines Corporation | Adaptation of automated test scripts |
US9983984B2 (en) | 2015-01-05 | 2018-05-29 | International Business Machines Corporation | Automated modularization of graphical user interface test cases |
CN104615538B (zh) * | 2015-02-05 | 2018-01-16 | 天津市康凯特软件科技有限公司 | 一种基于手机界面控件元素的手机应用测试方法 |
IN2015DE00970A (zh) * | 2015-04-06 | 2015-06-05 | Hcl Technologies Ltd | |
US9690689B2 (en) * | 2015-04-24 | 2017-06-27 | Microsoft Technology Licensing, Llc | Test case generation in a development environment |
CN105260299A (zh) * | 2015-09-17 | 2016-01-20 | 安一恒通(北京)科技有限公司 | 软件测试方法、装置及系统 |
US10229038B2 (en) | 2016-03-15 | 2019-03-12 | International Business Machines Corporation | Generating reusable testing procedures |
US10191832B2 (en) * | 2016-11-14 | 2019-01-29 | Microsoft Technology Licensing, Llc | Multi-language playback framework |
CN106789402B (zh) * | 2016-11-30 | 2020-04-03 | 太仓市同维电子有限公司 | 一种基于自动化平台的多网口映射多机测试系统和方法 |
US10437714B2 (en) * | 2017-01-25 | 2019-10-08 | Wipro Limited | System and method for performing script-less unit testing |
US10705685B2 (en) * | 2017-08-30 | 2020-07-07 | Red Hat, Inc. | Navigation system for a graphical user interface |
US10963624B2 (en) * | 2018-05-02 | 2021-03-30 | Citrix Systems, Inc. | Web UI automation maintenance tool |
US11074162B2 (en) * | 2019-04-15 | 2021-07-27 | Cognizant Technology Solutions India Pvt. Ltd. | System and a method for automated script generation for application testing |
US10768952B1 (en) | 2019-08-12 | 2020-09-08 | Capital One Services, Llc | Systems and methods for generating interfaces based on user proficiency |
US20210125229A1 (en) | 2019-10-25 | 2021-04-29 | Iqzone, Inc. | System and method for using activity-backed overlays to display media content on portable devices during periods of user inactivity |
US11409637B2 (en) * | 2019-11-07 | 2022-08-09 | Netflix, Inc. | Page simulation system |
US11106571B2 (en) | 2019-12-12 | 2021-08-31 | Micro Focus Llc | Identification of input object in a graphical user interface |
CN113077735B (zh) * | 2020-01-06 | 2023-11-17 | 广州汽车集团股份有限公司 | 一种车载显示设备的测试方法、装置及系统 |
US10970064B1 (en) | 2020-07-28 | 2021-04-06 | Bank Of America Corporation | Dynamically updating a software program to resolve errors |
USD946031S1 (en) * | 2020-10-19 | 2022-03-15 | Splunk Inc. | Display screen or portion thereof having a graphical user interface for a process control editor |
USD946032S1 (en) * | 2020-10-19 | 2022-03-15 | Splunk Inc. | Display screen or portion thereof having a graphical user interface for a process control editor |
CN113076247B (zh) * | 2021-04-06 | 2023-07-04 | 成都安恒信息技术有限公司 | 一个管理与运行测试脚本的方法及系统 |
CN113342686B (zh) * | 2021-06-30 | 2023-01-10 | 中国建设银行股份有限公司 | 一种测试数据生成方法和装置 |
US11907111B2 (en) * | 2021-09-13 | 2024-02-20 | Sap Se | Database troubleshooting with automated functionality |
CN117951035A (zh) * | 2024-03-26 | 2024-04-30 | 成都飞机工业(集团)有限责任公司 | 一种集成逻辑条件自动测试程序语句构建方法、系统、设备及介质 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101089826A (zh) * | 2006-06-12 | 2007-12-19 | 国际商业机器公司 | 创建容错和自适应图形用户接口测试自动化的方法和系统 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US3866508A (en) | 1970-09-21 | 1975-02-18 | Elmer F Huslig | Stick for playing percussion instruments |
US7526498B2 (en) * | 2001-09-14 | 2009-04-28 | Siemens Communications, Inc. | Method for generating data structures for automatically testing GUI applications |
US7398469B2 (en) * | 2004-03-12 | 2008-07-08 | United Parcel Of America, Inc. | Automated test system for testing an application running in a windows-based environment and related methods |
US20050268285A1 (en) * | 2004-05-25 | 2005-12-01 | International Business Machines Corporation | Object oriented GUI test automation |
US7979846B2 (en) | 2007-04-05 | 2011-07-12 | Accenture Global Services Limited | Automatic test generation for reference testing |
-
2009
- 2009-07-16 US US12/504,467 patent/US8370811B2/en active Active
-
2010
- 2010-06-28 CA CA2708685A patent/CA2708685C/en active Active
- 2010-07-07 EP EP10251219A patent/EP2278469A3/en not_active Withdrawn
- 2010-07-15 CN CN201010232300.4A patent/CN101957791B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101089826A (zh) * | 2006-06-12 | 2007-12-19 | 国际商业机器公司 | 创建容错和自适应图形用户接口测试自动化的方法和系统 |
Also Published As
Publication number | Publication date |
---|---|
CA2708685A1 (en) | 2011-01-16 |
CN101957791A (zh) | 2011-01-26 |
US20110016453A1 (en) | 2011-01-20 |
EP2278469A2 (en) | 2011-01-26 |
US8370811B2 (en) | 2013-02-05 |
EP2278469A3 (en) | 2011-03-09 |
CA2708685C (en) | 2018-04-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101957791B (zh) | 将针对图形用户界面的测试脚本模块化和方面化 | |
Salvaneschi et al. | Context-oriented programming: A software engineering perspective | |
JP4806240B2 (ja) | コンポーネント化された拡張可能なワークフローモデル | |
KR101153057B1 (ko) | 디지털 디바이스 메뉴 편집기를 위한 방법 및 시스템 | |
US8479150B2 (en) | Compositional modeling of integrated systems using event-based legacy applications | |
US20030200533A1 (en) | Method and apparatus for creating software objects | |
CN104471557B (zh) | 动态语言的优化执行 | |
US7962892B2 (en) | Designtime services for multiple patterns | |
CN102222039A (zh) | 使用dsl来调用api以测试软件 | |
JP2006107478A (ja) | ワークフローを設計するための拡張可能フレームワーク | |
KR20060087999A (ko) | 확장가능 워크플로 모델에 관한 선언적 표현 | |
CN101263484B (zh) | 用于声明性定义的控件动作的方法和系统 | |
Duhoux et al. | Implementation of a feature-based context-oriented programming language | |
Lano et al. | Synthesis of mobile applications using AgileUML | |
Shukla et al. | Aspect-oriented programming enables better code encapsulation and reuse | |
Colyer et al. | Aspect-oriented programming with AspectJ | |
Kufner et al. | Restful State Machines and SQL Database | |
Cazzola et al. | Shifting up reflection from the implementation to the analysis level | |
Sriplakich et al. | Enabling dynamic co-evolution of models and runtime applications | |
Virani | A scenario-based model-driven engineering framework | |
Röhs | A visual editor for semantics specifications using the eclipse graphical modeling framework | |
Silingas et al. | Integrating GUI prototyping into UML toolkit | |
Gong | Composition of aspects represented as UML activity diagrams | |
Liu | UML 2.0 with VizzAnalyzer-Visualization of class diagrams | |
Kartaltepe et al. | JOVA: Java Object Viewing Aid |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |