UiAutomator 为什么我选择的是 UiAutomator?

bauul · 2015年06月23日 · 最后由 第十天 回复于 2022年08月09日 · 2772 次阅读
本帖已被设为精华帖!

想起一年前,公司做自动化测试还借助老美的工具,叫做 “CountDown”,这个工具坦白说,是很强大的,之前中国移动做认证的自动化测试也用这个工具,虽然现在已被舍弃。这个工具的精髓却仍然值得深入学习,细细体味的,自觉中其"毒"颇深矣。但它也有它的不良之处,我们当时使用的是 3.5 的版本,不知其后如何。那当时是存在一个比较重大的缺陷的,因其主要原理是对比图片,导致不同屏幕大小的设备,几乎无法重用已设计好的用例。每来新案子,自是苦不堪言。因了这,公司也在想着如何提高效率,自己在网上也找新的自动化测试工具。那会儿我主要知道有 UiAutomator 和 robotium,稍作了解了以后,便选择了 UiAutomator。

作为一个安卓整机测试工程师,我不用 robotium 的理由是:

  1. 跨应用交互功能较弱,而我们有很多交互的自动化测试用例;
  2. 需要重新签名应用,我做整机测试,是几十个应用需要测试,在现在敏捷开发正流行的当下,两周左右即出一新版本,我需要对它们都重新签名,额,想想都觉着累。(那现 在想想,却也并非完全如此,我们可以通过 md5 值,来对比应用在设备前一版与后一版有无更新,只要针对有更新的应用重新签名即可,这个可以减少任务,同时亦可将测试重点放在那些有更新的应用上,可谓一举双得)。

对比之下,UiAutomator 就比较适合做整机的测试,

  1. 跨应用很容易;
  2. 不需要重新签名;
  3. 新版本出来以后,用例重用率高,同一应用,不同屏幕大小的设备亦可重用。

当我掌握了 UiAutomator 的时候,听说 Appium,既可做安卓,亦可做 iOS,也想学着来。另一原因是想用它来做一些网页的自动化,因为 UiAutomator 本身对一些网页上的控件,查不到它的属性,据查 Appium 是可以的,便想学着来试试。在安卓上搞了一条用例后,便弃之不用了,不想用这个,着实不便。

  1. 需要连着 usb 线,或局域网,万一我跑到开关 WiFi 的用例,咋整?我这边执行 UiAutomator 全用 shell,跑起来以后,都是连着 AC charge(AC 就是充电头) 的,不需要开着一台电脑陪着手机一直运行着,从节能角度来说,一年下来,却也是要省不少钱哩(虽然咱大公司,不差钱);
  2. 用例中有诸多设置,限制了设备 ID,平台 ID 等等,换台手机跑?我要写了 800 条,难道一条一条更新?

接着说说,为什么是 UiAutomator 与 shell 结合?

其实,我们做自动化黑盒测试,我们最主要的目的是什么呢?

  1. 节省资源,这资源又分为:人力资源,物质资源(比如我们现在测试的智能手机,据说其运算能力,已超六,七十年代,老外将卫星送上天所用的那些个计算机了,其本身已够强大,却还要一台 pc 陪跑,我感觉就挺事儿的,虽然有时是技术要求或限制啦)
  2. 保证产品稳定性,发现问题。这个是自然的事,不消多说的。

围绕这两个主要的目的,那工具的选择上面,自然是越简单实用,效率越高越好。无论是 UiAutomator,还是 Appium 或其他什么工具,在最后的最后,都是要来那一下子,点击嘛,不操作哪里有什么测试可言?点击的啥呢?还不是坐标?而我们拿到了这个控件的坐标后,只消点击对应的坐标即可。哪个工具速度快,通用性好,才是首选。从这点来说,以上的工具各有利弊。我们使用 uiautomator dump 来获取 xml 档,从 xml 档中过滤出控件的坐标值来,使用 shell 脚本来执行,速度是非常快的。这个比 UiAutomator 本身要快的多。快多少?这点需要具体的用例来说明了,这是后话。

最后,再次申明,小可是做整机测试的,如若做单个应用,或许会选择不同的自动化测试工具。

以上全属小可的乱弹琴,感谢各位!

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 45 条回复 时间 点赞

感想不错,但是排版啊,先学了发帖的排版再发帖!https://testerhome.com/markdown

#1 楼 @lihuazhang
有看排版的,但是这感想的纯文字的贴子,怎样排版比较好,我这也有点头疼.怕挨批.有没有前面谁发过纯文字的贴子,而排版又比较好的,当学习之.

#2 楼 @carl 按段落排啊,

这种用

  1. 跨应用很容易;
  2. 不需要重新签名;
  3. 新版本出来以后,用例重用率高,同一应用,不同屏幕大小的设备亦可重用.

和其他文章有什么不同么?

挺不错的分享,点赞

#3 楼 @lihuazhang
虽然可能列出来的点是相同的,但分析的角度不同,别人是纯粹从工具的易用程度来分析,而我是从实际在做整机测试的经验来看这个的.

