动态化容器中的测试效率提升方案
动态化容器技术为开发效率带来了巨大的提升,但对于多端验证的测试流程而言,其效率仍然面临巨大挑战。特别是针对美团App这样的多页面、多样式、高度个性化的应用场景,不同的页面布局和样式需求使得测试工作变得尤为复杂。本文将围绕动态布局技术,探讨如何通过可测性改造来提升测试效率。
挑战与背景
对于美团App而言,页面的呈现方式因用户而异,实现了所谓的“千面”。以首页的“猜你喜欢”模块为例,针对不同用户,可能采用单列、Tab、双列等多种不同形式。在一天内完成开发、测试、上线流程的巨大压力下,研发团队亟需一种高效的自动化测试方案。
页面元素定位难题
当前,美团App客户端自动化主要依赖Appium框架进行页面元素的定位和操作。在动态化容器中,由于大量使用Drawable对象来绘制页面信息,导致元素无法被现有UI自动化方案定位和解析。这严重影响了自动化的实施工作,使得测试工程师无法有效地进行页面的操作和断言。
解决方案探索
针对上述问题,我们首先从Appium的元素定位原理入手,研究UI自动化元素定位的原理。通过阅读Appium源码,我们了解到元素的信息存储在AccessibilityNodeInfo对象中。Drawable对象无法获取元素信息,因此我们需要探究AccessibilityNodeInfo和Drawable之间的关系。
我们发现View实现了AccessibilityEventSource接口并提供了onInitializeAccessibilityNodeInfo方法来填充信息。而Drawable没有实现对应的方法,所以无法被自动化测试找到。为此,我们考虑了三种解决方案:改造Appium定位方式、使用View替代Drawable、使用图像识别进行定位。经过分析,我们发现这三种方案都有其局限性,需要在影响范围和性能之间寻找平衡。
XraySDK的应用与实施
在深入研究动态布局的实现方案后,我们提出了内嵌SDK(XraySDK)的方案。XraySDK负责在App内部进行页面信息的获取,并向自动化提供一个客户端(XrayClient)来完成这部分功能。通过在动态布局的视图呈现过程中拦截布局信息,我们能够获取到视图信息并存储在ViewInfoObserver对象中。
为了将视图信息传递给自动化测试脚本,我们借鉴了Appium的设计,在美团App中启动一个Service组件和HttpServer来完成信息的输出。通过命令行方式启动和停止可测性功能,并对外通信的接口。这样,自动化测试就可以通过设置自定义的器来完成视图信息的获取和存储。
实施后,我们不仅获取了常规的位置、内容、类型等信息,还通过检查时间器的方式进一步判断视图元素是否可以进行交互,从而增强了页面视图结构的有效信息。基于视图可测性的提升,美团动态化卡片的自动化测试覆盖度有了大幅的提升。
拓展应用与未来探索
页面视图信息作为客户端测试的基础,其可测性改造对于技术团队有着非常重要的意义。除了动态化容器,我们还可以将类似的思想应用到WebView元素定位的问题上。通过运行在App内部的SDK,我们可以获取到WebView实例并遍历其节点,从而得到所有的视图信息。
未来,我们还将继续探索更多的视图可测性改造方向,如增强对于复杂布局和交互逻辑的测试覆盖度、提升测试框架的稳定性和性能等。我们也将关注新技术和新方法的应用,如深度学习在视觉元素识别中的应用、自然语言处理在测试用例生成中的作用等。
收益与效益
基于视图可测性的提升,美团动态化卡片的自动化测试效率得到了明显的提升。这不仅节省了大量的人力成本和时间成本,也提高了产品质量和用户体验。我们相信,随着可测性改造的深入进行,技术团队将获得更大的收益和效益。
图:相关示意图及收益对比图(略)