在应用主机环境中执行单元测试的方法和装置的制作方法

文档序号:6554752阅读:196来源:国知局
专利名称:在应用主机环境中执行单元测试的方法和装置的制作方法
技术领域
本发明大体涉及软件开发,尤其涉及测试软件组件。
背景技术
在软件的开发、修改或优化中通常都希望测试软件。可将软件作为一个“黑盒子”进行测试,这意味着应用输入来激励该软件,观察响应生成的输出并将其与对正确功能软件的预期响应相比较。这样的测试通常依靠使用与该软件相接的现存外部接口添加输入和输出——所述接口即操作时用于与该软件交换数据的接口。
图1A示出了这一测试方法。使用了开发环境110和主机环境120。在开发环境110内准备测试。需要测试的程序在主机环境120内操作。主机环境120包括接口122和124。
开发环境通常是建立在开发人员编写或测试程序的计算机上的进程。开发环境可以具有多种组件,诸如提供工具以帮助开发人员编写程序或测试的一组件以及为执行测试提供一测试环境的另一组件。主机环境通常是在相同或其他计算机上的进程。主机环境是由人类用户或由开发环境启动用于测试的主机应用程序时由操作系统创建的。
开发环境110包括代理程序112。代理程序112是控制各个测试的定时和顺序的软件程序。代理程序112也可以将那些测试的结果与期望结果相比较并且可以处理那些测试的结果或将其报告给开发人员或系统的某些其他部分。代理程序112调用测试,诸如114A、114B和114C。在示出的实施例中,代理程序112通过测试适配器113调用了一个测试。要执行的每个测试都具有其自身的测试适配器用于为代理程序112提供对所有测试的标准接口。每个测试都施加输入并观察来自在主机环境120中运行的测试程序的输出。
可由能够通过可扩展接口接受内插附件程序的应用程序来创建主机环境120。例如在MicrosoftOffice应用程序套件里的应用程序,诸如Word字处理应用程序或Excel电子表格应用程序都接受内插附件程序。内插附件程序可以是由用户编写的或者是来自某些其他来源。内插附件程序可有一个或多个单元形成。此外,主机环境可包括也可被测试的一个或多个单元。在图1A中,要被测试的主机环境120中的单元一般是由诸如126A、126B和126C的单元示出的。
可以使用黑盒子测试来测试这些单元。对于黑盒子测试,可以通过诸如接口122和124的外部接口访问待测程序。例如,图1A中示出了测试114A到114C通过接口122施加输入并通过接口124获取结果。通过将实际结果与期望结果比较,就可验证待测程序的性能。
将软件作为黑盒子测试的一个缺点是它需要多次输入或输入组合以完全实现所有的单元。此外,如果因为未观察到响应一组特定输入的期望输出而检测到错误很难识别需要修改的指定代码单元以纠正该错误。
图1B中示出了测试应用程序的另一种方法。在图1B中,将诸如单元126A的测试中的单元载入到测试环境130。有时被称为“.测试设备”的代理程序112可类似地控制对要执行测试的选择和定序,诸如通过调用测试154。尽管在图1B的实例中是在单个测试中的单元上和在开发环境或测试环境中执行测试的。
开发环境130包括帮助开发人员编写测试的工具。例如MicrosoftVisualStudio开发环境包含允许开发人员设计测试、控制这些测试的执行并分析其结果的工具。MicrosoftVisual Studio开发环境中所含工具的一大特性称为智能感知(Intellisense)。智能感知特性对代码编辑器的用户提供了上下文敏感的帮助。例如在用户编写访问一程序内一变量的代码时,智能感知特性就可为该用户提供该程序内的变量列表,允许用户快速选择正确的变量使用,或在用户开始输入指令时,使代码编辑器正确地完成这些指令。
如果含有待测码的主机环境内的计划是参考了含有测试程序的开发环境内的计划,则使用Visual Studio开发环境的测试开发人员就能够使用智能感知特性创建用于图1A中示出的测试配置结构的测试。然而仅仅是一个计划的公共接口可在参考它的另一计划中使用。因此,智能感知特性在访问测试中的单元的非公共部分时是不可用的。
希望具有一种测试软件单元的改进方法。

