一个良好的自动化测试框架应该具备灵活的,与应用程序无关的,与技术无关和不过时的特点。本文强调的准则可以帮助开发者深层分析测试方案中的代码。这种能力已经被证明在多个自动化项目上是有效的。
“自动化框架”这个术语已经为软件测试领域所熟知。尽管很多人都把它与应用在基于UI自动化的技术联系起来,但是它几乎总是被滥用于那些参与测试领域。这大部分的原因是由于大家对自动化框架的应用领域有误解。它应该不仅仅像Coded UI那样,只是一个单纯的UI技术。
现在,市场上有很多商业性的和开源的测试自动化框架。使用这些框架的主要问题在于调整他们的学习曲线和满足自动化项目的要求的困难性。虽然有一些广泛应用的遗留框架,但是他们还是有很多缺点。
他们缺乏灵活性,再使用昂贵的第三方产品——或者,添加一个单纯的现有用户界面技术,但不提供额外的价值。
一个良好的自动化测试框架应该具备灵活的,与应用程序无关的,与技术无关和不过时的特点。它应该支持一个易于安装和使用的结构化和模块化的编程模型。说“易于使用”,我们是假设和期望用户是有经验的软件开发人员。自动化是发展和正确的软件工程技能,对于计划和成功得实施一套自动化是有需要的。
开发一个基于UI功能自动化系统背后的想法是,运用这一框架来提高代码的可重用性、稳定性和可维护性。该代码应该是容易编写、调试、部署和运行,发生失败应该易于分析。不管你使用Ranorex,Coded UI,Telerik或Selenium
作为底层自动化技术,设计和实现自动化的解决方案都应该是相同的。我们选择去建议和实施的范式和模式是任何开发项目的最佳实践,但他们对于UI自动化尤其有用。
我们已经在外面公司对几个不同的项目创建了自动化框架。在一些类似的模式中,我们可以提取其中的相同之处。这些项目的主要问题与方法和可重用性的不同相关。除此之外,不同的团队通过使用不同的自动化工具来测试应用程序功能,这也导致了整体的难度。
一般来说,一个自动化框架可以被定义为一套可以为自动化软件测试提供支持的假设、概念和工具。它有以下的功能:
﹒定义自动化测试脚本的方法
﹒提供建立联系机制SUT(测试系统)
﹒执行测试和报告结果
﹒减少自动化项目启动时间
﹒建立一个共同的标准
基本原则
让我们假设我们有一个具有丰富的用户界面和大量的控制的复杂的应用程序,但它只有两个屏幕。应用程序是复杂的事实可能意味着它可以有几十个手动功能测试例子。所有这些使用相同的两个屏幕。那么,我们怎样才能增加这样的测试解决方案的可维护性?
分层架构模式
把软件系统体系结构分解为单独的一层的想法是非常普遍的。第一个是逻辑展示层面,,第二个是业务逻辑层面,第三个层次是负责数据存储。使用这种模式可以降低应用程序的维护成本从每一层内的组件可以改变而不影响其他的水平。同样的方法可以应用于测试系统。
测试代码可以分为三层:
•为UI自动化工具访问被测系统的接口层
•逻辑功能层
•测试用例层
每一层执行某项任务时都有一个降低测试的费用维护和促进创造一个新的测试的共同的目标。
图1:架构原型,测试系统的多层体系结构
Page Object
根据每个单独的测试案例来创建单独的测试逻辑、业务库和UI Map,为我们提供了特殊能力来修改当前测试用例。
让我们假设我们的应用程序是web邮件服务Gmail,并且两个屏幕之一是登录屏幕。登录流程被所有测试用例中所使用。(例如,为了得到第二个屏幕,您需要执行首先登录到应用程序)。
图2:谷歌邮件登录
让我们假定UI中有一些东西改变了,但是不合逻辑的。在我们的特定情况下,每个登录进入Gmail的现在需要输入验证码。
图3:谷歌邮件登录与验证码
这意味着每个测试案例现在应该更新为新的登录流程。但是一般来说,这只符合逻辑地更新一段代码。此时Page Object和功能方法模式的作用就显而易见。如果只有一个页面对象宣布登录屏幕和一个登录方法,只需要两个参数(即登录名和密码),然后只有身体的登录功能方法需要更新,以涵盖所有情况下与这种变化有关。
页面的无缝衔接
页面的无缝衔接的实现背后的想法是,在页面对象的所有方法返回另一个页面对象类实例(下一个SUT上下文页面)。例如,登录方法在我们的样例返回主应用程序默认的屏幕。它使一系列步骤的功能测试用例编写一个接一个,使这种用方法去链接。因此,业务方法本身就能够通过IDE的智能感知,为测试脚本的开发人员的代码提出建议。
面向切面编程
面向切面编程实现方面似乎是很有价值的,特别是如果你需要用特定方法到try-catch块,或写报告日志条目进入/退出方法。这种方式,包含面向切面实现方面有助于提高自动化代码,使它更具可读性和可以理解的。
构建/运行时验证
自动化框架也经常建议企业标准。大多数开发人员常将同样的自动化方案应用在不同的项目上,这是一个十分棘手的问题。所以,自动化框架可以提供一系列设施,去验证在商业程序库或者功能测试中的方法是否是最佳方案。
有不同的方法可进行验证:
• 使用IDE扩展/插件等可能设置自定义构建的规则(例如:ReSharper, StyleCop for Visual Studio)
•编写自己的ID扩展名
•编写一个机制,可以验证测试是否包含预期的属性在运行,如果有什么不正确的在运行,它将因描述性的错误而失败。
以下提供一些可被验证的项目的简单列表:
•测试脚本的命名
•有适当的注释/描述
•业务方法的返回值/参数
•解决方案分层 (确认不会有交叉层次访问冲突在自动化代码中出现)。
自动化测试框架的硬件支持
显然,该框架不能只包括最佳实践。没有人能够在没有任何基础设施来支持他们的情况下继续做下去。以下提供的是一些有助于更好的理解自动化框架实现的指引。
首先我们需要以某种方式运行测试。在大多数情况下,单元测试框架是用于运行功能测试和衡量结果。有了各种技术/语言的支持,能够为功能测试代码和持续集成(CI)系统完美的结合提供了多种选择的单元测试框架。
为测试运行加载配置
测试配置很大程度上取决于SUT域和测试细节。例如,在大多数测试流的所有配置(如参数、远程连接服务器等)可以只是在测试脚本中写死的。
在数据驱动的测试中, 当相同的测试可以使用不同的配置(例如,输入参数)多次运行的情况下,单元测试框架还提供从外部存储设备读取数据测试脚本。
因此,如果需要自定义配置加载的实现你的自动化框架的话,您需要仔细反复检查。
报告测试结果
报告测试结果/调试测试信息是自动化框架的最重要的功能之一。
有以下几个原因:
﹒报告分析简化了测试应用程序/故障排除,所以你的报告的信息越多,它提供的支持越好。
﹒报告是所有的项目经手人观察到的结果。
如果你想跟踪测试执行在一段时间内的一些动态变化,你应该运用额外的设备将测试结果永久地保存到数据库,这样就可以作比较。
别忘了把一些花俏的东西放进报告表示层(xml / html),如公司标志、结构化输出等。这些事情能够极大地改善你的管理。如果你提供一个“时间”报告,图表也需要高度重视。
验证
再者,大多数单元测试框架已经有一套支持在测试脚本中执行Assert/Verify的机制。这是一个很好创建自己的验证机制的实践,以便:
﹒从一个特定的单元测试框架中抽象用例断言
﹒为你的需求定制一套验证方法
﹒添加特定的逻辑到您的验证方法,让您的验证结果自动写入报告
切面
自动化测试解决方案在不同的项目中大多是类似的。所以为现有解决方案增加自动化框架工具应该是个简单的事情。如果你想为现有项目提供更多实用价值,使用框架来减少迁移工作是很重要的。
这方面确实很有帮助。只需添加一个方面属性定义到一个测试项目,一会儿你就会有一个广泛的报告机制在您的测试解决方案中激活!当然,它的实现需要一些高级方面,但这绝对是值得的。
关键词
你可能觉得有趣的是,我们在这篇文章中没有提及任何关键字驱动框架。关键字市场另一组可用的解决方案,包括商业的和开源的。可以肯定的是,已经有成百上千的自定义关键字驱动框架存在。但是,我们发现他们是并不完整的。原因如下:
﹒他们没有解决测试脚本的可维护性。他们中的大多数介绍是大量重复的。
﹒把关键字驱动框架紧密地绑定到特定的自动化工具(或者是一个UI自动化工具)的一部分,这使得在解决方案开发没有变化。
结论
在本文中,我们描述了我们在自动化框架的实现中的一些经验。这篇文章强调的一些原则可以提供在深度上分析测试方案的代码的能力,并被证明在多个自动化项目中是有效的。作为一个例子,其中一个我们已经开发了大约500个业务场景与110个测试用例,每个测试用例平均30步骤(请注意,一步也可以由几个业务方法调用)。所描述的方法使我们能够达到每一个业务场景36倍的平均可重用性。
这是由你来决定你的自动化项目使用什么框架。也许这将是一个简单的记录/回放页面工具与一群或者是一组关键字驱动脚本的表格。但是,当涉及到自动化的一百多的测试用例时,您需要证明较高的成熟度级别来实现您的测试解决方案的可维护性。
Oleksandr Reminnyi作为SoftServe Inc的软件工程师,SoftServe Inc是一家全球领先的外包产品和应用开发公司。Oleksandr Reminnyi负责为新的和现有的客户建立自动化项目和流程。他认为,成功和失败是完全取决于自动化建立过程是否设定正确的目标。他目前正在他的博士学位致力于研究自动化。
David Krauss拥有超过30年的应用经验和产品设计和交付,与广泛的编程和跨多个平台架构经验,技术,和语言。精通遗留资产现代化,全球协作开发过程,客户机/服务器和网络平台,测试自动化(一个专利自动化,自动化生成一个专利申请中)。二十多年专业从事自动化测试工具和范例,自动化框架和测试方法。
【英文原文:Creating an Effective GUI Automation Framework】
{测试窝原创译文,作者:紫晴}