真正的测试自动化框架全接触

真正的测试自动化框架全接触
文章图片
【51CTO.com快译】现如今 , 无论是软件测试人员 , 还是利益相关者 , 都已经认识到:实现测试自动化框架对于软件项目的成功是至关重要的 。 它不但能够提高测试的效率 , 而且可以减少人工干预的工作量 。
在本文中 , 我们将深入探讨什么是真正的测试自动化框架 , 自动化脚本是如何工作的 , 以及此类框架是如何在测试过程中给团队提供竞争优势的 。
定义测试自动化
【真正的测试自动化框架全接触】在任何行业中 , 自动化通常被解释为通过智能算法 , 来自动处理各种流程 , 而且几乎不需要人工的干预 。 在软件行业中 , 测试自动化意味着:使用受许可版本或开源版本的自动化工具 , 对软件应用程序执行各项测试 。 从技术角度来说 , 测试自动化框架是一组定制的交互式组件 , 它可以协助执行脚本化的测试 , 并全面地报告测试结果 。
为了成功地构建自动化框架 , 软件质量保证专家必须通过全面考虑与设计 , 来控制和监视整个测试过程 , 并提高结果的准确性 。 与此同时 , 那些经过精心设计的自动化框架也能够让测试人员以实用、简化的方式 , 来执行各项自动化的测试 。
通常 , 根据自动化需求目标的不同 , 我们可以选择并创建如下不同的框架:
以工具为中心的框架
无论是商业版工具还是开源的自动化工具 , 它们都拥有自己的系统框架 , 可以在各种测试环境中提供测试套件 , 实施分布式测试 , 并最终生成报告 。 最典型的示例当属Selenium自动化框架 。 该框架的主要组件是WebDriver 。 作为基于Web的浏览器插件 , 该组件可被用于控制和操作Web浏览器中应用程序的DOM模型 。 此外 , Selenium自动化框架还带有各种实用的编码库 , 以及支持记录回放的工具 。
Serenity是另一个自动化工具的框架 。 它围绕着SeleniumWeb驱动构建了一个加速器 。 为加快测试自动化实施过程的速度 , Serenity还能够将特定的组件与社区内的其他工具相组合 。
除了上述两种工具 , 业界还有TestComplete、以及RanorexHPQTP等工具 。 作为已部署的预构建框架 , 它们都带有用户行为模拟器、报告和脚本IDE等功能 。
面向项目的框架
定制此类框架主要是用于实现特定应用项目的自动化 。 特定项目的框架既可以支持某些目标应用的测试自动化需求 , 又能够被开源库构建的组件所驱动 。 此类框架围绕着被测系统(SystemUnderTest , 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) 。
KarateDSL(特定于Java的API级集成测试 , 请参见:https://github.com/intuit/karate)
c)行为驱动开发(Behavior-DrivenDevelopment , BDD)
专门针对BDD的测试库往往以行为规范为目标 , 以可执行代码的形式创建各种可执行的规范 。 尽管它们不能像测试工具那样直接与被测应用进行交互 , 但是我们可以将不同的功能和预期的行为场景转换为代码 。 通过对BDD流程的支持 , 我们可以创建与自动测试范围和意图相一致的实时文档 。 如下是典型的BDD库:
Cucumber(主流语言都可使用) 。
Jasmine(特定于JavaScript) 。
SpecFlow(特定于.Net) 。
2.测试数据管理
在软件测试自动化、以及测试的创建过程中 , 我们面临的最大挑战是如何利用好测试数据的管理系统 。 因此 , 随着自动化测试数量的增加 , 我们需要能够为特定测试的开展 , 提供可用的测试数据 。 而且 , 我们的自动化框架需要提供必要的措施 , 来输入、创建、以及最终按需清除测试数据 。 通常的做法是:采用一套合适的仿真工具 , 以使数据更加简化、清晰且易于处置 。
3.模拟、存根(Stub)和虚拟化
在研究自动化测试的方案时 , 您可能会遇到如下情况:
需要将模块与在单元测试中连接的组件隔离开来 。
需要处理应用程序集成、或端到端测试中常见的繁琐依赖项关系 。
无论上述哪种情况 , 在开发自动化测试框架的过程中 , 您都需要创建模拟已连接的组件行为模式、存根(请参见:https://www.infoq.com/articles/stubbing-mocking-service-virtualization-differences) , 以及选择实用的虚拟化工具 。
实施模型的通用机制
除了上面讨论的自动化框架组件之外 , 还有一些实用的机制可以帮助我们创建 , 使用和维护各种自动化的测试 , 其中包括:
包装器方法:在使用SeleniumWebDriver组件时 , 我们可以通过创建自定义包装器来处理各种错误 。 因此 , 在创建了可用于SeleniumAPI调用的自定义包装器后 , 您将能够更好地处理各种超时、异常、以及故障报告 , 从而更加关注于自动化测试的本身 。
抽象方法:抽象机制代表了提高可读性 , 淡化了多余的实现细节 。 例如:在创建SeleniumWebDriver测试时 , 我们可以使用页面对象(PageObjects)在页面上发现用户输入的凭据或单击某处等操作 。 同时 , 我们通过跳过页面上某个特定元素之类的方法 , 来达到高级测试的目标 。 而且 , 此类方法适用于许多相似的应用程序和自动化测试场景 。
测试结果报告
在为“如何将测试结果报告到自动化框架中” , 这一问题选择相应的库或机制时 , 您应该着眼于阅读与查看此类报告的目标受众 。 在此 , 您需要注意如下方面:
那些Junit和TestNG之类的单元测试框架所生成的报告 , 主要针对的是诸如CI(持续集成)服务器之类的接收系统 。 这些系统最终会对结果进行解释 , 并以其他软件可使用的XML格式进行呈现 。
如果您需要产生可读性较强的报告 , 那么可以考虑诸如Junit的UFTPro、NUnit、以及TestNG类 , 与单元测试框架相兼容的商业工具 。
当然 , 您也可以利用诸如ExtentReports之类的第三方库 , 输出包括饼图、图表、图像之类带有直观说明的报告格式 。
CI平台
为了以更快、更一致的方式进行应用程序的测试 , 持续集成(CI)平台可以帮助您定期构建软件 , 并为新的版本运行各项测试 。 当开发和部署新的功能 , 以及更新现有功能的时候 , CI方法可以让开发人员和利益相关者有机会就应用程序的质量 , 获得定期的反馈和更快的响应 。 目前 , TeamCity、CircleCI、Jenkins、AtlassianBamboo等都属于高品质的CI平台 。
源代码管理
与手动测试相似 , 自动化测试也涉及到编写和存储源代码的版本 。 各个开发公司都会运用一套源代码和版本控制系统 , 来保存与保护自己的源代码 。 目前 , 以Git、Mercurial、Subversion和TFS为代表的源代码管理系统 , 不但能够便捷地管理系统在生产环境中的代码 , 而且能够进一步完善自动化测试 。
创建依赖项管理器


    推荐阅读