发明内容
本发明涉及一种对软件单元执行测试的方法,该方法允许该测试在主机环境内运行。在主机环境内的测试确保该主机环境能够正确地初始化测试中的单元并允许由主机应用程序提供的上下文信息在测试期间可用。从而能够实现更为完全和精确的测试。在另一方面,在开发环境和主机环境之间的接口可由如下方法提供,即待测软件的方法、性质和其他参数即使不是公共的也能够为开发环境所用。该特性使得动态示例程序测试的生成成为可能。这也使得为准备用于特定单元的测试程序的开发人员提供上下文敏感信息成为可能。
在一个方面,本发明涉及测试在第一环境中操作的程序的方法。这一方法在用于测试具有多个单元并有至少一个单元待测的程序尤为有效。本方法包括在第二环境中执行测试代理程序。该测试代理程序指定将执行用于测试测试中的单元的测试。响应于执行该测试代理程序,就在所述第一环境中执行指定的测试。该测试生成了表示测试中的单元性能的测试结果。来自第一环境中操作的指定测试的测试结果被通信至在第二环境中操作的测试应用程序。
在另一个方面,本发明涉及测试在第一环境中操作的程序的方法。该方法对测试具有多个单元并其中至少有一个单元是测试中的单元的程序尤为有效。本方法包括在第一环境中载入该程序并展现在所述第一环境中一对象的接口。该对象响应由所述端口提供的信息而用于载入测试适配器。该测试适配器执行测试中的单元的测试。
在又一个方面,本发明涉及具有执行各步骤以实现提供了一开发环境的软件系统的计算机可执行指令的计算机可读介质,其中测试程序可以为测试在多个主机环境中的一个内操作的程序的单元而开发,所述计算机可执行指令执行的步骤包括创建测试代理程序;并且创建多个主机适配器中的一个,配置成要由所述测试代理程序使用的每个主机适配器都调用在多个主机环境之一内执行的测试程序。


