0
点赞
收藏
分享

微信扫一扫

Flutter UI自动化测试技术方案选型与探索,安卓内存优化管理器

进击的铁雾 2022-01-28 阅读 123

最早接触flutter自动化测试时,先尝试使用appium框架去驱动APP,当我们使用inspect功能去dump页面元素时发现很多元素会被合并成一个区域块,然后点击的时候只能通过xpath定位,想定位到某些具体的元素会比较困难,并且xpath其实是容易改变的,代码可维护性能力差。 因为上述原因,我们开始调研Flutter官方提供的测试工具——flutter driver。一开始使用该框架的时候发现它只能适用于纯Flutter应用,对于混合栈应用并不适应,但是它底层提供的元素定位能力或许对我们有用,于是我们对它的源码进行了剖析,该框架的原理图1如下所示。flutter

图1 flutter driver原理图 整个框架的流程交互比较简单,测试脚本在运行时,首先利用FlutterDriver.connect()来连接VMService获取相关的isolate,之后通过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混合栈应用的测试需求。最终的实现代码demo如下。

from flutter_driver.finder import FlutterFinder

from flutter_driver.flutter_driver import FlutterDriver

import uiautomator2 as u2

if 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()

我们尝试使用该套框架,发现其实flutter driver底层提供的能力相对比较薄弱,并不能完全满足
我们的需求,主要问题如下:

•不能批量操作元素,一旦finder定位到的元素超过1个时,就会抛出异常。•很多时候开发同学不写key,元素定位也没那么方便。•因为flutter没有inspect工具dump元素,所以只能利用结合源码去写脚本,代码维护成本比较高。•官方已经放弃维护该项目,所以后续估计也不会有新功能支持。

二、integration_test


前面提到,flutter官方放弃维护Flutter driver,并推出新的测试框架integration_test,那么这个框架会不会对混合栈应用予以支持呢,事实上试用了之后发现事情并没有我们想的那么美妙。在官方文档里有这么一句话“该软件包可在设备和模拟器上对Flutter代码进行自驱动测试”。 integration_test底层的元素操作和定位还是基于flutter_test去驱动的,其优势主要如下:

•测试脚本可以使用各种Flutter的API。•打包ipa、apk后就能在 Firebase Test Lab等设备群上运行测试,不需要额外驱动。•integration_test的每个页面之间测试无关联,可以实现单个页面级别的测试。

utter的API。•打包ipa、apk后就能在 Firebase Test Lab等设备群上运行测试,不需要额外驱动。•integration_test的每个页面之间测试无关联,可以实现单个页面级别的测试。

举报

相关推荐

0 条评论