【51CTO.com快译】现如今,无论是软件测试人员,还是利益相关者,都已经认识到:实现测试自动化框架对于软件项目的成功是至关重要的。它不但能够提高测试的效率,而且可以减少人工干预的工作量。
在本文中,我们将深入探讨什么是真正的测试自动化框架,自动化脚本是如何工作的,以及此类框架是如何在测试过程中给团队提供竞争优势的。
定义测试自动化
在任何行业中,自动化通常被解释为通过智能算法,来自动处理各种流程,而且几乎不需要人工的干预。在软件行业中,测试自动化意味着:使用受许可版本或开源版本的自动化工具,对软件应用程序执行各项测试。从技术角度来说,测试自动化框架是一组定制的交互式组件,它可以协助执行脚本化的测试,并全面地报告测试结果。
为了成功地构建自动化框架,软件质量保证专家必须通过全面考虑与设计,来控制和监视整个测试过程,并提高结果的准确性。与此同时,那些经过精心设计的自动化框架也能够让测试人员以实用、简化的方式,来执行各项自动化的测试。
通常,根据自动化需求目标的不同,我们可以选择并创建如下不同的框架:
以工具为中心的框架
无论是商业版工具还是开源的自动化工具,它们都拥有自己的系统框架,可以在各种测试环境中提供测试套件,实施分布式测试,并最终生成报告。最典型的示例当属Selenium自动化框架。该框架的主要组件是WebDriver。作为基于Web的浏览器插件,该组件可被用于控制和操作Web浏览器中应用程序的DOM模型。此外,Selenium自动化框架还带有各种实用的编码库,以及支持记录回放的工具。
Serenity是另一个自动化工具的框架。它围绕着Selenium Web驱动构建了一个加速器。为加快测试自动化实施过程的速度,Serenity还能够将特定的组件与社区内的其他工具相组合。
除了上述两种工具,业界还有TestComplete、以及Ranorex HP QTP等工具。作为已部署的预构建框架,它们都带有用户行为模拟器、报告和脚本IDE等功能。
面向项目的框架
定制此类框架主要是用于实现特定应用项目的自动化。特定项目的框架既可以支持某些目标应用的测试自动化需求,又能够被开源库构建的组件所驱动。此类框架围绕着被测系统(System Under Test,SUT)创建了一个友好的测试环境,以运行和覆盖各种基本功能。其中包括:对已开发的应用进行部署,运行,并且通过包装器(Wrapper)的控制以简化编码,执行测试用例,以及输出测试结果报告。面向特定项目的框架还应该通过组件,以支持在不同的操作系统和浏览器上,进行跨多种云端环境的测试。
关键字驱动的框架
这是一些旨在给开发人员和测试人员带来较少代码体验的框架。那些被应用于代码之中的关键字集(如:Login、NavigateToPage、Click、以及TypeText)会被安装到代码库中,作为一个关键字的存储库。根据给定的关键字,测试人员可以参考编写处对应的脚本,并以电子表格的形式,传递到关键字解释器中,予以执行和测试。因此,对于技能不足的人员来说,他们能够据此轻松地编写和理解各种自动化脚本。
理想的测试自动化框架的主要组件
如果您想实现功能强大、且性能卓越的测试自动化框架,那么无论采用开源的、还是商用的框架,都必须包括一些核心的构成组件。它们分别是:
1.测试库
a)单元测试
您需要将单元测试库用于:
- 通过特定的形式注解(例如@Test或[Test]),来定义正在使用的测试方法。
- 执行能够影响自动化测试最终结果的断言(assertion)。
- 运行简单明了的测试。
无论您是通过命令行、IDE、专用工具、还是CI(持续集成)系统,来运行测试,都需要确保单元测试能够以直观的方式得到运行,并能够提供相应的单元测试库。
通常,单元测试库可以支持几乎每一种编程语言。其中包括:
- 针对Java的JUnit和TestNG。
- 针对.Net的NUnit和MSTest。
- 适用于Python的unittest(以前叫做PyUnit)。
b)集成和端到端测试
在执行集成和端到端测试自动化时,我们往往需要检验现有测试库所提供的各项功能。为了消除不必要的编码负担,那些由应用UI驱动的API级别的测试,需要通过组件,轻松地与被测应用进行交互。因此,我们不能仅专注于如下方面的编码工作:
- 连接到应用程序。
- 发送各种请求。
- 接收各种结果回应。
此环节涉及到的重要测试库有:
- Selenium(主流语言都可使用)。
- Protractor(特定于JavaScript)。
- Karate DSL(特定于Java的API级集成测试,请参见:https://github.com/intuit/karate)
c)行为驱动开发(Behavior-Driven Development,BDD)
专门针对BDD的测试库往往以行为规范为目标,以可执行代码的形式创建各种可执行的规范。尽管它们不能像测试工具那样直接与被测应用进行交互,但是我们可以将不同的功能和预期的行为场景转换为代码。通过对BDD流程的支持,我们可以创建与自动测试范围和意图相一致的实时文档。如下是典型的BDD库:
- Cucumber(主流语言都可使用)。
- Jasmine(特定于JavaScript)。
- SpecFlow(特定于.Net)。
2.测试数据管理
在软件测试自动化、以及测试的创建过程中,我们面临的最大挑战是如何利用好测试数据的管理系统。因此,随着自动化测试数量的增加,我们需要能够为特定测试的开展,提供可用的测试数据。而且,我们的自动化框架需要提供必要的措施,来输入、创建、以及最终按需清除测试数据。通常的做法是:采用一套合适的仿真工具,以使数据更加简化、清晰且易于处置。
3.模拟、存根(Stub)和虚拟化
在研究自动化测试的方案时,您可能会遇到如下情况:
- 需要将模块与在单元测试中连接的组件隔离开来。
- 需要处理应用程序集成、或端到端测试中常见的繁琐依赖项关系。
无论上述哪种情况,在开发自动化测试框架的过程中,您都需要创建模拟已连接的组件行为模式、存根(请参见:https://www.infoq.com/articles/stubbing-mocking-service-virtualization-differences),以及选择实用的虚拟化工具。
实施模型的通用机制
除了上面讨论的自动化框架组件之外,还有一些实用的机制可以帮助我们创建,使用和维护各种自动化的测试,其中包括:
- 包装器方法:在使用Selenium WebDriver组件时,我们可以通过创建自定义包装器来处理各种错误。因此,在创建了可用于Selenium API调用的自定义包装器后,您将能够更好地处理各种超时、异常、以及故障报告,从而更加关注于自动化测试的本身。
- 抽象方法:抽象机制代表了提高可读性,淡化了多余的实现细节。例如:在创建Selenium WebDriver测试时,我们可以使用页面对象(Page Objects)在页面上发现用户输入的凭据或单击某处等操作。同时,我们通过跳过页面上某个特定元素之类的方法,来达到高级测试的目标。而且,此类方法适用于许多相似的应用程序和自动化测试场景。
测试结果报告
在为“如何将测试结果报告到自动化框架中”,这一问题选择相应的库或机制时,您应该着眼于阅读与查看此类报告的目标受众。在此,您需要注意如下方面:
- 那些Junit和TestNG之类的单元测试框架所生成的报告,主要针对的是诸如CI(持续集成)服务器之类的接收系统。这些系统最终会对结果进行解释,并以其他软件可使用的XML格式进行呈现。
- 如果您需要产生可读性较强的报告,那么可以考虑诸如Junit的UFT Pro、NUnit、以及TestNG类,与单元测试框架相兼容的商业工具。
- 当然,您也可以利用诸如ExtentReports之类的第三方库,输出包括饼图、图表、图像之类带有直观说明的报告格式。
CI平台
为了以更快、更一致的方式进行应用程序的测试,持续集成(CI)平台可以帮助您定期构建软件,并为新的版本运行各项测试。当开发和部署新的功能,以及更新现有功能的时候,CI方法可以让开发人员和利益相关者有机会就应用程序的质量,获得定期的反馈和更快的响应。目前,TeamCity、CircleCI、Jenkins、Atlassian Bamboo等都属于高品质的CI平台。
源代码管理
与手动测试相似,自动化测试也涉及到编写和存储源代码的版本。各个开发公司都会运用一套源代码和版本控制系统,来保存与保护自己的源代码。目前,以Git、Mercurial、Subversion和TFS为代表的源代码管理系统,不但能够便捷地管理系统在生产环境中的代码,而且能够进一步完善自动化测试。
创建依赖项管理器
依赖项管理器的主要目的是:协助收集和管理在自动化软件方案的功能中,所使用的现有依赖性和库的过程。其中Maven和Gradle之类的工具,能够起到依赖项管理,协助从源代码和支持库中开发自动化软件,以及运行测试等作用。此外,业界其他常见的依赖项管理工具还有:Ant、npm和NuGet。
建立和实施框架的过程
我们通常可以通过如下方法,来计划与实现自动化测试的方案。
- 从客户的角度来探究自动化的实际适用性,也就是说:从产品的界面和外观上建立测试,以发现使用上的不足。
- 密切关注被测系统所用到的技术,通过模拟用户的真实行为,来采用合适的测试自动化工具。
- 建议采用基于阶段的实现方法。其中,每个阶段都具有交付自动化测试脚本的优先级。同时,我们也可以通过添加各种框架功能,让各种脚本能够按期执行。
- 在启动软件测试自动化之前,我们需要事先计算和估计实施后的投资回报率(ROI),概念证明(concept proof),运行手动回归或冒烟测试的时间,以及每个版本的发布周期。
如果我们能够认真地规划和执行上述测试自动化框架的过程,那么整个软件的开发和测试环境会得到如下方面的收益:
- 最少的时间与最大的收益:通过构建某种可行的测试自动化框架和脚本,我们将能够最大程度地减少在编写与运行测试用例上所花费的时间,进而在更短的时间内获得更大的输出。可以说,有了出色的自动化框架,我们可以解决诸如:同步问题、错误管理、本地配置、报告生成与解释等方面的难点。
- 可重用和可读性的自动化代码:各种既有的组件库代码不但能够在一段时间内保持可读性和可重用性,并且能够让诸如:报告、同步和故障排除等相关任务变得更加易于访问和实现。
- 资源优化:自动化系统的灵活性,很大程度上决定了自动化测试的效率,各个组件团队的协同能力,以及企业是否能够在资源优化和知识共享方面受益。
总结
在如今快节奏的软件开发生态系统中,自动化的测试和脚本在软件测试周期的效率和覆盖面上都起着不可或缺的作用。当然,这些都离不开精心设计的框架和基础性的组件策略。我们可以从最小处入手,通过反复测试和改进,来避免在测试自动化的后期阶段产生冲突或被迫妥协的状况。希望上述有关测试自动化框架的讨论,能够让软件测试人员在执行测试项目中有所受益。
原文The ABC of Test Automation Frameworks,作者:Mitul Makadia
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】