楼主我用 uiautomatorview 获取控件然后 shell 命令执行,” uiautomator dump 来获取 xml 档,从 xml 档中过滤出控件的坐标值来,使用 shell 脚本来执行,速度是非常快的.这个比 UiAutomator 本身要快的多.快多少?这点需要具体的用例来说明了,这是后话.“这一点我觉得不太可信啊,楼主你是通过和什么产品做对比的?我怎么觉得 dump 这个过程又慢又不稳定呢?经常会出莫名其妙的故障

bauul #39 · 2015年06月23日 Author

#6 楼 @james88233
后面有时间,我会举例来说明的,今天时间不早啦!另外,你说 dump 这个过程,又慢又不稳定,不知道是否有在哪个界面出过错呢?莫名其妙的故障是什么样子的故障?是否如我文中所言,报 error 吗?

#7 楼 @carl 我也做整机测试的,个别手机在执行换墙纸这条用例的时候,dump 总是失败,肉眼看上去不是动态的。当然我只是举个例子,也可能我的老爷机太慢,我平均 dump 一整个屏幕的元素耗时 3 秒左右,这样一个 action 从开始执行到完成就要花费 3-4 秒钟,是不是太慢了?

#8 楼 @james88233
我今天在电脑上使用 uiautomatorviewer.bat 来抓取手机一个录音过程中的界面控件时,花了 34 秒,才显示出来,所以...相比较而言,3-4 秒算快了吧?哈哈,但是我在手机的 adb shell 下面, 执行 uiautomator dump 就快一些,当时没有拿秒表计时,大概是 4 秒以内的样子.我是使用了我讲的那个方法的.另外在使用 uiautomator 跑用例时,不仅仅是 dump 慢,有时界面上明明有这个控件,单独刷界面也可以刷出来,但是跑那条用例,就是失败了,中间又加了延时,方才成功.我不知道你有没有遇到过.

#9 楼 @carl 你说的问题我都遇到过,我认为这就是 uiautomator 的一个瓶颈,我真不觉得获取屏幕上的控件需要 3,4 秒的时间算是 “很快”,对于遍历性质的测试来说我觉得问题不太大,慢就慢吧,反正白天黑夜跑去呗。但是对于迭代频率比较高的偏功能性测试来说,效率就比较重要了。毕竟人家手工几个小时也跑完了,你还得弄脚本外加 debug……当然,有些人会说这样的需求为毛要自动化,我也表示无奈啊。。。客户就这个需求,给你钱了,你敢不干?Orz

bauul #35 · 2015年06月24日 Author

#10 楼 @james88233
快慢,一者与界面是否含有动态控件有关,二者与手机的运行内存有关.刚才所讲的 34 秒,是 34 秒,不是 3~4 秒,我没写错哈,是我在小米 2 手机上测试的一个数据,这只手机运行内存只 1G.至于其他关系因素,我目前还不知道.对于你所讲的"迭代频率比较高的偏功能性测试",我们的做法是,自动化没有设计完成时,采用逻辑测试,自动化设计完成时,自然是采用自动化.毕竟自动化用例也是需要人来设计的.客户的需求是说这些用例要设计成自动化,我想应该不是说立刻,马上用自动化跑起来吧?哈哈,理总是讲得通的.

关于快慢的问题,我觉得只要是做黑盒 UI 都快不到哪里去。因为即使你操作很快,你还得等网络、等控件渲染、等界面切换动画。。。最终速度不会比你手工快多少(selenium 在浏览器中运行很快,但你还是要等待浏览器跳转页面的时间)。
而且手机 dump 确实速度比 pc 慢不少。你可以拿个 genymotion 来 dump 一下,会发现比真机快不少。
真的要快,单测或者从 app 内部进行测试才是最快的。

#3 楼 @lihuazhang @carl 我说的是排版,我稍微帮你改了下。我觉得大家对自己的要求都低了。你这篇文章,有两个问题:

  1. 排版糟糕
  2. 标点符号乱用,到底是全角还是半角?

请斧正!

我不知道大家怎么想的,还是喜欢这样风格的文章。 @chenhengjie123 @jaychang1989 @james88233

bauul #14 · 2015年06月24日 Author

#13 楼 @lihuazhang
感谢指正,下不为例.

bauul #15 · 2015年06月24日 Author

#12 楼 @chenhengjie123
手机 dump 确实速度比 pc 慢不少,请问这个怎么理解?

#14 楼 @carl 现在就可以修改。为什么要下次?

bauul #17 · 2015年06月24日 Author

#16 楼 @lihuazhang
已更新。

最近才和其他部门的同事聊过,这里的整机应该主要是针对一个固定型号的机器进行相应的整体功能性测试吧?因此性能是通过其他方式测试硬件,他们整机主要是测功能覆盖,然后目前的新机型主要都是 4.4 以后的,不存在取不到控件的问题。功能么,主要是测试 SDK 自带的和 ROM 封装的功能?我这么说有没有问题啊?大家的测试对象都不太一样,建议下次最好将需要测试的对象稍微描述一下吧?~~@carl 我这么理解有没有问题啊?望指正哈~

