范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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

  技术联盟总坛2021-06-03 13:08小匠 闲鱼技术
  Flutter页面无法直接使用Native测试工具定位元素,给自动化测试带来很多不便。虽然Google官方推出了Flutter driver 和 Integration test,但是在实际使用中存在以下问题:
  不适用于混合栈APP,虽然appium中有相关的driver,但是无法切换环境。
  元素定位能力相对薄弱。
  依赖于VMService,需要构建Profile或Debug包。
  基于以上因素,我们并没有直接使用Google官方推出的工具,而是选择基于Native测试工具去扩展Flutter页面的测试能力。本文对Flutter driver 和Integration test的原理和实现进行了分析,同时简单介绍闲鱼在UI自动化测试的尝试方案。Flutter driver
  最早接触flutter自动化测试时,先尝试使用appium框架去驱动APP,当我们使用inspect功能去dump页面元素时发现很多元素会被合并成一个区域块,然后点击的时候只能通过xpath定位,想定位到某些具体的元素会比较困难,并且xpath其实是容易改变的,代码可维护性能力差。
  因为上述原因,我们开始调研Flutter官方提供的测试工具——flutter driver。一开始使用该框架的时候发现它只能适用于纯Flutter应用,对于混合栈应用并不适应,但是它底层提供的元素定位能力或许对我们有用,于是我们对它的源码进行了剖析,该框架的原理图1如下所示。
  图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如下。fromflutter_driver.finderimportFlutterFinderfromflutter_driver.flutter_driverimportFlutterDriverimportuiautomator2asu2if__name__=="__main__":  d=u2.connect()  driver=FlutterDriver(d)ifpageFlutterisTrue:#如果是flutter,则使用flutterdriver进行驱动  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的每个页面之间测试无关联,可以实现单个页面级别的测试。
  但是由于底层元素定位和Flutter driver的是一致的,所以Flutter driver存在的问题依旧存在,同时还存在其他局限问题:
  测试脚本打包到APP中,每次修改脚本都需要重新打包。
  对端到端测试不够友好,需要额外函数来等待数据加载完毕。
  不适合全链路级别的页面测试。
  可扩展性弱
  基于以上问题,不满足我们的使用需求,所以我们只是做了简单预研,并没有深入了解和应用。闲鱼UI自动化测试方案
  学习Flutter官方推出的相关测试框架之后,我们开始思考闲鱼UI自动化到底要怎么走?是站在官方的肩膀上去造轮子还是复用现有的原生自动化测试能力去扩展Flutter测试能力。在综合考虑投入成本以及测试脚本的维护难度后,我们选择使用图像处理技术来扩充原生自动化框架对Flutter页面的测试能力支持,整个测试方案架构如图2所示。
  图2 闲鱼UI自动化测试方案架构
  Flutter的元素不是完全不能被uiautomator2和facebook-wda识别,所以编写测试脚本时只需要处理不能被识别的元素即可。对于有name、label以及xpath不易改变的元素定位,我们优先使用原生定位能力进行定位操作,其他元素则直接使用图像处理技术进行定位操作。
  在处理无法使用原生能力定位的元素时,我们优先使用ocr文字匹配来进行定位,准确率较高,不容易受分辨率的影响,对于纯图片则通过图片查找的方式进行定位。对于一些常见的元素控件例如商品卡片、价格、icon、头像等,我们构建一个训练集,使用图像分类来判断元素的类型,从而实现常用控件的定位。
  UI自动化面临最大的问题就是——随着版本的迭代,测试脚本也需要进行不断迭代。所以在方案选型和脚本编写过程中需要考虑到脚本的健壮性以及可维护性。我们在实际脚本开发中将页面元素封装到单独的类中,并与测试逻辑分离,从而保证后期元素迭代时只需要修改对应的页面元素即可,减少维护成本。
  图3 脚本分层结构
  闲鱼性能自动化测试的相关UI操作已经使用该方案,在脚本编写时,并不需要区分当前页面是什么类型。我们的脚本已经稳定运行500+次,成功率超过98%。总结
  图4 方案对比
  从图4可以看出,无论是flutter driver还是integration test对混合栈的支持不够成熟,但是flutter driver可以进行一些扩展,对于纯Flutter应用而言,采用该方案能够基本满足测试需求,而integration test相对没有那么成熟,对于混合栈应用的测试,可能还是需要考虑混合栈的场景切换成本,使用一些ocr技术去做一些扩充可能成本更低,收益更大。
  致谢
  感谢SLM、TMQ提供的很多底层能力支持,让我们可以专心的做业务。
  flutter driver(https://flutter.dev/docs/cookbook/testing/integration/introduction)
  integration_test(https://flutter.dev/docs/testing/integration-tests)
  收藏举报0条评论

科普下粗盐提纯定义原理和实验仪器步骤关于到现在粗盐提纯定义原理和实验仪器步骤这个话题相信很多小伙伴都是非常有兴趣了解的吧因为这个话题也是近期非常火热的那么既然现在大家都想要知道粗盐提纯定义原理和实验仪器步骤小编也是到食盐的主要成分(粗盐的成分是什么)食盐的主要成分(粗盐的成分是什么)当你从货架上拿起一包零食,要如何判断它是否健康?能量脂肪还是含糖量?或许鲜少有人会关注到经常排在营养成分表最后一项的指标钠,以及它背后所代表的盐。知识学记是孔子写的吗成书于什么时候关于到现在学记是孔子写的吗成书于什么时候这个话题相信很多小伙伴都是非常有兴趣了解的吧因为这个话题也是近期非常火热的那么既然现在大家都想要知道学记是孔子写的吗成书于什么时候小编也是到华为公司成立于哪一年(华为公司什么时候成立)华为公司成立于哪一年(华为公司什么时候成立)众所周知,创业是一个十分艰苦的事情古往今来,虽然说有很多人都一直在积极地投身到创业的道路上,在中年40岁以后创业但成功的却少之又少,现如故宫建成于哪个朝代(北京故宫建立于什么时候?)故宫建成于哪个朝代(北京故宫建立于什么时候?)梁思成先生曾言历史上每个民族的文化都产生了自己的建筑。但遗憾的是,并非每个民族都能从古建筑中理解并发扬自己的文化。然而紫禁城是个例外。鱼鳔的作用(鱼鳔有什么功效和作用)鱼鳔的作用(鱼鳔有什么功效和作用)在神奇的大自然当中,鱼通常是离不开水,也有少数鱼离开水后也能活上35个小时,比如说我们餐桌上的黑鱼就是其中的一种。不过,非洲有一种鱼在没有一丝水的八宝惊风散(儿童受惊吓吃什么药)八宝惊风散(儿童受惊吓吃什么药)成分天麻(制)黄芩天竺黄防风全蝎(制)沉香丁香钩藤冰片茯苓人工麝香薄荷川贝母金礞石(煅)胆南星人工牛黄珍珠龙齿栀子。性状本品为黄棕色的粉末气芳香,味ui设计培训学费(黑马ui设计学费多少)ui设计培训学费(黑马ui设计学费多少)我国早已进入移动互联网时代,无论是聊天游戏购物旅游,APP覆盖了生活的方方面面,企业对UI设计师的需求量也是与日俱增,尤其是游戏方面的UI设川剧变脸原理(川剧是怎么变脸的)川剧变脸原理(川剧是怎么变脸的)变脸是哪种剧种的绝活?在支付宝蚂蚁庄园每日一题中,2021年6月5日的问题是问变脸是我国哪种戏曲的表演方式?变脸属于什么剧种,下面就和小编一起来看看变脸是什么剧的绝活(四川川剧变脸介绍)变脸是什么剧的绝活(四川川剧变脸介绍)变脸是我国哪种戏曲的表演方式?这是支付宝蚂蚁庄园6月5号今日庄园小课堂的问题,很多用户还不知道答案,本文小编会为大家详细介绍6月5日今天蚂蚁庄变脸是什么剧(川剧变脸简介)变脸是什么剧(川剧变脸简介)是一部播出于2012年的抗日谍战电视剧。由陈建导演,王斑,舒畅,韩炀,曹培昌主演。本剧讲述了抗日战争时期山西境内发生的一段抗击日寇的真实故事,其中舒畅在
龙抬头有什么好的寓意(二月初二龙抬头寓意)龙抬头有什么好的寓意(二月初二龙抬头寓意)明天是二月二,俗称龙抬头,民间也称为龙头节春耕节农事节等等。龙指的是二十八宿中的东方苍龙七宿星象,每岁仲春卯月(斗指正东)之初,龙角星就从冬至为什么吃饺子(东至为什么要吃饺子)冬至为什么吃饺子(东至为什么要吃饺子)冬至,是中华民族的一个传统节日,冬至俗称数九冬节长至节等,早在二千五百多年前的,就已经用观测太阳,测定出了冬至,它是二十四节气中最早制订出的一冬至为什么吃饺子呢(冬至为什么要吃饺子的故事)冬至为什么吃饺子呢(冬至为什么要吃饺子的故事)冬至,是中华民族的一个传统节日,冬至俗称数九冬节长至节等,早在二千五百多年前的,就已经用观测太阳,测定出了冬至,它是二十四节气中最早制冬至为什么吃饺子(冬至为什么要吃饺子)冬至为什么吃饺子(冬至为什么要吃饺子)就是二十四节气中的又一个大节气冬至了,冬至是我国最早被确定的节气,也是一年中白天最短的一天,从这一天开始,就进入了数九寒天,各地气候都进入了一冬至吃饺子的来历(冬至吃饺子的传说故事)冬至吃饺子的来历(冬至吃饺子的传说故事),是中华民族的一个传统节日,冬至俗称数九冬节长至节等,早在二千五百多年前的,就已经用观测太阳,测定出了冬至,它是二十四节气中最早制订出的一个立冬吃饺子还是冬至吃饺子(冬至和立冬哪个节气吃饺子)立冬吃饺子还是冬至吃饺子(冬至和立冬哪个节气吃饺子)冬至不能错过的一大美食就是饺子,饺子馅的寓意多,那么冬至吃什么馅的饺子呢?从健康养生的角度来看,适合自己食用的就是最好的饺子。具贴福字(过年贴福字的寓意)贴福字(过年贴福字的寓意)贴?202102071137文汇网过年了,家家户户喜欢贴个大大的福字,希望一家人平平安安,阖家幸福。说到这福字,都流行倒着贴,采个福到的好意。然而,福字都科普下欧洲海洋性气候显著的原因是什么及为什么会显著关于到现在欧洲海洋性气候显著的原因是什么及为什么会显著这个话题,相信很多小伙伴都是非常有兴趣了解的吧,因为这个话题也是近期非常火热的,那么既然现在大家都想要知道欧洲海洋性气候显著的科普下欧洲气候的显著特征是什么及海洋性气候特征介绍关于到现在欧洲气候的显著特征是什么及海洋性气候特征介绍这个话题,相信很多小伙伴都是非常有兴趣了解的吧,因为这个话题也是近期非常火热的,那么既然现在大家都想要知道欧洲气候的显著特征是科普下季风气候最显著的大洲是及大地形对季风环流的影响关于到现在季风气候最显著的大洲是及大地形对季风环流的影响这个话题,相信很多小伙伴都是非常有兴趣了解的吧,因为这个话题也是近期非常火热的,那么既然现在大家都想要知道季风气候最显著的大科普下影响气候的因素主要有什么具体是哪些关于到现在影响气候的因素主要有什么具体是哪些这个话题相信很多小伙伴都是非常有兴趣了解的吧因为这个话题也是近期非常火热的那么既然现在大家都想要知道影响气候的因素主要有什么具体是哪些小