第18章测试策略模式18.1记录测试(也称为记录与回放测试、机器人用户测试、捕获/回放测试)如何准备软件的自动化测试?通过记录与应用程序的交互并使用测试工具回放它们来自动化测试。测试脚本1测试脚本2测试脚本3测试脚本库输入输入输出输出SUT夹具测试记录器输入输出图18-1记录测试示意图自动化测试有几个目的。在回归测试软件更改之后,它们可以用于这些软件。它们有助于归档软件的行为。在写软件之前,它们可以指定其行为。如何准备自动化测试脚第Ⅲ部分模式202本,对可以将它们用于什么目的、它们对SUT中的变更有多健壮以及准备它们需要多少技能与努力等产生影响。记录测试使得能够在构建SUT之后、改变它之前迅速创建回归测试。18.1.1运行原理我们使用一种工具,它会监控我们与SUT的交互。这种工具记录大多数SUT对我们的通信以及我们对SUT的响应。录音会话完成之后,可以将它保存在文件里以便稍后回放。准备运行测试时,可以从工具的“回放”部分开始,并让它指向录音会话。它启动SUT,并给它提供响应SUT输出的记录输入。在录音会话内,它也可以比较SUT的输出及其响应。错误匹配可能导致测试失败。有些记录测试工具允许调整录音会话内SUT表现与回放过程中SUT表现之间比较的敏感性。大多数记录测试工具通过用户界面与SUT交互。18.1.2使用时机如果应用程序正在运行,但不希望对它进行太多变更,就可以使用记录测试进行回归测试。现有应用程序需要重构(预计修改功能性)而没有可用的脚本测试用作回归测试时,也可以使用记录测试。通常,生成一组记录测试比准备具有相同功能性的脚本测试更快。在理论上,任何知道如何运行应用程序的人都可以完成测试记录,几乎不需要专业技术。实际上,许多商业工具都值得深入学习。同时,需要一些专业技术来添加“检查点”,以便调整回放工具的敏感性,或者调整测试脚本(如果记录工具记录了错误信息)。大多数记录测试工具通过用户界面与SUT交互。如果SUT的用户界面不断发展,这种方法特别容易让它们变得脆弱(接口敏感性,参见“脆弱测试”)。甚至是小的变更(例如改变按钮或字段的内部名称)也足以让回放工具产生错误。这些工具也倾向于在低级别详细记录信息,这样会让测试难以理解(参见“模糊测试”)。因此,如果对SUT的变更中止了这些工具,也很难手动修复它们。所以,如果SUT不断发展,就要准备有规律地再记录测试。如果要使用作为文档的测试或者要使用这些测试驱动新的开发,就应该考虑使用脚本测试。使用商业记录测试工具难以实现这些目标,因为大多数工具不允许定义用于测试记录的高级语言。将记录测试性能构建到应用程序本身之中或者使用重构的记录测试可以解决这个问题。变体:重构的记录测试这两种策略的混合是,使用“记录、重构、回放”1顺序从最新记录测试中提取一组“动作组件”或“动词”,然后通过测试用例来调用这些“动作组件”(而不是使用详细的内联代码)。大多数商业捕获/回放工具提供将字面值转换为参数的方法,主要的测试1名称“记录、重构、回放”是AdamGeras提出来的。第18章测试策略模式203用例可以将这些参数传递到“动作组件”。屏幕改变时,只需再记录“动作组件”,所有测试用例自动使用新的“动作组件”定义继续运行。这种策略在效能上与使用测试实用程序方法与单元测试中的SUT交互相同。它允许使用重构的记录测试组件作为脚本测试中的高级语言。像MercuryInteractive的BPT2这样的工具以自顶向下的方法将这一范式用于脚本测试。开发完高级脚本并指定了测试步骤所需的组件之后,更多的技术人员就可以记录或手动编码单个组件。18.1.3实现方式说明使用记录测试策略时,有两种基本选择:可以获得第三方工具,它记录与应用程序交互时发生的通信;可以将“记录与回放”机制内置于应用程序。1.变体:外部测试记录在商业上有许多测试记录工具可用,每种工具都有自身的优缺点。最好的选择取决于应用程序用户接口的性质、预算、要验证的功能性的复杂性以及其他可能的因素。如果要使用测试来驱动开发,就需要挑选使用测试记录文件格式的工具,这种格式可以手动编辑且易于理解。需要手动编写内容,如果使用“记录与回放”工具来执行测试,这种情况也还是脚本测试的示例。2.变体:内置测试记录也可以将记录测试性能内置于SUT。在那种情况下,可以用相当高的级别定义测试脚本“语言”,级别足够高,就可以在构建系统之前手动编写测试。实际上,有报告说MicrosoftExcel电子数据表的VBA宏性能是Excel自动化测试机制的开端。18.1.4示例:内置测试记录从表面上看,提供记录测试的代码样本没有意义,因为这种模式处理生成测试的方法,而不是表示它的方法。回放测试时,实际上就是数据驱动测试。同样,通常不重构到记录测试,因为它经常是项目尝试的第一种测试自动化策略。而且,如果发现有过多遗漏的测试,还可以在尝试脚本测试之后引入记录测试,因为手动自动化的成本太高。在那种情况下,不应该试图将现有脚本测试转换为记录测试,应该记录新测试。下面是应用程序本身记录的测试的示例。该测试用来回归测试安全关键的应用程序,并且在它从OS2上的C移植到Windows上的C++之后。请注意,记录的信息如何形成用户易于理解的域专用高级语言。interaction-logcommands!--morecommandsomitted--commandseqno=2id=SupplyCreate2BPT是“业务进程测试(BusinessProcessTesting)”的缩写。第Ⅲ部分模式204fieldname=enginenotype=inputused-value5566/used-valueexpected/expectedactualstatus=ok//fieldfieldname=directiontype=selectionused-valueSOUTH/used-valueexpectedvalueSOUTH/valuevalueNORTH/value/expectedactualvaluestatus=okSOUTH/valuevaluestatus=okNORTH/value/actual/field/command!--morecommandsomitted--/commands/interaction-log该样本表示回放测试的输出。内置回放机制插入了actual元素。status属性表示这些元素是否匹配expected值。将样式表应用于这些文件来格式化它们,就像具有彩色编码结果的Fit测试一样。然后项目的商业用户可以进行记录、回放和结果分析。在软件的表示层插入挂钩可以记录用户和用户响应提供的选项列表。其中一个挂钩的示例如下所示:if(playback_is_on()){choice=get_choice_for_playback(dialog_id,choices_list);}else{choice=display_dialog(choices_list,row,col,title,key);}if(recording_is_on()){record_choice(dialog_id,choices_list,choice,key);}方法get_choice_for_playback检索used-value元素的内容,而不是要求用户从选项列表中选取。方法record_choice生成actual元素并“断言”expected元素,记录各元素status属性的结果。注意,当处于回放模式时,recording_is_on()返回true以便记录测试结果。18.1.5示例:商业记录与回放测试工具几乎有所商业测试工具都使用“记录与回放”隐喻。每种工具都定义自己的记录测试文件格式,其中大多数都非常冗长。下面是使用MercuryInteractive的QuickTestProfessional[QTP]工具记录的测试的“简短”摘要。它显示于“专家视图”中,该视图第18章测试策略模式205表示真正记录的内容:VbScript程序!该示例包括手动插入的注释(前缀为@@)来说明测试在做什么,如果改变导致测试不再运行的应用程序之后记录测试,那么就会丢失这些注释。@@@@GoToPageMaintainTaxonomy()@@Browser(Inf).Page(Inf).WebButton(Login).ClickBrowser(Inf).Page(Inf_2).CheckCheckPoint(Inf_2)Browser(Inf).Page(Inf_2).Link(TAXONOMYLINKING).ClickBrowser(Inf).Page(Inf_3).CheckCheckPoint(Inf_3)Browser(Inf).Page(Inf_3).Link(MAINTAINTAXONOMY).ClickBrowser(Inf).Page(Inf_4).CheckCheckPoint(Inf_4)@@@@AddTerm(A,TopLevel,TopLevelDefinition)@@Browser(Inf).Page(Inf_4).Link(Add).Clickwait4Browser(Inf_2).Page(Inf).CheckCheckPoint(Inf_5)Browser(Inf_2).Page(Inf).WebEdit(childCodeSuffix).SetABrowser(Inf_2).Page(Inf).WebEdit(taxonomyDto.descript).SetTopLevelBrowser(Inf_2).Page(Inf).WebEdit(taxonomyDto.definiti).SetTopLevelDefinitionBrowser(Inf_2).Page(Inf).WebButton(Save).Clickwait4Browser(Inf).Page(Inf_5).CheckCheckPoint(Inf_5_2)@@@@SelectTerm([A]-TopLevel)@@Browser(Inf).Page(Inf_5).WebList(selectedTaxonomyCode).Select[A]-TopLevel@@@@AddTerm(B,SecondTopLevel,SecondTopLevelDefinition)@@Browser(Inf).Page(Inf_5).Link(Add).Clickwait4Browser(Inf_2).Page(Inf_2).CheckCheckPoint(Inf_2_2)infofile_;_Inform_Alberta_21.inf_;_hightlightid_;_Browser(Inf_2).Page(Inf_2)_;_@@@@anditgoeson,andon,andon....注意,测试依据应用程序用户界面描述所有输入和输出的方法。这样主要会产生两个问题:模糊测试(由记录信息的具体性质所导致)和接口敏感性(导致脆弱测试)。第Ⅲ部分模式20618.1.6重构说明让该测试作为文档可以使之更有用,能够降低或避免高测试维护成本,支持使用一系列提取方法[Fowler]重构组成使用高级语言的其他测试。18.1.7示例:重构的商业记录测试下面的示例显示重构来交流意图的相同测试:GoToPage_MaintainTaxonomy()AddTerm(A,TopLevel,TopLevelDefinition)SelectTerm([A]-TopLevel)AddTerm(B,SecondTopLevel,SecondTopLevelDefinition)注意,该测试的意图变得非常明显。提取的测试实用程序方法如下所示:MethodGoToPage_MaintainTaxonomy()Brow