使用dsl来调用api以测试软件的制作方法

文档序号:6423409阅读:222来源:国知局
专利名称:使用dsl来调用api以测试软件的制作方法
技术领域
本发明涉及测试软件,尤其涉及使用DSL来调用API以测试软件。
背景技术
测试例一般是由程序代码组成。随着时间的流逝,通常开发了多个不同程序的一大试验台。当测试程序所测试的软件改变时,测试程序需要被重构并更新。维护测试程序的高成本不仅仅阻止了新测试例的开发也阻止了测试例所使用的库演变。用程序代码书写测试例也使得将测试工作外包给其他公司或供应商变得更为困难,因为书写代码的过程需要被审阅并因为其需要相当多的技巧。

发明内容
测试例被抽象成诸如可重用脚本或文件等声明性形式,其表达任务的意图而非定义将如何执行测试。工具将声明性语句解释成与实现在测试中所指示的动作的代码相对应的一系列步骤。针对测试的模式可以是动态的。测试例的新形式可利用现有的和新的动作来使得动作库可被扩展。库是可互换的。可使用状态机生成测试例。可使用状态机创建新的测试例来动态地编写新的测试例。由于使用非传统编程语言来开发测试,测试开发者在写测试例时服从对他的或她的测试做出选项设置约束的纪律,防止他或她创建无效测试以及提供迫使测试作者考虑测试将如何执行的内建特征。在任何给定点,只有可用动作的有限集是可用的,从而防止测试书写者通过创建不正确的测试而无意地导致问题。提供本发明内容以便以简化形式介绍将在以下的具体实施方式
中进一步描述的一些概念。本概述并不旨在标识出所要求保护的主题的关键特征或必要特征,也不旨在用于限定所要求保护的主题的范围。