附图并未按比例画出。附图中,由类似的序号表示在各图中示出的每一相等或接近相等的组件。为了简明起见,并未在每张附图中标出每一组件。在附图中
图1A是示出了现有技术中黑盒子测试的示意图;图1B是示出了现有技术中单元测试的示意图;图2A是示出了根据本发明一个实施例的单元测试的示意图;图2B是示出了根据本发明另一个实施例的单元测试的示意图;图3是示出了根据本发明又一个实施例的单元测试的示意图;图4是示出了根据本发明再一个实施例的单元测试的示意图;图5是示出了根据本发明一个实施例的用户界面的示意图;具体实施方式
图1B中示出的测试方法的一个缺点是测试中的单元126A是在开发环境130内执行的。如果测试中的单元126A请求来自主机环境120的上下文信息,则该信息在测试期间不可得到。对测试中的单元126A中访问或依靠来自主机环境120的上下文信息的部分实行测试的任何测试中的单元126A的测试都很可能失败。测试的失败是因为测试中的单元返回了一个不正确的结果或者是因为在没有上下文信息的情况下测试中的单元不能够操作。
此外,图1B的方法也不能在运行时间建立待测码的情况下使用。例如ASP.NET是允许在运行时间定义被创建代码的条件的编程环境。对于此代码,直到定义所述代码之前不能建立测试设施。
图2A示出了用于测试执行的期望结构。在开发环境110中运行的代理程序112调用测试214。测试214访问在主机环境120中运行的测试中的单元226。依据对其进行编程的特定应用和语言,测试中的单元226可以是在主机环境120中的函数、进程、方法、对象或在内插附件程序或应用程序中的其他构造中的一个或组合。
图2B示出了一个另外的实施例。在图2B的实施例中,测试214是在主机环境120中执行的,并且与开发环境110中的代理程序112通信。在此实施例中,测试214也可以直接访问来自主机环境120的上下文信息。
在图2A和2B中示出的配置允许测试中的单元226在其主机环境内被测试。如果测试中的单元226依靠主机环境120内的任何属性、变量或其他参数,则在其被测试时将访问这些属性、变量或其他参数。同样地,如果测试中的单元226的操作依靠主机环境120内执行的任何初始化,则在测试之前就会初始化主机环境内的测试中的单元226。与现有测试结构相比较,由图2A或2B结构指导的测试会更为精确地表示实际的操作状态并且在其努力实行测试中的单元226内依赖主机环境120的某些参数的部分代码时更不容易失败或产生异常状态。
在某些环境中可以增强在图2A或2B中示出的结构,诸如当测试中的单元226包括非公共接口时。在此使用的术语“非公共”接口意味着从在使用编程语言的标准特性定义接口的程序区域之外的代码的编程语言标准特性无法访问的接口。这些“非公共”接口的实例是称为“内部的”、“受保护的”或“专用的”那些接口。例如在某些编程语言中在“项目”中创建的接口。参考在另一项目中的一个项目允许一个项目中的公共接口用于另一项目,但是非公共接口仅在它们被定义的项目中可用。
当动态地示例、编译测试中的单元226时或者发起在编译或生成测试214时该测试中的单元226不可用的情况下,希望有另外的组件。在这些情况下的增强允许开发环境110内诸如那些包括了智能感知特性的工具正确地显示涉及测试所需的上下文敏感信息,而所述测试将实行测试中的单元226即使它们不能直接访问关于测试中的单元226的变量、方法或其他测试的信息。
图3示出了即使在无法直接访问测试中的单元226的情况下仍允许在其主机环境120内测试该测试中的单元226的测试体系结构的一个可选实施例。图3的实施例还证明了在商业开发环境中可能是需要的封装。例如,封装允许开发环境结合多个主机环境并结合仅有一个相当小数量的附加软件组件的多个测试使用来与每个新的主机环境或每一新的测试相接。
在图3的实例中,代理程序312在开发环境310中运行。作为现有技术中的代理程序312是协调测试执行,接收测试结果并且与用户接口或者报告或使用测试结果的程序。在此实施例中,代理程序312是用C#编程语言编写的函数,但是也可使用任何合适的编程结构来实现代理程序。
在示出的实施例中,代理程序312与测试执行填补(shim)314交互。测试执行填补314代替由现有技术中由代理程序调用的诸如测试适配器113的测试适配器。在测试执行填补314的接口与测试适配器113的接口相同的情况下,能够以现有技术或以任何其他合适的方式构造测试代理程序312。
测试执行填补314封装针对主机环境320的任何接口。在商业开发环境中,开发系统可以认出设置用于反映主机环境320类型的主机类型属性。多个主机适配器是可用的,以允许使用相同的开发环境来准备用于多个主机环境的测试。例如可以使用相同的开发环境来开发为MicrosoftWord字处理应用程序或MicrosoftExcel电子表格应用程序准备的内插附件程序的测试。在此所述的实施例中,每一主机类型可具有一测试执行填补。在此实例中,每一测试执行填补都是一组Visual Basic函数,但是也可使用任何合适的编程构造来实现一测试执行填补。
测试执行填补314为接口的一侧提供在主机环境中操作的程序。此时该接口的相对侧则由主机环境320内的主机适配器322提供。在图3中示出的通信是经过接口122的。更一般的情况是在测试执行填补314和主机适配器322之间的通信可以通过任何合适的通信信道。依据开发环境310和主机环境320的指定实现,合适的通信信道的实例包括共享的存储器空间、命名管线、RPC接口或COM接口。作为另一个实例,可以使用在商业上可得到的.NET主机环境中的“远程”构造来创建通信信道。
在操作期间,主机环境320(或某些内插附件程序)认出主机环境以测试模式操作,并且初始化主机适配器322。作为初始化主机适配器322的一部分,到主机适配器322的接口对于在开发环境中运行的程序变得可用。即使是在测试模式下操作,主机环境320仍载入并初始化测试中的单元226使得测试中的单元226将存在于所述主机环境中。依据具体的主机环境和具体的测试中的单元,主机环境320可以初始化也可以不初始化测试模式下的测试中的单元226的执行。同样依据具体的实现,可由正被执行的测试或以任何其他合适的方式调用测试中的单元的执行。
主机环境和开发环境之间的通信信道允许开发环境内的代理程序312初始化和控制主机环境内测试330的执行,并且接收来自测试330的执行结果。
主机适配器322的具体实现将依赖于主机环境320。作为一实例,在主机环境是MicrosoftOffice应用程序的情况下,主机适配器322可以是一组VisualBasic函数。给予主机适配器一个实例的伪码可包括在附加在此的计算机程序列表中。
在测试模式中放置主机环境的机制还将依赖于开发环境的实现。在ASP.NET主机环境的一个实例中,测试的执行涉及HTTP模块的使用。测试执行填补314能够触发对包括指定了要进入的测试模式的首部的一HTTP请求的发送。该请求还可以表示要测试的单元。不考虑用于初始化测试模式的具体机制,仍在主机环境320中初始化测试中的单元226。
主机适配器322调用特定的测试330。为了进一步的抽象,主机适配器322可以通过测试适配器(图3中未示出)访问特定的测试方法。每个测试都具有其自身的测试适配器,而所有的测试适配器都表示了连接至主机适配器322的一个公共接口。以此方式,对一个主机环境仅请求单个主机适配器322,但是可在主机环境内可调用任何数量的测试。诸如在测试执行时提供给该测试的参数数量和类型的每一测试的具体要求可以封装在所述测试适配器内。
一旦被调用,测试330就与测试中的单元226交互以激励该测试中的单元并且观察其对激励的响应。依据特定的测试中的单元结构和功能以及被执行测试的特性而对测试中的单元226提供各种形式的激励是可能的。例如,测试可以通过调用该单元的方法并且提供作为方法调用内自变量的预定值来为测试中的单元提供激励。
在图3的实施例中,测试330通过存取程序(accessor)访问测试中的单元226。存取程序是使用反映来确定一单元的方法、属性、类或其他参数的程序。可通过将存取程序类稍后绑定到测试中的单元226来创建存取程序。在使用存取程序类时,测试开发人员可以编写测试中的单元诸如参考所述存取程序类的测试330的测试程序而不必知道所述测试中的单元细节。
通过稍后绑定有存取程序类来创建存取程序的一种方法是通过“反映”的使用。“反映”是允许单元读取保持关于其方法、属性、类或其他参数的信息的数据结构的许多编程语言的一种特征。可以使用反映信息来示例存取程序332以使其能够访问作为测试目标的特定测试中的单元226。
在动态地示例测试中的单元226处通过稍后绑定存取程序332特别有用测试中的单元。因为即使在示例测试中的单元226之前存取程序332就可用,所以访问测试中的单元226所需的信息在开发环境310内可用,就使得诸如智能感知的特性可以具有对具有开发测试或测试中的单元226的程序的上下文敏感信息所需的信息。以此方式,可以使用通常设计代码可用的全部工具来准备测试330。
没有必要使用分开的存取程序来接收由测试中的单元226反映的信息。作为一个可选实施例的实例,可将相同的功能并入测试330。
在测试330生成结果时,这些结果可被返回给代理程序312。该结果可以通过主机适配器322返回。另外也可将该结果直接传送给开发环境。例如,代理程序312或测试执行填补314可以包括公共接口。因为是在代理程序312或测试执行填补314之后在开发环境内准备测试330,所以代理程序312或测试执行填补314的接口对于测试330可用。
图3是响应于由开发环境310内的代理程序执行的命令而在主机环境320内初始化和运行的测试中的单元226的一般表示。该一般表示包括即使在不知道或对该测试在编译时间不可用的待测的具体代码时仍旧允许在一开发环境中开发测试的特性。可以用与所述开发环境和主机环境相兼容的任何合适的方式来实现这一测试体系结构。
图4是一过程图解,通过该过程可在表示为ASP.NET环境的主机环境中执行在开发环境中准备的测试。以此方式进行的测试可以验证实现一网站的应用程序的操作。在所述的实施例中,开发环境可以访问用于待测网站的web.config文件以方便所述的接口。
在设计了一个或多个测试之后,用户可以通过开发环境310中的命令行界面调用一测试。在图4的实例中,运行一测试引发代理程序410在开发环境310内的运行并且控制该测试的执行。在此实施例中,代理程序410可以是由C#语言编写的程序。它可以在用于创建被执行测试的相同开发环境中运行或者可以在一个完全分开的开发环境内运行,甚至可以在一台不同的计算机上运行。
为了测试在特定主机环境内的单元,代理程序410示例一个适于与该主机环境接口的测试执行填补412。在此实例中,测试执行填补412包括与ASP.NET主机环境的接口。开发环境可以包括用于每个待执行测试的多个测试执行填补。每个测试执行填补都可作为不同主机环境的主机适配器。
在所述的实施例中,所述测试执行填补不必考虑与其交互的具体主机环境,就能够具有预定格式的一接口432。以此方式,代理程序410可与任何测试执行填补通信。每个测试都具有分开的测试执行填补412以致于可以为代理程序410提供一接口,通过该接口就能够访问任何期望的测试。测试执行填补412发送访问包含有测试中的单元的主机环境320中的应用程序的命令。在主机环境是ASP.NET环境的示出实施例中,通过发出HTTP请求做出访问。HTTP请求指定将被测试的程序或程序对象。在此实例中,该程序对象是由URL识别的页面。HTTP请求指明了在测试模式下应被调用的主机环境以及作为该测试目标的指定的URL。
主机环境320响应由测试执行填补412发送的请求。响应于一请求,就调用HTTP模块450。由模块450表示的具体的HTTP模块可以响应于来自测试执行填补412的请求被具体地创建。如果先前响应于一请求被调用的模块已损坏,就可使用一新模块。然而要是未使用的模块没有损坏,那么也可以使用该模块处理所述请求。在ASP.NET主机环境中能够重新使用HTTP模块是因为ASP.NET的无状态特性。其他主机环境的操作可能有所不同。HTTP模块450的具体格式和创建方法依靠主机环境320的实现并且可以使用响应于测试请求的任何合适的方式。
响应于来自测试执行填补412的请求,HTTP模块450根据主机环境内的正常处理来初始化目标页面。以此方式就可由主机环境正确地初始化该测试中的单元并使其准备好接收测试。在此实例中,目标页面示出作为测试中的单元460。此外。HTTP模块450载入主机适配器454并且使用测试执行填补412对其进行注册,从而将送入主机适配器454的接口展现给测试执行填补412。
主机适配器454提供到主机环境310的接口。在图4的实例中,主机适配器454是以C#函数来实现的。
主机适配器454具有可由在开发环境中执行的程序来访问的接口480。在主机环境320是由ASP.NET提供的所示实施例中,可以通过允许一个程序用另一个程序注册的.NET远程构造来展现接入旨在由其他环境内程序访问的一个软件程序的接口。在此,请求与主机适配器454接口的信息能够使用.NET注册命令的接口436而对测试执行填补412可用。
一旦接口480用测试执行填补412注册,测试执行填补412就可通过接口480与主机适配器454通信。通过接口480,测试执行填补412可以请求关于用于执行指定测试的主机适配器454的信息。可以使用任何合适的命令来获取信息,但在此实例中使用的是接口480上的方法。由此测试执行填补412可以获得对测试适配器456的接口482的访问权。在此实施例中,测试适配器456是为在主机环境内执行的所有测试提供一致接口的包装。测试适配器456可以作为C#函数或者以任何其他合适的方式实现。
测试适配器456创建一个单元测试适配器458的范例,其中所述单元测试适配器458是针对在测试中的单元460上执行的具体测试416。单元测试适配器458可以作为C#函数或者以任何其他合适的方式实现。测试适配器456可被认为是用于单元测试适配器458的存取程序。单元测试适配器458可以通过调用在运行时间内确定的具体测试416而稍后绑定到具体的测试中的单元。稍后绑定所需的信息可从测试416通过反映或其他任何合适的方式导出。
单元测试适配器458包括接口484,通过该接口能够与测试适配器456通信。因为在开发环境310中执行的程序能够通过展现接口482通信,所有无需在开发环境310中展现接口484。
单元测试适配器458调用测试416,允许测试416在主机环境320内执行。作为替代,可将测试功能直接并入单元测试适配器458。
一旦被载入并恰当配置,就可执行测试416。测试416可以是在能由单元测试适配器458载入并运行的DLL模块内,但是也可使用任何合适的形式。可以通过在开发环境310和主机环境320之间被建立的接口来提供具体的命令和上下文数据。所得结果可以通过接口430送回代理程序410。
在开发环境和主机环境内的测试中的单元之间提供接口的具体方法可依赖于该主机环境的细节而变化。例如当主机环境是MicrosoftOffice应用程序套件内的应用程序时,不是指定一网页作为测试目标,而是在开发环境内由测试适配器发送的测试请求可以指定包括了所述测试中的单元的特定文档。
执行单个测试的步骤以其出现在一个实例中的次序用数字1,2……9编号。步骤1表示代理程序410与测试执行填补412通信。步骤2表示测试执行填补412发送测试请求给主机环境320。步骤3表示HTTP模块450注册主机适配器454的接口。步骤4示出了在测试执行填补412和主机适配器454之间的信息交换以允许测试执行填补412提供接口482与测试适配器456通信。步骤5表示在测试执行填补412和测试适配器456之间通信执行一测试所必需的信息。步骤6表示了在运行测试的过程中在测试适配器456和单元测试适配器458之间的通信。步骤7表示了在单元测试适配器458和测试416之间的通信。测试416可以包括关于其应该如何被配置的数据。此外在执行测试的过程期间能够交换数据。步骤8表示了由单元测试适配器458从测试中的单元460中获取的为配置测试目标测试中的单元460所必需的信息。步骤9示出了在开发环境内把测试结果发送回代理程序410。将各步骤编号以提供在单个测试执行期间数据和控制的流程的实例。在实际实现中,这些步骤无需以示出的次序实现。此外,每一步骤不必只出现一次。例如测试适配器414可以在多个实例中发送命令或数据给测试适配器456。
图4示出了单个测试416的执行。在测试实际的应用程序中,也可在一测试运行内执行多个测试。代理程序410同样能够在测试运行内控制多个测试的调用。在测试运行内的每个测试都可利用其本身的测试执行填补412。可以在代理程序410内提供可应用于整个测试运行的属性或其他设置。可以通过测试执行填补412或者通过单元测试适配器458或者提供测试416来应用适用于单个测试的属性或其他设置。
例如,无需为每个测试指定用于测试的一个完整的URL。而可在测试环境中一次指定诸如指定特定机器的部分的URL的某个部分。对URL的所有后续参考都可指该机器。例如可以为要执行的每个单元测试指定一个机器无关的片段,诸如指定特定页面的那部分。
图5示出了使用上述软件配置可能得到的开发环境的附加方面。图5示出了接入到诸如可由程序员用于在开发环境310中开发测试的测试编辑器的界面500。界面500在程序员编写测试程序时显示诸如语句510的程序语句。
界面500还包括在此作为弹出窗口示出的辅助显示区512。辅助显示区可用于显示与用户编写测试程序时相关的信息。在此实例中,辅助显示区512显示了关于用于访问作为该测试程序目标的测试中的单元的存取程序的信息。
即使在编写测试时没有定义测试中的单元,访问它所需的信息也能如图5所示通过存取程序得到。由此也可在开发环境中操作诸如智能感知的特性。
在示出的实施例中,显示的具体信息依赖于上下文。在图5中描绘的实例里,用户已输入了指令510的一部分。指令510包括对用于访问的测试中的单元的代码存取程序内一变量的部分参考。指令的该部分足以识别已输入的哪些需要通过在代码存取程序内定义的变量名来完成。因此弹出窗口512包括在代码存取程序内定义的变量名列表。代替输入完整的变量名,用户可以从弹出窗口512中选择所需变量。从列表中选择条目比要求用户键入该条目的完整标识符更为简单并且更不容易出错。
本方法不限于简单地显示变量名。每当与其他上下文信息相结合的部分指令提供了识别该组选择的足够信息时可以呈现一组选择列表。可以对能够在程序中使用的函数、界面或其他结构使用本方法。可以如现有技术那样执行该选择的组的识别和显示。在主机环境中执行测试中的单元的方法与存取程序的使用兼容以使得为创建图5中显示类型信息所必需的信息可用。
已经讨论了本发明至少一个实施例的若干方面,应该认识到本领域普通技术人员能够轻易获取各种改变、修改和改进。
例如,以上讨论的软件体系结构无需依赖其中执行主机环境和开发环境的具体硬件体系结构。主机环境和开发环境能够在同一单处理器或多处理器系统上执行。“远程”可以位于通过在一台计算机上运行的不同主机应用程序所创建的不同环境之间并且无需是在分开物理位置内的计算机、服务器或其他处理器上执行的进程之间。
而且,诸如图2到图4的附图示出了在开发环境或主机环境内执行的软件组件。如果一个测试具有在该主机环境内可用的方法、属性或其他上下文信息的访问就可认为在该环境中执行了该测试。用于创建或调用一程序的应用程序无需支配该程序执行的环境。
此外,其上执行一程序的硬件无需决定其执行环境。作为一个具体的实例,当希望测试用于诸如PDA或灵巧电话机的便携电子设备的应用程序时,可以希望将主机环境看做是一个分开的远程平台,在其中在主机和开发环境之间的所有交互都是通过.NET远程进行的。另外还希望将所有或部分的代理程序或测试程序载入便携电子设备用于执行。
在此使用时,希望通常在测试中的单元内非公开的方法和变量能够通过存取程序得到反映。更一般地,可以反映测试中的单元的任何参数。通过存取程序反映出的参数性质或类型可以基于其中准备的特定测试中的单元或编程语言而变化。
对测试结果作出的使用并不是对本发明的限制。测试结果可以提供关于测试中的单元的性能的某些方面的数据。性能信息的具体类型将依赖于具体的测试程序。性能信息能够指示该单元是否提供了期望的操作结果。另外它还能够提供关于单元的执行时间或者在测试执行期间使用的处理源的信息。
作为另一个实例,也可改变访问测试中的单元的具体方法。不要求使用抽象。另外还可使用更多的抽象级别。作为一实例,图4示出了测试适配器456通过单元测试适配器458访问测试416。还能够提供附加的抽象级别,诸如通过提供环绕测试416的包装。另外还可以使用更少的抽象级别,诸如通过让测试适配器456直接访问测试416。
通常,在图中示出的含有分开模块的程序为简单起见是以此方式示出的。由多个块示出的函数可以组合成为单个函数、网页或其他程序元素。另外示出在单个块内执行的函数能够在多个程序元素中实现。在上述一个块的函数在多个程序元素中实现的情况下,这些程序元素能够聚集看成单个功能块而被查看。相反地,当一个程序元素实现了示出作为多个块的功能时,就可认为该模块是任何或所有功能块的实现。
这些改变、修改和改进旨在成为本公开的一部分,并且位于本发明的精神和范围之内。因此在前的描述和附图仅出于实例的目的。
能够以任意多种方式实现本发明的上述实施例。例如可以使用硬件、软件或它们的组合来实现这些实施例。当以软件实现时,可以在单个计算机内提供的或是在多个计算机中分布的任何合适的处理器或处理器集合上执行软件代码。
同样在此概述的各种方法或过程也可编码成在使用各种操作系统或平台中的任何一种的一个或多个处理器上可执行的软件。此外,可以使用若干合适的编程语言和/或传统的编程或脚本工具的任一种来编写该软件,并可将该软件编译成可执行机器语言代码。
在此方面,本发明的一个实施例针对带有一个或多个编码程序的计算机可读介质(或多个计算机可读介质)(例如计算机存储器、一个或多个软盘、致密盘、光盘、磁带等),当这些程序在一个或多个计算机或其他处理器上执行时,就可执行实现了上述本发明各实施例的方法。计算机可读介质可以是便携的,以使得存储其上的程序可被载入一个或多个不同的计算机或其他处理器,以如上讨论地本发明实现的各个方面。
在此使用的术语“程序”在一般意义上指的是可用于编程计算机或其他处理器以实现上述本发明各个方面的任何类型的计算机代码或指令集。此外还应认识到,根据此实施例的一个方面,在执行时用于实现本发明方法的一个或多个计算机程序不必位于单个计算机或处理器上,而是能够以模块化的形式分布在多个不同的计算机或处理器中以实现本发明的各个方面。
也是以其通常的意义来使用诸如“参数”、“对象”和“方法”的术语。虽然某些编程语言定义“参数”与将值送入函数相关,但在此使用的术语更一般地指任何信息片段。同样地,某些编程语言使用诸如“对象”和“方法”的术语来指特定的编程构造。除非明确指出,否则在此使用的这些术语不仅限于这些构造。
可以单独、组合地或以未在前述实施例中特别讨论的各种排列来使用本发明的各个方面,因此本发明各方面的应用就不限于在前的描述或示出的附图中所阐述的组件的细节和排列。例如,在一个实施例中描述的各个方面能够与在其他实施例中描述的各个方面以任何方式组合。
在权利要求中使用诸如“第一”、“第二”、“第三”等等的序数术语来修饰的声明要素本身并不意味着任何优先权、优越性,也不意味着一个声明要素的次序先于另一个,或者在执行一方法中诸动作的时间上的次序,而仅仅是标记用于区别具有一指定名的声明要素和具有相同名(但用序数术语)的另一个要素,从而辨别声明的要素。
同样地,在此使用的措辞和术语仅出于描述的目的并且不应被认为具有任何限制的意义。“包括”、“包含”或者“具有”、“含有”、“带有”以及它们在此的变化的使用意味着包括了其后列出的项和其等效物以及附加的项。
计算机程序列表如下是配置成在ASP.NET上运行的测试样本。
[HostType(“ASP.NET”)][WebServerType(WebServerType.WebDev)][UrlToTest(“http//localhost/website/default.aspx”)][PathToWeb(@”c\websites\website”)] public void Test(){System.Web.UI.Page page=TestContext.RequestedPage;Assert.IsNotNull(page,“RequestedPage should not be null.”);PageAccessor accessor=new PageAccessor(page);int result=accessor.Add(1,1);Assert.AreEqual(2,result,“1+1 should equal 2”);}如下是用于实现主机适配器的伪代码实例。void RunTest(ITest test,IResults results){//Get the target process-specific contextITestContext testContext=GetTargetProcessContext();//Load the appropriate test execution adapterITestAdapter testAdapter=LoadTestAdapter(test);//Execute the testtestAdapter.Run(test,testContext);//Feed results back to the test execution shimresults.AddResults(testAdapter.Results);}测试执行填补可以通过如下形式的接口与该主机适配器通信interface ITestExecution{void Initialize();void Run(ITest test);void CleanUp();}如下是在该类稍后绑定到所述测试中的单元时用于创建存取程序的简单存取程序类定义的实例public class CodeAccessor{public CodeAccessor(PrivateObject privateObject){m_privateObject=privateObject;}public int Add(int x,int y){object[]args=new object[]{x,y};int ret=((int)(m_privateObject.Invoke(″Add″,new System.Type[]{typeof(int),typeof(int)},args)));return ret;}}
权利要求
1.一种测试在第一环境内运行的程序的方法,所述程序具有多个单元,包括至少一个测试中的单元,所述方法包括a)在第二环境内执行测试代理程序,所述测试代理程序指定要被执行来测试至少一个测试中的单元的测试;b)响应于执行所述测试代理程序,在所述第一环境内执行一指定测试,所述测试生成表示所述测试中的单元的性能特征的测试结果。
2.如权利要求1所述的方法,其特征在于,还包括把来自在所述第一环境内执行的所述指定测试的测试结果传递至在所述第二环境中执行的所述测试代理程序。
3.如权利要求2所述的方法,其特征在于,在所述第一环境中执行一指定测试包括在所述第一环境内创建一对象并且向所述第二环境内的一对象注册所述对象。
4.如权利要求3所述的方法,其特征在于,执行一指定测试还包括a)在所述第一环境中执行一测试对象;以及b)通过在所述第一环境内的所述对象而在所述第二环境内的所述对象和所述测试对象之间通信。
5.如权利要求2所述的方法,其特征在于,执行一指定测试包括在所述第一环境内执行一测试适配器,并且使用所述测试适配器调用所述指定测试。
6.如权利要求5所述的方法,其特征在于,执行一指定测试还包括用所述测试适配器接收一表示了所述指定测试的参数并且调用响应于该参数选择的测试。
7.如权利要求5所述的方法,其特征在于,所述第一环境包括一可扩展接口,并且执行一测试适配器包括响应于通过该可扩展接口提供的命令而在所述第一环境内执行一测试适配器。
8.如权利要求1所述的方法,其特征在于,所述测试中的单元具有一非公共接口,并且执行一指定测试包括通过它的非公共接口实行所述测试中的单元。
9.一种测试在第一环境内运行的程序的方法,所述程序具有多个单元,至少一个所述单元是测试中的单元,所述方法包括a)在所述第一环境内载入所述程序;b)展现所述第一环境内的一对象的接口;c)响应于通过所述接口提供的信息而使用所述对象载入一测试适配器;以及d)使用所述测试适配器来执行至少一个测试中的单元的测试。
10.如权利要求9所述的方法,其特征在于,还包括响应于在第二环境中执行的测试代理程序的执行通过所述接口提供信息。
11.如权利要求10所述的方法,其特征在于,响应于在第二环境中测试代理程序的执行提供信息包括在开发环境内执行所述测试代理程序。
12.如权利要求10所述的方法,其特征在于,响应于在第二环境中执行的测试代理程序的执行通过所述接口提供信息包括基于所述第一环境的属性选择一测试执行填补,并且通过该测试执行填补访问所述接口。
13.如权利要求9所述的方法,其特征在于,还包括将所述第一环境置于测试模式下。
14.如权利要求9所述的方法,其特征在于,在所述第一环境中载入所述程序包括使用一应用程序载入一内插附件程序。
15.如权利要求10所述的方法,其特征在于,所述第一环境是在第一进程中创建的,而所述第二环境是在第二进程中创建。
16.如权利要求9所述的方法,其特征在于,还包括a)反映所述第一环境中一单元的参数;以及b)使用所反映的参数来配置所述测试适配器。
17.一种具有用于执行实现一软件系统的各个步骤的计算机可执行指令的计算机可读介质,所述软件系统提供一开发环境,在其中能够开发测试程序用于测试在多个主机环境之一内运行的程序单元,所述计算机可执行指令执行如下步骤a)创建一测试代理程序;以及b)创建多个主机适配器中的一个,每个主机适配器被配置成由所述测试代理程序用来调用在所述多个主机环境之一内的测试程序的执行。
18.如权利要求17所述的计算机可读介质,其特征在于,所述软件系统还包括用于执行如下步骤的计算机可执行指令a)接收来自用户的指定了测试程序中部分指令的输入;以及b)响应于来自用户的所述输入选择性地显示关于参数的上下文敏感信息,所述参数可在所述测试程序的指令中使用以访问所述程序的单元。
19.如权利要求18所述的计算机可读介质,其特征在于,所述软件系统还包括用于实现接收参数的各步骤的计算机可执行指令,其中所述参数涉及从所述单元中反映出的所述程序单元。
20.如权利要求17所述的计算机可读介质,其特征在于,所述软件系统还包括用于创建一对象的计算机可执行指令,其中所述对象基于关于从所述单元中反映的所述程序单元的信息来配置一测试程序。
全文摘要
一种在其中准备了单元测试的开发环境。所述单元测试在主机环境中运行以实现更为完全和精确的程序单元测试。开发环境使用一测试执行填补来访问在主机环境内运行的适配器。该主机适配器可以调用运行指定测试的其他程序对象。这些对象可以稍后绑定至所述测试中的单元。存取程序类能够促进对指定测试中的单元的稍后绑定同时允许在开发环境内编写测试,以使用访问测试中的单元所需的上下文敏感信息。
文档编号G06F11/36GK1838089SQ200610009309
公开日2006年9月27日 申请日期2006年2月23日 优先权日2005年3月23日
发明者B·R·克劳福德 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1