1.2 前端自动化测试框架概述
前端开发技术从简单的静态页面发展到了现在的应用程序阶段,经历了如此巨变,但是前端自动化测试呢?
1.2.1 应运而生的前端测试框架
自从2004年Selenium诞生之日起,Selenium就展现出极强的生命力,随着WebDriver的横空出世,Selenium/WebDriver逐渐成为前端自动化测试的不二之选,但此后Selenium/WebDriver的演进速度却越来越跟不上前端技术的发展,特别是前端页面开发演化成了前端应用程序开发后,前端实际上具备了后端(服务器端)的一切能力(Node.js作为前端Server,也可以提供接口接收客户端的请求并处理),但是Selenium/WebDriver本身却仍只能单纯地用在UI测试层面(除非加入第三方库)。
前端具备了后端的雏形,能够保存、处理后端传递过来的数据。但前端测试框架并没有与时俱进,于是我们常常遇见这样的问题:一个接口测试请求失败了,我们不知道是前端的问题还是后端的问题,测试人员需要花费大量时间排查,然后告知相应的前端或者后端开发者,客观上增加了测试人员的工作量。
这就给我们的测试工作带来了较大的挑战,众所周知,互联网的竞争已进入下半场。在互联网红利消失后,如何提高组织效率增强自身竞争力将是各大互联网公司的首要目标。特别是由于国内互联网“以业务为先”的特点,超额的工作任务,越压缩越短的工作周期将长期存在,在这样的大环境下,各个互联网公司必然对能够提升效率的工具趋之若鹜。特别是随着国内BAT等巨头的“大中台,小前台”战略的实施和对外宣传,客观上也需要一个容易上手、功能完备、满足当前技术发展的一个前端测试框架。
随着上述问题越来越多,Selenium/WebDriver越来越不能满足整个测试行业对于前端自动化框架的需求。于是有追求的优秀企业及个人,依托于现代Web技术的发展,开始寻找或者创建更能适应当前前端开发趋势的前端测试框架。
越来越多的前端测试框架如雨后春笋般涌现,我们迎来了一批优秀的前端测试框架或工具。
例如Karma,Nightwatch,Protractor,TestCafe,Cypress和Puppeteer。在这些测试工具中,有的仍然依托于Selenium/WebDriver的底层协议,有的则完全自成体系,它们或极大地扩展了原有Selenium/WebDriver的功能,或填补了Selenium/ WebDriver由于架构设计而无法弥补的空白。无论是哪种情况,Selenium/WebDriver的前端自动化测试的统治地位受到挑战已经是不争的事实,前端测试框架由此进入“群雄割据”的时代。
其中的佼佼者如Cypress,它的底层实现完全不依托于Selenium/WebDriver的WebDriver Protocol,使得Cypress的运行速度比Selenium/WebDriver快。另外,由于Cypress和被测试应用程序运行在同一个浏览器界面,使得Cypress可以测试测试金字塔的任意一层(是的,你没有看错,包括UI集成测试,API接口测试和单元测试)。这些特性加上Cypress是一个不需要任何第三方扩展,就具备一个优秀的测试框架的全部特性的事实,使得Cypress在一众前端测试框架中脱颖而出。
1.2.2 前端自动化测试框架组成
测试人员在工作中常常要与测试框架打交道,但什么是测试框架呢?不同的人对此有不同的见解。
在我看来,测试框架是由一个或多个自动化测试基础模块、自动化测试管理模块、自动化测试统计模块等组成的工具集合。这些模块集合组合到一块,应具备以下特性:
• 测试框架与被测应用程序独立,即一套框架可以服务多种程序的自动化。
• 测试框架应被高度模块化,易于扩展、维护;各个模块之间应解耦。
• 测试脚本所使用的测试语言应该是与框架独立的。不同的测试框架可能在不同的应用领域有不同的表现,有些适用于Web应用程序的测试,有些可能适用于移动端的测试。那么当需要从一个测试框架迁移到另一个测试框架时,好的测试框架应该保证所有的测试脚本只需少量更改甚至完全不需要更改。
• 测试框架应该简单易用。
一个优秀的前端自动化测试框架,应该有以下组成部分:
• 底层核心驱动库
核心驱动库,一般指用于操作被测试应用程序的第三方库,在Web端,比较著名的有Selenium/WebDriver,以及本书着重介绍的Cypress。
• 可重用的组件
可重用的组件一般用来降低开发成本,常见的有时间处理模块、登录模块等。
• 对象库
对象库就是存储被测试对象的仓库。在实际应用中,常常将页面进行分组,把一个页面上的所有对象放到一个类里,也就是Page Object模式。
• 配置文件
配置文件包括两个部分,一个是测试环境的配置,另一个是应用程序的配置。
一个功能从开发代码完成到上线,往往要经过几个测试环境的测试,测试环境的配置能够减少环境切换成本。
而应用程序的配置主要包括被测试程序的一些配置。利用配置文件,可以做到在不更改代码的情况下覆盖相同程序的不同程序配置。
• 工具
从代码组织上来说,工具是能完成特定功能的独立程序或代码片段。例如,有根据用户ID查询所有历史订单的工具,也有给出页面文本,在下拉框里选择特定选项的工具。
• 方便易用的测试数据
数据在测试中的重要性不言而喻。测试数据的构造,甚至是专门的课题。
数据创建一般分为实时创建和事先创建。实时创建是在测试代码运行时才生成的测试数据;而事先创建是指测试代码运行前就准备好数据文件。
无论哪种方式,数据创建的具体实现不外乎以下三种方式:
➢ 人工构造数据。
➢ 通过调用前端GUI或者后端API构造数据。
➢ 直接向DB里插入所需数据。
测试框架需要灵活地支持多种数据创建方式。
• 测试用例的组织和运行
测试用例在测试框架中的体现是测试脚本,测试脚本应该做到业务操作粒度合适,断言明确充分,前后脚本解耦。
测试框架应该支持:
➢ 测试用例顺序或者并发执行。
➢ 测试用例分组运行。
➢ 动态挑选测试用例执行。
➢ 根据测试数据自动生成测试用例。
• 错误恢复机制
由于测试环境、测试程序、测试代码存在各种不确定因素,测试框架应该具备一定的错误恢复机制。
在测试用例执行中,引起错误的类型一般分为代码/运行导致的错误和环境/依赖导致的错误。测试框架应该能够识别这两种错误并且给出不同的处理。
出现错误后,错误处理措施一般分为停止运行和错误恢复这两种,错误恢复的步骤通常是标记当前用例为“失败”,清理失败数据,恢复测试环境,然后运行下一条测试。错误恢复的时机可以为事先恢复(在当前用例运行前,把环境和数据等恢复为初始状态)和事后恢复(当前用例执行完成后把环境和数据恢复为初始状态)两种。
• 全面的测试报告
测试框架必然包括测试报告。测试报告应该全面,包括测试用例条数统计、测试用例成功/失败百分比、测试用例总执行时间等总体信息。
对于单条测试用例,还应该包括测试用例ID,测试用例运行结果、测试用例运行时间、测试用例所属模块、测试失败时刻系统截图、测试的日志等信息。
根据使用的目的不同,测试报告还应包括不同格式,例如用于展示的HTML格式,用于跟CI集成的XML格式等。
• 友好的持续集成支持
测试框架应该能够和CI系统低成本集成,包括通过CI参数指定运行环境、生成测试报告等。
• 完善的日志文件
测试框架应该包括完善的日志文件,方便出错时排查和定位。
1.2.3 前端自动化测试框架设计原则
设计测试框架时应遵循如下原则:
• 代码和数据分离
• 剥离可共用的库
• 可移植性,可维护性
• 高扩展性,高稳定性
• 版本控制