在附图中图Ia示出了根据在此公开的主题的各方面的用于使用声明性语言来调用API以执行软件测试的系统100的示例;图Ib示出了根据在此公开的主题的各方面的系统100的分层体系结构如何能在多个开发者团队之间共享的示例;图2a是根据在此所公开的主题的各方面的测试例的示例;图2b是根据在此所公开的主题的各方面的一动作的实现的示例;图2c是根据在此所公开的主题的各方面的测试例的另一示例;图2d是根据在此所公开的主题的各方面的一动作的实现的另一示例;图2e是根据如参照图1所描述的根据在此所公开的主题的各方面的用于使用声明性语言来调用API以执行软件测试的方法的示例的流程图。
图3是示出其中可实现在此所公开的主题的各方面的计算环境的示例的框图;以及图4是根据在此所公开的主题的各方面的集成开发环境的示例的框图。
具体实施例方式概览一般而言,测试是用代码书写的并且与实现紧密地耦合。用代码书写的测试是脆弱的并且难于维护。实现改变通常使得测试不起作用。将测试通过端口传送到不同的自动化框架往往是费力且昂贵的。通常难以知晓自动测试例适用什么情形,因为对用传统编程语言书写的测试代码难以执行查询。用程序语言书写的测试难以读取并难以写。用于书写测试的工具支持是有限的。出于这些原因和其他原因,测试难以外包。在此公开的主题描述了用于数据驱动的(而不是代码驱动的)测试框架的方法、 系统和计算机程序产品,在该测试框架中,测试被抽象为用声明性或域专用语言或脚本指定的动作,而不是用传统编程语言来编码。测试例独立于底层测试自动框架和正在被测试的软件的实现。测试表达要测试什么以及期望什么,而非如何测试。测试引擎可通过解释在测试中指定的动作来执行测试。可互换库可被开发以用于不同的实现和/或不同的自动框架。在此描述的抽象层可被层叠在任何自动框架的顶部,包括但不限于MAUI、DTE微软的 Visual Studio 自动库以及其他自动框架。在此描述的所书写的测试容易写、运行、调试、查询、理解和维护。测试作者被迫以避免重复并促进重用的干净、可维护的方式来分解测试。分层体系结构实现通用层跨多个开发者团队的共享。通过具有可互换库,可容易地管理软件实现中的改变。在此描述的所书写的测试能被用来在用户界面层、组件层、应用程序编程接口(API)层等测试。使用声明性语言来调用API以执行软件测试图Ia示出了根据在此公开的主题的各方面的用于使用域专用语言来调用API以执行软件测试的系统100的示例。系统100的全部或部分可驻留在诸如以下参照图3描述的计算机之类的一个或多个计算机上。系统100的全部或部分可驻留在诸如以下参照图4 描述的计算机之类的一个或多个软件开发计算机上。系统100或其部分可包括诸如以下参照图4描述和示出的集成开发环境的一部分。或者,可提供系统100或其部分作为独立系统或作为插件或附件。系统100可包括诸如计算机102等一个或多个计算机。一个或多个计算机可包括以下的一个或多个处理器(诸如处理器142)、诸如存储器144等存储器、以及诸如模块 140等用于使用声明性语言来调用API以执行软件测试的一个或多个模块。本领域公知的其他组件也可被包括其中但不在这里示出。可以理解的是用于使用声明性语言来调用API 以执行软件测试的模块能被加载到存储器144中,以使得诸如处理器142等一个或多个处理器执行被属性化到用于使用声明性语言来调用API以执行软件测试的模块的动作。用于使用声明性语言来调用API以执行软件测试的系统100可包括以下一个或多个诸如脚本执行器或脚本引擎或解释器106等测试引擎、诸如库108、库109等测试动作的一个或多个库、诸如测试110等测试、模式112、测试查询引擎114以及测试编辑器116。 系统100还可包括正在测试的软件,如图1中由软件120、软件121等示出的。软件120可以是例如正在测试的软件的一个实现而软件121可以是正在测试的软件的另一实现。测试引擎(例如,解释器106)能通过从测试110提取一动作、找到该动作在测试动作库108内的实现并执行该动作来逐步地执行测试110。例如,解释器106能通过解释测试110并在运行时执行测试的各个步骤所对应的实现来执行测试110。能通过将不同的库加载到解释器 106内来在不改变现有测试的情况下提供或改变实现。正在测试的软件的运行实例(作为状态机118)也可被包括在系统100中。系统100可包括交互式编辑环境或REPL或集成开发环境或诸如IDE104等IDE的一部分。诸如测试110等测试或测试例可以是测试意图的抽象。可通过独立于软件的实现和/或独立于测试框架或测试自动框架的声明性语句用声明性形式来指定测试意图。可使用定制的声明性语言、脚本语言、或域专用语言来书写诸如测试110等测试。测试110不使用像C++或0#等传统的、通用的编程语言来书写。在测试110中,表达了测试的意图,但没有定义如何实施测试。即,测试表达了要测试什么而不是如何测试。测试意图与实现分离开,以使得实现不影响测试。这意味着如果软件的实现方面改变,则测试该软件的测试不需要被改变。可通过改变动作实现的库,例如,通过在测试期间将不同的库加载到解释器内, 来处理实现改变。例如,第一动作库可使用测试来测试软件的第一实现,而第二动作库可使用相同的(未改变的)测试来测试软件的第二实现(例如,诸如该软件的第二版本)。类似地,第一动作库可使用测试来测试软件测试的第一自动框架,而第二动作库可使用相同的(未改变的)测试来测试软件测试的第二自动框架。因为测试不依赖于实现,所以测试是可重用的并且对于底层测试框架改变是有回复性的。可修改或替换自动基础结构而不影响测试的效用。在此描述的测试能被用来在用户界面层、组件层、API层以及为测试和生产软件环境测试软件。可根据一方法来创建测试。例如,一显式API设计可要求动作具有可识别签名。 测试例可包括一系列动作。可使用以下更全面描述的方法调用器将动作实现为对于API的调用。测试(例如,测试110)可与诸如模式112等模式关联。模式实现测试正确性的检查,从而得到经验证的测试。例如,可使用XML模式来验证用XML书写的测试。当在诸如测试编辑器116等测试编辑器内编辑并开发测试时,与模式的关联可提供自动的正确性检验并可提供静态类型检查编程协助,诸如自动完成、成员列表等等。当用户使用模式112来开发测试例时,用户输入134(例如,创建测试例)可由编辑器116接收并被检查正确性。可通过模式生成工具113来生成模式112,该模式生成工具跨库反射并生成包括所有有效活动和各个有效活动的有效签名的模式。即,在测试例的开发期间,模式能建立有效活动的有限集以及在该有效活动的有限集内各个活动的有效签名的有限集。模式定义有效的测试文件并可被用来在书写或编辑测试例时提供交互式的编程员协助,类似自动完成和正确性检查。由于使用机器可读的语言来书写测试,可为测试创作提供丰富工具支持。工具的示例包括诸如图1内的编辑器116等编辑器以及其他,包括但不限于生成器、测试搜索器、 导航器等等。可为开发测试提供诸如编辑器116等编辑器。编辑器116可接收诸如模式 112等一个或多个模式以在测试创作者书写或编辑测试110时向其提供诸如自动完成等静态类型检查程序协助。编辑器116也能够基于模式或基于从模式出导出的信息来提供对测试的正确性的验证。诸如库108等库包括一个或多个动作实现。库可以是原子动作的可扩展池。如上描述的,库可以是可互换的。即,一动作实现可被另一动作实现替换,使得通过加载不同的库或库的集合,相同的测试能在不同的实现框架上执行或在软件的不同实现上执行。多于一个的库可同时被加载到解释器或脚本引擎中。如果多于一个的库包括指定的动作,可提供用于选择哪个动作要执行的算法(例如,来自最后加载的库的用户动作、来自第一个加载的库的用户动作、随机选择动作、在库中循环等等)。可使用数据来参数化库中的每个动作。数据描述可形成动作的签名。各个动作可提供由动作的签名所规定的数据。可使用通用编程语言,诸如c#、c++等等,来书写动作实现。通过将代码集中到库中,更容易地避免代码的重复。诸如状态机118等状态机(例如,要测试的软件的运行实例)可提供状态中的改变以使得可进行连续的测试。诸如查询引擎114等查询引擎能在所有测试中搜索指定动作的发生,(例如,寻找行使(按压)计算器等于按钮的所有测试)。由于使用声明性形式来书写测试,能更容易地发现开发中的软件的未测试的部分。在测试执行期间,能加载一个或多个库,库中的一动作能被标识并被动态地加载,并且可执行该动作。脚本执行引擎或诸如解释器106等解释器可接收测试、加载该测试、加载一个或多个库、标识要执行的动作并且以顺序的次序来执行测试的动作。解释器106可动态地加载来自诸如库108等动作库的已知动作。在图2a中示出了测试220的一示例。测试220是用XML书写的,但是可以理解的是测试220可用任何声明性、域专用或脚本语言来书写。以上描述的分层体系结构便于跨多个开发者团队共享通用层。图Ib示出了可如何共享层的示例。产品单元团队150可包括开发者团队,诸如C#团队152、VB团队154和 F#团队156。产品单元专用功能158的示例是由用于0#语言服务专用测试挂钩160、VB语言服务专用测试挂钩162以及FiHg言服务专用测试挂钩164的单独测试挂钩所表示的。通用IDE功能168可由所有产品团队共享(*. IDEffrapper 170 (*. IDE包装170))。通用自动框架172可包括诸如以下的框架由C#团队使用的TNugget (T信息块)174,而DTE自动库 176可由VB团队使用,并且MAUI框架180及其适配器Maui 178可由F#团队使用,其中所有团队正在测试诸如IDE184等产品182。图2a示出了开始于称作TestScenari0 (测试场景)202的测试节点的测试例200 的片段。测试例TestScenario 202是用声明性、域专用、非传统编程语言XML书写的,但是可以理解的是测试例200能用任何声明性、域专用语言、非传统编程语言书写,诸如但不限于Json、LISP、Python、自定义文本文件格式,或作为Microsoft Excel 电子数据表。在 Ig--Bj <LaunchCalcProgram/>204 中 H为 LaunchCalcProgram(启云力 Calc 禾呈;^ ) ^^ ^ ^ 以独立于任何特定实现的声明性方式表达启动一程序(诸如举例而言calc.exe)的意图的动作的示例。在别处,在一个或多个库中,通常存在真实启动计算器程序并与主操作系统交互的代码。语句<LaunchCalCPrOgram/>204之后是几个语句,指示点击计算器的键2 〈ClickCalcButton ButtonName = “2”/>206 (〈点击计算器按钮按钮名=“2”/>206)、加号键〈ClickCalcButton ButtonName =" + "/>208 点击计算器按钮按钮名=“ + ”/>208)、键 2<ClickCalcButton ButtonName =“2”/>210(< 点击计算器按钮按钮名=“2”/>210)或等号键〈ClickCalcButton ButtonName =“ = ”/>212(< 点击计算器按钮按钮名=“ =”/>212)的意图。ButtonName是正在被传送的参数(例如,整数类型的),其指要点击的按钮的属性 (名称)。由此,意图以声明性方式被指示,而不是在测试例中使用自定义代码。行213的语句〈VerifyCalcResult =“4”/>(〈验证计算器结果=“4”/>)表达期望的结果。可以理解的是即使不具有传统通用编程语言的编程语言技巧、不具有自动库的知识的测试作者也能创作这样的测试例。动作名和参数包括动作的签名。与声明性语言关联的模式可被用来在开发者在测试编辑器内书写测试例时,向他或她提供自动完成以及其他类型的编程协助。如上描述的,诸如解释器的测试引擎可加载测试例(例如,测试例200),可标识要被执行的动作以及可标识任何适用的参数。例如,图1的解释器106可加载测试例200,标识语句〈ClickCalcButton ButtonName =“2”/>206 的具有参数 ButtonName =”2”(按钮名=“2”)的动作ClickCalcButton(点击计算器按钮)。解释器可接着动态地加载来自诸如图1的库108等包括真实代码以自动化测试场景的动作库的已知动作。这可通过基于代码反射的机制来将测试例语言与自动代码分离来完成。图2b示出了动作ClickCalcButton(点击计算器按钮)的示例实现的一部分。 例如,诸如C#等传统编程语言的代码可定义可实现特定接口或从特定基动作继承的类型动作(Action) 216 的类名称 ClickCalcButton 214,使得当 ClickCalcButton 214 被执行时,在该特定实现中自定义代码执行指令以做出点击计算器按钮的动作。在运行时,测试引擎可访问测试例中元素的所有特性。例如,在以上描述的测试场景示例中,对应于 ClickCalcButton动作的代码可被单独地执行四次。在ClickCalcButton被第一次调用时, ButtonName的特性可具有值“2”,在ClickCalcButton被第二次调用时,ButtonName的特性可具有值“ + ”,等等。预处理步骤可加载测试例文件并寻找对应于测试例文件中元素的对应代码元素。在运行时,可按将来自测试例文件的信息传送到代码元素的方式来构建代码元素,使得例如,ClickCalcButton动作具有指被按压的键的称作ButtonName的特性。每当执行ClickCalcButton动作时,按钮名被设为适当的值。图2c示出了重命名类的测试220的另一示例。语句〈AddFiIeByContextFiIeName ="RenameGenerics. cs"/>222 — ± Τ" t @ 力Π t # t # $ = "RenameGenerics. cs,,/>222)将文件 RenameGenerics. cs 添力口至Ij IDE。语句 <0penFiIeByContext Filename ="RenameGenerics. cs,,/>224(< 按上下文打开文件文件名="RenameGenerics. cs"/>224)打开文件(例如,通过双击名称触发、或通过从菜单选择一选项)。语句 〈Rename StartLocation = "classl,,OldName ="k" NewName = "ARenamed,,/>226 (< 重命名起始位置=“类1”旧名称="A新名称=“ARenamed” / 调用功能以将类A重命名为类 ARenamed。语句〈FindWhat = “ARenamed”/>228 (< 寻找什么="ARenamed”/>228) 通过寻找类ARenamed来验证重命名操作成功。在语句〈AddFiIeByContextFiIeName = "RenameGenerics. cs,,/>222 中,FileName 是具有值"RenameGenerics. cs” 的参数。在语句 <0penFiIeByContextFiIename = “RenameGenerics. cs “ />224 中,FileNam 是具有值 “RenameGenerics. cs,,的参数。在语句〈Rename StartLocation = "classl,,OldName = "A" NewName = ‘‘ARenamed”/>226 中,具有值‘‘classl” 的 StartLocation、具有值 ‘‘A” 的 OldName以及具有值"ARenamed”的NewName是动作Rename (重命名)的参数。图2d示出了用C#书写的示例动作实现230。在样本动作实现230中,动作签名 232是动作所需的数据的声明。在动作实现230中,从测试例中读取一个字符串(用于寻找什么(What))以及三个布尔。动作234的实现定义要用从测试例中提取的数据完成什么。 对测试例中的每个动作调用,测试引擎初始化动作实例并自动地从测试例中填写特性。例如对于语句〈FindWhat = “ARenamed”/>228,图2d的行236字符串What的内容通过读取来自图 2c 的行〈Find What = “ARenamed” />228 并将 What 设为 “ARenamed” 来设置。特性可以是诸如布尔(bool)、字符串或整数(int)的原语类型,诸如.NET类型或任何类型的列表的复杂类型。可由对象并行化器来执行映射。如果特性(例如行236中的What)被 Required(需要)特性242所标记并且没有在测试例中找到,那么可抛出一异常。图2e示出了根据在此公开的主题的各方面的用于使用域专用语言来调用API以测试软件的方法250的示例。在方面250中描述的一个或多个动作是可任选的。在252,书写或接收动作的实现。在254,从动作库中创建模式。在256,可书写或接收如在此描述的测试例并能使用模式来验证该测试例。在258,运行使用测试例的测试。测试引擎可接收测试例,提取第一动作,通过将测试例中的动作名称与一个或多个库中的动作名称进行匹配来在一个或多个库中寻找动作,实例化实现动作的类,在存储器内创建类的实例,从测试例中读入针对类的实例的参数并调用在该类上的执行方法。或者,方法调用器可从测试例中读入动作并可不仅仅将动作名与动作类匹配还将动作名与任何类上的任何方法匹配,而不调用执行方法。由此,如果存在任何公共(可调用)方法,那么方法调用器可将用于动作的参数当作用于该方法的参数。与调用执行方法相反,方法调用器可调用任何被指定的方法。 这个特征打开了用于通用脚本、API调用、测试、以及用于调用API的基于XML的DSL的创建的可能性,因为API是类上的通常方法。合适计算环境的示例为了提供有关本文所公开的主题的各个方面的上下文,图3以及以下讨论旨在提供其中可以实现各实施例的合适计算环境510的简要概括描述。尽管本文所公开的主题是在诸如程序模块等由一个或多个计算机或其它计算设备执行的计算机可执行指令的通用上下文中描述的,但本领域技术人员将认识到,本文所公开的主题的各部分还能够结合其它程序模块和/或硬件和软件的组合来实现。通常,程序模块包括执行特定任务或实现特定数据类型的例程、程序、对象、物理人为产物、数据结构等。通常,程序模块的功能可以在各个实施例中按需进行组合或分布。计算环境510只是合适的操作环境的一个示例,并且不旨在对此处所公开的主题的使用范围或功能提出任何限制。参照图3,描述了计算机512形式的用于线性栈上高效恢复协同例程的计算设备。 计算机512可包括处理单元514、系统存储器516和系统总线518。处理单元514可以是各种可用处理器中的任一种。还可以使用双微处理器及其他多处理器体系结构作为处理单元 514。系统存储器516可包括易失性存储器520和非易失性存储器522。非易失性存储器 522可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)或闪存。易失性存储器520可包括可充当外部高速缓冲存储器的随机存取存储器(RAM)。系统总线518将包括系统存储器516的系统物理人为产物耦合到处理单元514。系统总线518可以是几种类型的总线结构中的任何一种,包括存储器总线、存储控制器、外围总线、外部总线或局部总线,并且可以使用各种可用总线体系结构中的任一种。计算机512通常包括各种计算机可读介质,诸如易失性和非易失性介质、可移动和不可移动介质。计算机存储介质可以通过用于存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息的任何方法或技术来实现。计算机存储介质包括但不限于,RAM、 ROM、EEPR0M、闪存或其它存储器技术、CDR0M、数字多功能盘(DVD)或其它光盘存储、磁盒、 磁带、磁盘存储或其它磁存储设备、或可以用来储存所期望的信息并可由计算机512访问的任何其他瞬态或非瞬态介质。将理解,图3描述了可充当用户与计算机资源之间的媒介的软件。该软件可以包括可存储在盘存储524上的操作系统528,该操作系统可控制并分配计算机系统512的资源。盘存储524可以是通过诸如接口 526的不可移动存储器接口连接到系统总线518的硬盘驱动器。系统应用程序530利用由操作系统528通过存储在系统存储器516或者存储在盘存储524上的程序模块532和程序数据534对资源的管理。应该明白,计算机可用各种操作系统或操作系统的组合来实现。用户可通过输入设备536向计算机512输入命令或信息。输入设备536包括但不限于定点设备,诸如鼠标、跟踪球、指示笔、触摸垫、键盘、话筒等。这些及其他输入设备通过系统总线518经由接口端口 538连接到处理单元514。接口端口 538可表示串行端口、并行端口、通用串行总线(USB)等。输出设备540可与输入设备使用相同类型的端口。提供输出适配器542以举例说明存在像监视器、扬声器、以及打印机的需要特定适配器的一些输出装置540。输出适配器542包括但不限于,在输出设备540和系统总线518之间提供连接的视频卡和声卡。其他设备和/或设备系统,诸如远程计算机544,可提供输入和输出两种能力。计算机512可以使用到诸如远程计算机544之类的一个或多个远程计算机的逻辑连接来在联网环境中操作。远程计算机544可以是个人计算机、服务器、路由器、网络PC、对等设备或其它常见的网络节点,并且通常包括许多或所有以上相对于计算机512所描述的元件,尽管在图4中仅示出了存储器存储设备546。远程计算机544可经由通信连接550逻辑地连接。网络接口 548涵盖诸如局域网(LAN)和广域网(WAN)这样的通信网络,但也可包括其他网络。通信连接550是指用来将网络接口 548连接到总线518的硬件/软件。连接550可以在计算机512内部或外部并且包括诸如调制解调器(电话、电缆、DSL和无线) 和ISDN适配器、以太网卡等内部和外部技术。应该理解,所示网络连接仅是示例,并且可以使用在计算机之间建立通信链路的其它手段。本领域的普通技术人员可以理解,计算机512或其它客户机设备可作为计算机网络的一部分来部署。在这一点上,本文所公开的主题涉及具有任意数量的存储器或存储单元以及在任意数量的存储单元或卷上发生的任意数量的应用程序和进程的任何计算机系统。本文所公开的主题的各方面可应用于具有部署在网络环境中的具有远程或本地存储的服务器计算机和客户计算机的环境。本文所公开的主题的各方面也可应用于具有编程语言功能、解释和执行能力的独立计算设备。图4示出集成开发环境(IDE) 600和通用语言运行时环境602。IDE 600可允许用户(例如,开发者、程序员、设计者、编码者等)在计算机系统中设计、编码、编译、测试、运行、编辑、调试或构建程序、程序集、网站、web应用程序和web服务。软件程序可包括以一种或多种源代码语言(例如,VisualBasic、Visual J#、C++、C#、J#、Java Script,APL,COBOL, Pascal、Eiffel、Haskell、ML、Oberon> Perl、Python、Scheme、Smalltalk 等)创建的源代码(组件610)。IDE 600可提供本机代码开发环境,或者可提供在虚拟机上运行的托管代码开发,或者可提供其组合。IDE 600可提供使用.NET框架的托管代码开发环境。可使用语言专用源编译器620从源代码组件610和本机代码组件611创建中间语言组件650,并且在执行应用时使用中间语言编译器660(例如,即时(JIT)编译器)从中间语言组件650创建本机代码组件611 (例如,机器可执行指令)。S卩,当IL应用被执行时,其在被执行的同时被编译成适合正在其上执行它的平台的合适机器语言,藉此使代码能跨若干平台便携。或者,在其他实施例中,程序可被编译成适合其目标平台的本机代码机器语言(未示出)。用户可根据已知软件编程技术以及与特定源语言相关联的特定逻辑和句法规则经由IDE 600中的用户接口 640和源代码编辑器651来创建和/或编辑源代码组件。此后, 源代码组件610可经由源编译器620被编译,藉此可创建该程序的中间语言表示,诸如汇编 630。汇编630可包括中间语言组件650和元数据642。应用程序设计可以能够在部署前被验证。此处所述的各种技术可结合硬件或软件,或在适当时以其组合来实现。由此,本文所公开的方法和装置或其特定方面或部分可采取包含在诸如软盘、CD-ROM、硬盘驱动器或任何其它机器可读存储介质等有形介质中的程序代码(即,指令)的形式,其中当程序代码被加载到诸如计算机等机器内并由其执行时,该机器成为用于实现本文所公开的主题的各方面的装置。在程序代码在可编程计算机上执行的情况下,计算设备通常将包括处理器、该处理器可读的存储介质(包括易失性和非易失性的存储器和/或存储元件)、至少一个输入设备、以及至少一个输出设备。可例如通过使用数据处理API等来利用域专用编程模型各方面的创建和/或实现的一个或多个程序可用高级过程语言或面向对象的编程语言来实现以与计算机系统通信。然而,若有需要,程序也可以以以汇编或机器语言来实现。在任一情况下,语言都可以是编译的或解释的语言,并与硬件实现相结合。虽然已结合附图描述了本文所公开的主题,但是应理解,可作出修改以按不同方式执行相同功能。
权利要求
1.一种系统(100),包括处理器(142)和存储器(144),所述存储器包括配置成使所述处理器(142)执行以下的模块(140)执行接收用于测试软件(120、121等)的测试例(110)的测试引擎(106);其中所述测试例(110)包括测试意图的抽象,所述测试意图由独立于所述软件(120、 121等)的实现的声明性语句指定,所述声明性语句指定多个动作的至少一个,其中所述多个动作存储在多个库(108、109等)中的至少一个,其中与所述软件(120) 的第一实现关联的动作存储在所述多个库(108、109等)的第一库(108)中,并且与所述软件(121)的第二实现关联的动作存储在所述多个库(108、109等)的第二库(109)中,使得所述测试引擎(106)通过调用所述第一库(108)内的动作执行由所述测试例(110)指定的动作来测试所述软件(120)的所述第一实现,并且其中所述测试引擎(106)通过调用所述第二库(109)内的动作执行由所述测试例 (110)指定的动作来测试所述软件(121)的所述第二实现。
2.如权利要求1所述的系统,其特征在于,所述测试例包括用于所述多个动作的至少一个的至少一个参数,并且其中所述测试例包括用于所述至少一个参数的值。
3.如权利要求1所述的系统,其特征在于,还包括用于测试例的模式,其中所述模式在所述测试例的创建期间建立有效动作的有限集。
4.如权利要求1所述的系统,其特征在于,所述测试引擎从所述测试例中读取所述多个动作中的一动作,并将所读取的动作的名称与所述多个库的一库中的类上的方法的名称进行匹配,并执行名称相匹配的方法。
5.如权利要求4所述的系统,其特征在于,所述测试引擎将测试例的动作的参数的值分配给所述名称相匹配的方法的参数,并执行所述名称相匹配的方法。
6.一种方法(250),包括在软件开发计算机上接收用声明性形式书写的测试例(256),所述测试例包括至少一个动作、用于所述至少一个动作的参数以及所述参数的值,所述测试例包括独立于软件实现的测试意图的抽象;读取所述测试例的所述至少一个动作、所述参数和所述值;将所述测试例的所述至少一个动作的名称与第一库中一类上的方法的名称相匹配,其中所述第一库与软件的第一实现关联(252);将所述测试例的所述至少一个动作的所述参数的所述值分配给所述第一库中所述方法的参数的值;执行所述第一库中的所述方法以在所述软件开发计算机上测试所述软件的所述第一实现;将所述测试例的所述至少一个动作的名称与第二库中一类上的方法的名称相匹配,其中所述第二库与软件的第二实现关联;将所述测试例的所述至少一个动作的所述参数的所述值分配给所述第二库中所述方法的参数的值;执行所述第二库中的所述方法以测试所述软件的所述第二实现。
7.如权利要求6所述的方法,其特征在于,所述测试例是用脚本语言书写的,并且其中所述权利要求6的方法是通过包括脚本引擎的测试引擎在REPL环境内来执行的。
8.如权利要求6所述的方法,其特征在于,所述测试例是用域专用语言来书写的,并且其中所述权利要求6的方法是通过解释器来执行的。
9.如权利要求6所述的方法,其特征在于,在所述测试例的创建期间的任何给定点,有效活动的有限集以及在该有效活动的有限集内各个有效活动的有效签名的有限集是可用的。
10.如权利要求6所述的方法,其特征在于,使用状态机来动态地编写所述测试例。
11.一种包括计算机可执行指令的计算机可读存储介质,所述指令在被执行时使至少一个处理器接收测试软件(120)的测试例(110),所述测试例包括测试意图的抽象,所述测试意图由独立于所述软件(120)的测试框架的声明性语句来指定,所述测试例(110)包括至少一个动作;将所述测试例的所述至少一个动作的名称与多个库(108、109等)的一库(108)内的动作的名称进行匹配,其中所述多个库中的第一库(108)使用第一测试框架来测试所述软件,并且所述多个库中的第二库使用第二测试框架来测试所述软件。
12.如权利要求11所述的计算机可读存储介质,其特征在于,还包括在被执行时使至少一个处理器执行以下动作的计算机可执行指令将所述测试例的所述至少一个动作的所述名称与所述多个库的一库中一类上的方法的名称进行匹配;将所述测试例的所述至少一个动作的参数的值分配给所述库中所述方法的参数的值。
13.如权利要求11所述的计算机可读存储介质,其特征在于,还包括在被执行时使至少一个处理器执行以下动作的计算机可执行指令接收所述测试例,其中所述测试例是用定制的声明性语言、脚本语言、或域专用语言来书写的。
14.如权利要求11所述的计算机可读存储介质,其特征在于,还包括在被执行时使至少一个处理器执行以下动作的计算机可执行指令接收用于所述测试例的模式,其中在所述测试例的开发期间,所述模式建立有效活动的有限集以及在该有效活动的有限集内各个活动的有效签名的有限集。
15.如权利要求11所述的计算机可读存储介质,其特征在于,还包括在被执行时使至少一个处理器执行以下动作的计算机可执行指令查询测试例。
全文摘要
公开了使用DSL来调用API以测试软件。测试例被抽象成可重用脚本或其他声明性形式,其表达任务的意图而非定义将如何执行测试。工具将声明性测试解释成对应于实现在声明性测试中所指示的动作的代码的一系列步骤。针对测试的模式可以是动态的。测试例的新形式可利用新的动作来使得动作库可被扩展。库是可互换的。可使用状态机来生成测试例。可通过使用状态机创建新的测试例来动态地编写新的测试例。
文档编号G06F11/36GK102222039SQ20111011126
公开日2011年10月19日 申请日期2011年4月18日 优先权日2010年4月19日
发明者C·A·史密斯, D·C·提维, E·I·马伊诺, G·埃斯帕扎-罗梅罗, K·奥森科夫, R·J·卡瓦诺, V·K·乌帕达 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1