性能自动化测试工具 ui自动化测试工具

技术联盟总论坛2021-06-03 13:08
小工匠休闲钓鱼技术
Flutter page无法直接使用Native测试工具定位元素,给自动化测试带来了很多不便 。虽然谷歌正式推出Flutter驱动和集成测试,但实际使用中存在以下问题:
不适用于混合堆栈应用程序 。虽然appium中有相关的驱动,但是环境不能切换 。
元素定位能力相对较弱 。
根据虚拟机服务,您需要构建一个配置文件或调试包 。
基于以上因素,我们选择在Native测试工具的基础上扩展Flutter页面的测试能力,而不是直接使用谷歌官方推出的工具 。分析了Flutter driver和Integration测试的原理和实现,并简要介绍了UI自动测试中闲鱼的试用方案 。
颤振驱动器当我第一次接触到flutter自动化测试时,我第一次尝试使用APPium框架来驱动app 。当我们使用inspect函数转储页面元素时,我们发现许多元素会被合并到一个区域块中,然后我们只能在单击时通过xpath来定位它们 。很难找到一些特定的元素,xpath实际上很容易更改,代码的可维护性也很差 。
基于以上原因,我们开始调查——flutter官方提供的测试工具——flutter driver 。起初,我们发现该框架只能应用于纯Flutter应用,但不适合混合堆栈应用 。但是它底层提供的元素定位能力可能对我们有用,所以我们分析了它的源代码,框架示意图一如下 。

性能自动化测试工具 ui自动化测试工具

文章插图
图1颤振驱动器示意图
整个框架的流程交互相对简单 。测试脚本运行时,首先使用FlutterDriver.connect()连接VMService获取相关隔离,然后通过websocket传输操作过程和数据采集 。其中,测试脚本端的所有操作都被序列化为json字符串,通过websocket传输到ioslate,转化为命令在APP端执行 。例如,我们想要获取一个组件的文本内容,最终生成的json结构如下:
{"jsonrpc":"2.0","id":5,"method":"ext.flutter.driver","params":{"finderType":"ByValueKey","keyValueString":"counter","keyValueType":"String","command":"get_text","isolateId":"isolates/4374098363448227"}}
了解以上原理后,我们可以通过构造协议格式,以任何语言和测试框架驱动flutter测试,所以我们封装了这个协议,并使用Python驱动,这样就可以测试基于uiautomator2和facebook-wda的flutter页面,满足flutter混合栈应用的测试需求 。最终的实现代码演示如下 。
from flutter_driver.finder import FlutterFinderfrom flutter_driver.flutter_driver import FlutterDriverimport uiautomator2 as u2if __name__ == "__main__":d = u2.connect()driver = FlutterDriver(d)if pageFlutter is True:# 如果是flutter,则使用flutter driver进行驱动driver.connect("com.it592.flutter_app")finder = FlutterFinder.by_value_key("input")driver.tap(finder)time.sleep(1)print(driver.getText(FlutterFinder.by_value_key("counter")))else:d(text="increase").click()
我们尝试使用这个框架,发现颤振驱动器底层提供的能力比较弱,不能完全满足我们的需求 。主要问题如下:
不能批量操作元素 。一旦finder找到多个元素,它将抛出一个异常 。
很多时候开发学生不写重点,元素定位也没那么方便 。
由于flutter没有inspect tool dump元素,只能使用源代码的组合来编写脚本,代码维护成本相对较高 。
官方已经放弃维护项目,估计后续不会有新的功能支持 。
集成测试如前所述,flutter正式放弃了Flutter驱动的维护,推出了新的测试框架integration_test 。那么这个框架会支持混合栈的应用吗?其实经过试用,发现事情并没有我们想象的那么精彩 。官方文件中有一句话“这个软件包可以在设备和模拟器上自驱动测试Flutter代码” 。
integration_test底层元素的操作和定位由flutter_test驱动,其优势如下:
测试脚本可以使用各种Flutter APIs 。
ipa和apk打包后,测试可以在Firebase Test Lab和其他设备组上运行,无需额外的驱动程序 。
integration_test的每一页都没有相互关联,可以在单页级别进行测试 。
但是,由于底层元素的定位与Flutter driver一致,因此Flutter driver的问题仍然存在,并且还有其他限制:
测试脚本被打包到APP中,每次修改脚本都需要重新打包 。
端到端测试不够友好,需要额外的函数来等待数据加载 。
不适用于全链接级别的页面测试 。
弱可扩展性
基于以上问题,无法满足我们的使用需求,所以我们只是做了一个简单的前期研究,并没有深入的了解和应用 。
闲鱼UI自动测试方案在研究了Flutter正式推出的相关测试框架后,我们开始思考如何去进行闲鱼UI的自动化 。是在官方的肩膀上建造车轮,还是重用现有的原生自动化测试能力来扩展Flutter测试能力 。在考虑了测试脚本的输入成本和维护难度后,我们选择使用图像处理技术来扩展原生自动化框架对Flutter页面的测试能力支持 。整个测试方案架构如图2所示 。
性能自动化测试工具 ui自动化测试工具

文章插图
图2闲鱼UI自动测试方案框架
Flutter元素并不是uiautomator2和facebook-wda完全无法识别的,所以在编写测试脚本时只需要处理无法识别的元素 。对于名称、标签、xpath不易改变的元素的定位,我们优先考虑原生定位能力,其他元素则通过图像处理技术直接定位 。
在处理原生能力无法定位的元素时,我们优先考虑ocr文本匹配,准确率高,不易受分辨率影响 。对于纯图片,我们可以通过图像搜索来定位 。对于一些常见的元素控件,如商品卡、价格、图标、头像等 。,我们构建一个训练集,并使用图像分类来判断元素的类型,从而实现对常见控件的定位 。
UI自动化面临的最大问题是,随着版本的迭代,测试脚本也需要不断迭代 。因此,在方案选择和脚本编写过程中,要考虑脚本的健壮性和可维护性 。在实际的脚本开发中,我们将页面元素封装成单独的类,从测试逻辑中分离出来,保证在元素的后期迭代中只需要修改对应的页面元素,降低维护成本 。
性能自动化测试工具 ui自动化测试工具

文章插图
图3脚本层次结构
该方案已经在闲鱼性能自动测试的相关UI操作中使用,编写脚本时不需要区分当前页面的类型 。我们的脚本已经稳定运行了500多次,成功率超过98% 。
摘要
性能自动化测试工具 ui自动化测试工具

文章插图
图4方案对比
从图4可以看出,无论是flutter driver还是integration test对混合堆栈的支持都不够成熟,但flutter driver可以做一些扩展 。对于纯Flutter应用,该方案基本能满足测试要求,而集成测试相对不成熟 。对于混合堆栈应用的测试,可能需要考虑混合堆栈的场景切换成本 。使用一些ocr技术进行一些扩展可能成本更低,收益更多 。
表示感谢/感激
感谢SLM和TMQ提供的大量底层能力支持,我们可以专心做生意 。
flutter驱动程序(https://flutter . dev/docs/cook book/testing/integration/introduction)
integration _ test(https://flutter . dev/docs/testing/integration-tests)
【性能自动化测试工具 ui自动化测试工具】收集0条评论

    推荐阅读