#18 楼 @yangchengtest 整机测试可以包含功能性遍历和性能测试啊,取决于你的测试用例怎么写了。我打一个电话,验证功能点,是功能测试,我连着打 100 个电话,同时记录并分析 logcat,这算不算性能测试?

#13 楼 @lihuazhang 排版好评,条理分明。

#12 楼 @chenhengjie123 我理解的快,就是跟 Monkey 跑起来差不多那种,最好俩动作间隔不要超过 1 秒(当然这是在设备本身合理地性能要求范围内),接近手工操作那种,我是不是想太多了 Orz,我用 Uiautomatorviewer 定位控件去拨 10086,它能给我 dump5 张图,然后一个个去找控件,慢的要死。当然后来我就发现了,用 adb shell input text 省事的多。但是从用户习惯来看,就是那么一个个 touch 的不是么?

@james88233 打 100 个电话这是稳定性测试吧?我的意思是这种手机硬件相关的测试和纯应用测试还是有区别的。~

#22 楼 @yangchengtest 对,当然是。但是整机测试,总要包含应用和系统吧,你跑纯应用测试跑 1 遍和跑 100 遍,结果应该是有很大不同的吧,而且跑 1 遍和跑 100 遍的前置条件肯定都不一样。

新人嘛,值得鼓励

不错不错 手动点赞

终于拍版好了。。。

bauul #27 · 2015年06月27日 Author

#18 楼 @yangchengtest
固定型号?嗯,对,我们做的都是我们公司自己的手机,有很多的应用都是我们公司自己做的,其余的有一些客制化的应用以及平台本身的应用,比如 Settings 这样的。最主要的是稳定性测试。“建议下次最好将需要测试的对象稍微描述一下吧?”,嗯,接受你的建议,谢谢!

#9 楼 @carl 用录音界面来对比的话,不太合适。UiAutomator 有个特点,就是他需要等待界面达到稳定。如果过对于不稳定一直在变化的界面,比如录音和音乐播放,他就会需要比较长的时间。

#19 楼 @james88233 打 100 个电话,在整机测试中一般认为是压力性测试(稳定性测试),看看通过率多少,看看会不会出系统问题。当然,面试过程中也是有遇到过一些公司把他定位性能测试的。。。。占少数

#21 楼 @james88233 目前的根据 view 的机制以及图片识别机制的都打不到 monkey 那么快,Robotium 还可以,因为是在一个类中,基于反射机制,所以速度能在 1s 以内。Uiautomator 如果用 jar 包写,一般能控制在 2~3s,如果用 dump 的话,基本上就要 4s 左右了

赞楼主,我也是在对比几种方案之后选择的 Uiautomator,觉得非常好用,有空一起交流。
有空我也可以分享一些像楼主这样的文章

bauul #14 · 2015年08月03日 Author

#31 楼 @mahone
欢迎交流

您好楼主,我也在使用 uiautomator,不过,我现在写脚本遇到两个问题。这两个问题来源于一个功能,就是知识点学习,如图:
视频类知识点:

百科类知识点:

问题来源于滑动到知识点位置对知识点点赞 如图:

现在由于这两个知识点类型 ui 布局不一致,导致我写脚本,需要写两套,请教有没有什么好的方法,可以一个脚本,兼容这两个类型知识点的自动化测试。谢谢

bauul #34 · 2015年11月03日 Author

#33 楼 @jiap 你做一个查找点赞的动作,找不到时向下滑动不就好了吗?

请教一下,用 shell 脚本测试需不需要 root 权限?

bauul #10 · 2015年12月19日 Author

#35 楼 @actionwind
可以不用 root

#18 楼 @yangchengtest 图库里面的控件获取不到

#36 楼 @carl 这个 shell 脚本写测试用例到底是怎么写的,能不能贴一段来看看?还有除了点击之外,滑动什么的能用 shell 来做吗?

你好!请问题下:使用 Uiautomator API 输入字符串 object.settext("18012345678"),但实际上在手机看到的是 1012345678;是输入速度的原因吗

#39 楼 @huangqiang
不一定噢,换几个输入框试一试,使用 adb shell input text 试一试,多对比一下,再确认问题

想请教下,可不可以在安卓代码里 dump 界面 ui,就像使用 adb 命令获取一样,我使用/system/bin/uiautomator dump /data/tmp/dump.xml,没成功,请问您是否了解,感谢~

好像不可以的,权限的关系,代码中要获取控件信息的话,可以参看:http://blog.csdn.net/dd864140130/article/details/51794318

楼主你好,我现在本来是在用 appium,但遇到最大问题就是在实体机上执行用例特别慢,超慢,uiautomator 比 appium 执行速度上有多大优势呢?

bauul #44 · 2017年02月27日 Author
阿森 回复

如果你仅仅是测 Android 可以用 uiautomator2.0 版本,速度比 appium 快,是因为 appium 底下也是用 uiautomator,但是还做了一层封装。具体快多少,我没有实测过,粗略估计快一倍以上吧。

请问到哪里可以找到这个 CountDown 工具

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册