UI 自动化测试体系的建设价值遵循测试金字塔模型,该模型建议测试人员在不同层次上编写和执行测试。UI 测试需要编写和设计测试脚本、执行完整的应用程序,并模拟用户与应用程序交互,因此 UI 测试的测试速度相对较慢。但是 UI 测试的业务覆盖很高,通过模拟真实场景下的用户行为,详细测量 UI 组件的功能性和稳定性,可以有效消除人工测试所面临的大量重复性测试问题。
2022 年 4 月,MeterSphere 开源项目组所进行的 UI 自动化测试社区调研显示,在 219 份受访表单中,有 82.19% 的受访者表示所在的团队正在建设 Web 端 UI 自动化测试系统。
▲图 1 测试金字塔模型
■ 测试金字塔的底层是单元测试。单元测试是对代码中小段逻辑的测试,这些小段逻辑可以是函数、类或类中的方法。通过编写单元测试,开发人员可以直接调用被测试的代码,以评估其输出是否符合预期,无需依赖其他组件、服务或 UI。
■ 测试金字塔的中间层是接口测试或者集成测试。接口测试主要测试应用程序接口(API),关注不同模块之间的接口是否有效、传递的信息是否正确、是否符合接口标准等;集成测试的主要目标是测试整个系统是否可以协同工作。
■ 测试金字塔的顶层是 UI 测试。UI 测试从最直观的角度进行测试,除了人工去执行,也可以完全依靠自动化。UI 测试能够模拟每个用户与应用交互的动作,例如点击按钮、输入信息、填写表单等,通过运行应用程序来查看是否符合预期效果。
由此可见,这三种测试类型涉及的范畴不同。单元测试主要用于在最基本的层面上发现逻辑错误。单元测试的速度比较快,运行时所需要的资源也比较少;接口测试或者集成测试,主要验证应用程序的服务和数据库之间的接口是否能够良好地协同工作,关注的是不同组件之间的交互;UI 测试关注能否启动完整的应用程序。UI 测试属于最全面的测试类型,因此在运行时往往会耗费最多的计算资源和时间。
一、UI 自动化测试的必要性
UI 自动化测试在软件测试领域中变得越来越重要,它的必要性体现在提高测试效率、降低成本、保证测试的准确性和一致性等方面,对于提高软件质量和开发效率具有重要作用。
传统的手工测试需要测试工程师花费大量时间执行重复的操作,不仅效率低下,还容易出错。通过使用 UI 自动化工具,测试工程师可以将重复的测试任务交由程序来完成,从而节省时间和精力,将更多的时间用在设计全面的测试用例和新功能的测试方面;
回归测试是在软件代码发生变化后执行的测试,以确保修改不会对现有功能产生负面影响。由于回归测试需要频繁地执行,手动执行回归测试会浪费大量的时间和人力资源。而 UI 自动化可以高效地执行回归测试,大幅降低人力成本,同时保证测试的准确性和全面性;
在传统的手工测试中,测试工程师只能在工作时间内执行测试任务。而通过使用 UI 自动化测试工具,测试工程师可以在非工作时间安排测试任务的执行,从而更好地利用时间资源,将更多的工作时间用于分析失败用例和解决问题,提高测试质量;
在手工测试中,由于人为因素的存在,很容易出现操作步骤的遗漏或疏忽,导致测试结果的不准确。而通过使用 UI 自动化测试工具,可以确保每次测试执行的步骤和验证达到一致性和可重复性,避免了人为错误的发生。
二、UI 自动化测试介入的时机
经常有人会问,什么样的项目才适合进行 UI 自动化测试呢?UI 自动化测试相当于模拟手工测试,通过程序去操作页面上的控件。而在实际测试过程中,经常会遇到无法找到控件,或者因控件定义变更而带来的维护成本等问题。我们总结了一些适合 UI 自动化测试介入的时间节点或者场景:
产品比较稳定,不会有频繁的需求变更;
需要频繁做回归验证的核心业务、核心界面;
选择稳定的业务流程,不建议选择处于探索期需要经常变更的业务模块;
适合维护周期长的项目,不适合短期项目;
如果使用编写代码实现的自动化测试工具,需要测试团队中大部分人员具备脚本开发能力。
三、UI 自动化测试面临的两大核心问题
在 UI 自动化测试中,测试团队普遍面临着两大核心问题,即 UI 自动化的维护成本和学习成本。
■ 维护成本
UI 自动化测试依赖于界面元素的定位和操作,对于界面变动敏感,一旦界面设计发生变化,测试脚本可能会失效。因此需要及时更新测试脚本,从而增加了 UI 自动化测试的维护成本;
■ 学习成本
UI 自动化测试需要使用特定的测试框架和工具,很多工具的学习曲线比较陡峭,需要掌握相应的编程语言和工具的使用方法,以及测试设计技巧,增加了测试人员的学习成本。
四、如何提高 UI 自动化测试效率?
UI 自动化测试需要模拟人工操作界面,这就意味着它需要花费相对较长的时间来完成任务。尤其是当测试用例数量庞大时,UI 自动化测试的执行时间会更长。这是因为 UI 自动化测试的原理决定了它无法像接口自动化那样快速执行。提高 UI 自动化测试效率的主要路径包括:
针对核心业务和稳定业务的用例,可以先定义明确的优先级,确保这些用例首先被执行。对于未覆盖的用例,可以根据业务重要性和风险优先级进行选择,逐步扩大测试范围;
将重复的测试步骤抽象出来,利用变量和循环结构来实现,避免为每个不同的测试数据编写独立的测试流程。使用测试流程控制功能,通过条件判断来控制执行分支,避免执行不必要的流程,减少测试过程中的冗余操作;
使用断言的方式要尽量简洁高效,在前期设计用例时考虑断言的必要性,减少不必要的断言设置,降低与应用程序的通信频率,从而提高执行的速度;
仅在必要的步骤进行截图,避免重复截取相同内容。减少截取大尺寸的图片文件,降低资源占用;
分析测试环境的特性,根据稳定性和响应速度设置等待时间。使用智能等待机制,等待 UI 元素加载完成后再进行操作,避免出现过长的等待时间;
分析测试用例的依赖关系,将互相独立的用例放在不同线程中同时执行。有效利用系统资源,通过并行执行来提高整体速度;
增加服务器的处理能力和内存容量,确保有足够的可用资源供 UI 自动化测试使用。使用负载均衡技术,将请求分发到多个服务器,提高整体执行速度和性能。
五、MeterSphere 自然语言 UI 自动化测试
MeterSphere 开源持续测试平台涵盖测试跟踪、接口测试、性能测试和 UI 测试等功能模块。MeterSphere 的 UI 测试模块基于 Selenium 浏览器自动化方案构建,内嵌高度可复用的测试脚本,测试团队无需复杂的代码编写即可开展低代码的自动化测试。
① 低维护成本
无论任何一款测试工具,都无法做到维护成本为零。无论产品是 ToB 或者 ToC 的,都是要与客户进行交互的。因此产品的发版、界面的更新、特定节日的运营活动等,都会让产品发生变动。因此,一定的维护成本不可避免,但可以通过选择恰当的测试工具、培养良好的测试习惯等方式,有效降低 UI 自动化测试的维护成本。
MeterSphere 开源持续测试平台的 UI 测试模块支持元素、指令、场景的自由组合以及自由引用。元素是最基础的组成部分,指令代表一些通用测试步骤的集合,场景通常是一个完整的业务流程。在 MeterSphere 平台上,元素可以引用在指令和场景中,同时指令和场景之间也可以相互引用。当产品界面发生变化后,界面元素也会随之发生改变,此时通过对元素进行更新,引用该元素的指令和场景都将自动更新元素信息,这样就可以减少过多的维护成本,工作量主要聚焦在对元素的维护即可。同样的,当业务流程发生变化,在已有的指令或场景上进行增删改编辑后,所有引用关系也会同步更新,通过灵活的引用设计,大幅度降低了后续测试的维护成本。
图 2 是基于 MeterSphere 页面对象模式编写的 “抢购” UI 自动化场景测试模型:
▲图 2 基于 MeterSphere 的 “抢购” UI 自动化场景测试模型
② 低学习成本
市面上有很多自动化测试框架,包括基于浏览器界面相关的、移动端应用相关的、桌面应用程序相关的框架等。当我们在选择时首先应该选择大众化的自动化测试框架,这样的框架经过了丰富的项目检验;其次应该选择由主流开发语言编写的测试框架,例如 Java 或 Python,其框架不仅通用性强,在后续使用中遇到问题也更容易找到相关解决方案。
MeterSphere 开源持续测试平台的 UI 测试模块全面兼容 Selenium 开源框架。UI 测试脚本使用自然语言编排实现,将操作指令以可视化控件的形态进行封装,测试人员通过界面化的点选、拖拽等操作即可完成测试脚本,不必进行代码编写。
■ 传统编写代码实现
▲图 3 传统编写代码实现
■ MeterSphere 自然语言编排实现
▲图 4 MeterSphere 自然语言编排实现
自然语言编写的 UI 自动化测试相比传统编写代码实现的 UI 自动化测试,其优势体现在:
■ 更高的效率
自然语言 UI 自动化可以快速地创建测试用例,减少了手写代码的时间和出错率,提高了测试效率;
■ 更低的门槛
对于不熟悉编程语言的测试人员来说,使用自然语言的编写方式更容易上手,降低了学习和使用的门槛;
■ 更直观的操作
通过界面化的编排,测试人员可以更直观地了解测试用例中的操作流程,更容易发现和纠正错误;
■ 更易于维护
可视化的界面编排设计可以帮助测试人员轻松维护和更新测试用例。通过修改公用的测试元素来同步更新测试用例,快速响应应用程序和需求的变化。
相比之下,使用代码实现的方式需要测试人员掌握编程语言和框架的知识,编写代码时需要仔细考虑每个细节,相对容易出错。同时,代码实现的方式对于代码的维护和修改也相对困难一些,需要更深入地了解代码的逻辑和结构。因此在 UI 自动化测试方面,使用自然语言编排是更为高效和直观的方式。