谢春鸿:谢谢大家今天的捧场,我叫谢春鸿,来自Testin,主要负责iTestinPro自动化工具的研发。今天的主题分为四个部分:为什么做脚本的工具,录制工具的原理还有实现,还有一些难点,最后是一点演示。
为什么要做脚本录制。现在大部分公司都是有专门的测试人员,有一部分还没有,有专门测试人员的公司有一小部分会做自动化测试,一般是那些实力比较强资金充沛的公司。不做自动化的这部分的公司,不是因为不喜欢自动化,而是因为自动化对于他们来说没有成为一个必要的条件,或者资源还没有满足。如果有一个不花钱又可以实现自动化的方案,其实是谁都是想要的。
为什么要做录制工具,其实初衷就是为了让自动化测试没有门槛,想象一下,有这样的工具,不需要做任何的环境搭建,只要下载之后,直接解压就能用,经过几分钟的讲解就可以录制自己的脚本,然后这个脚本可以在云端几百台手机上正确无误的回放。也就是说你不需要懂编程语言,也不需要做环境配置,没有复杂的教程,不需要花大量的时间调试脚本,这样就可以在不增加人员的情况下实现自动化测试的实施。
很多人认为有了自动化就可以什么也不干,其实不是这样的,自动化不能满足你百分之百的需求,根据我们的经验,大部分公司的软件测试,能够实现30%的自动化就不错了。
做脚本录制是否值得,以我们的经验来说,如果你真的要做好的话需要花大量的成本,需要长时间的积累。我们开始做这个工具,至少有五六年的时间了,但是做了这么多年还是有这么多事情要做,所以它是一个很长时间的积累,而且需要持续的去投入,一般公司去做这个是不值得的。
下面我会以这个工具,讲解实现自动化录制工具的原理和经验,供大家参考和了解。
iTestinPro工具是一个安卓和IOS的UI自动化脚本录制工具,是云测私有云产品的主要组成部分,也是公有云兼容性测试交付的主要工具。
脚本录制的原理其实很简单,从这么多年的经验来说,总结其实是非常简单,怎么做,只需要满足两个条件,第一个条件就是你可以获取到控件树,第二就是你可以知道用户在做什么,只要满足这两个条件就可以做录制,不管是安卓录制,IOS,还是PC端软件,还是浏览器,只要你能实现这两个条件,就可以实现脚本录制。这是本次分享最重要的内容。
怎么获取控件树,其实在UIAutomator中,它就提供了一个现成的获取方法dumpWindowHierarchy,这个直接就可以用,每个节点有一些关键信息,比如说文本,class,id,控件大小,位置以及层次结构等。其他的测试框架,生成控件树需要自己实现,一般方法是找到root节点,然后一层一层往下遍历,组成跟UIAutomator类似的格式就可以了。
获取用户的操作有好几种方法可以实现,比如说你可以做代码注入,嵌入SDK,或者你用其他的方式,可以取到界面上所有的控件,每个控件你只要在手机上操作,就同时可以获取到控件的信息,同时可以知道用户是做了什么操作。这个方式,它是一种代码入侵的方式,其实在出问题的时候很难说这个问题是谁的,是应用本身的,还是测试SDK的问题。第二种方式,监听系统的event,通过监听系统的getevent方法输出,它的输出是一个持续的输出,你在界面上做任何操作都会有这里输出,你只需要去解析它变成用户的操作就可以了。但是有一个问题,这个只有安卓有,其他没有。另外它需要大量手机的适配,很难去做到通用,工作量很大。第三种方式就是把屏幕映射到PC上,捕捉用户的操作,这种方式最简单,也非常便利,工作稳定,扩展性好,所以一般是用这种方式。
有了控件信息和用户的操作,还没有办法录制,还需要知道用户对哪个控件做了操作。选择控件,怎么选也是比较简单的,也是有现成的,像UIAutomatorViewer就可以提供相关的方法。在选取的时候你要选取最小的叶子节点,因为这是最关键的信息,比如文本一般不会在父节点里边,一般在叶子节点里边。如果两个控件位置大小相似,你应该选择更有意义的。这个选择不是说是用户来选择的,是程序自动选择的。用户把鼠标移到控件上的时候,如果这里边有两个控件是重叠在一起的,选更有意义的那个。有一些是互相覆盖的控件,大控件上面套一个小控件,这个时候你可以利用鼠标离那个控件中心最近决定选择那个控件,这样的话每个控件都有可能被选中。另外可以通过鼠标滚轮选择当前控件的父控件。
这儿有一个演示,这是类似于UIAutomator控件选择的实现。录制的时候需要记录什么内容呢?对于写脚本来说,人为的选择一个最关键的信息,比如你选择这个文本,这个是在界面上是唯一的,你可能会用ID,对录制来说这些信息都要记录下来,因为在写脚本的时候,人考虑事情的是当前或者手头的这几个手机能不能过。录制工具需要考虑的事情更多,这个步骤是不是可以在决大部分手机通过,这是录制工具考虑的问题,尽量把能够选取到的信息都记录下来。比如说控件的基本信息,ID什么的,这些不用说了,包括控件的位置,控件的样图,还有场景。比如说控件树的信息,录制场景的大图这些信息都要记录下来。
下面讲一些你实现录制工具的时候,可以借鉴的一些点,给大家分享一下,比如Xpath的生成,什么是Xpath,xpath即为xml路径,它是一种用来确定xml文档中某部分位置的语言。Xpath的生成,如果你写脚本的时候也需要自己的生成,用录制工具的时候需要由工具来生成。生成的方式大概有两种,第一种是你根据控件本身,在这个界面上它的一些属性的唯一性来生成Xpath。后面会讲一些案例。第二种就是利用控件的相邻关系,比如说这个控件不好识别,它的父控件是不是好识别。比如说它的兄弟控件是否好识别,是一个相邻的关系。有一个例子,比如说怎么理解相邻关系,比如说大家都不认识你,大家都认识你父亲,你父亲可能比较有名,要找到你就是先找到你父亲就能找到你,同样的方式,大家可能只认识你哥哥,可以先找到你哥哥。
生成的Xpath需要尽量地短,越短越好,这个原因是控件树,其实它在不同设备上,可能层次是不一样的。如果你是从第一层往下做控件树的话,它的适配性,兼容性会有大的问题,所以需要尽量的让你的xpath变得越短越好。比如说这儿有一个案例,上面有几个数字,这是它的ID,这个ID在界面上是唯一的,你的Xpath可以简单的这样写。利用控件的相邻关系组成的Xpath,比如说你上面这个图表是应用两个字,但要点上面这个图标,怎么做呢?因为这个图标可能不好识别没有什么特征,可能就是一个ImageView,没有id,没有文本。可以利用它下面的应用这两个字,这是比较有特征的,方法是用Xpath里边的特性,就是following sibling来定位这个控件 。
录制工具做到一定程度的时候,你会发现,默认的查找策略无法满足用户的所有需求,情况有很多,你需要用一种方式可以让用户自己来调整这个设置。让每个属性都有三种策略可以设置,必选,可选和忽略,必选是你这个条件必须满足,在整个控件树中找到符合必选条件的控件,可选是用于辅助过滤必选条件筛选出来的控件,如果能过滤出唯一的控件则认为控件找到,这样用户可以自己设置这些东西。
另外你会找到多个控件,这个时候你可以有一个设置选择第几个的方式。第二点,你这个控件不是一开始就出来的,你需要等一段时间才会出来,需要有一个查找的超时时间,就是界面加载。第三个就是控件本身你录的时候,可能是一个大屏手机,屏幕比较大,当你回放的时候,这个是小屏手机,控件可能在屏幕外面,这时候你需要有一个滚动查找功能。
还有是中文输入,中文输入是绕不开的问题,不过你网上可以找到解决方案。比如你可以直接用谷歌拼音输入法改造成自己的输入法,将要输入的内容转化为base64,通过广播方式传给输入法,这样它可以一次性输入任意的内容,包括中文和特殊字符等。另外一个绕不开的问题就是系统弹框处理,在执行过程中弹框每个设备都可能不一样,这个时候,你需要有一个服务并实时监控处理这些东西,这个一般实现就是在UIAutomator里边去实现。比如有一些要取消这些场景你把它收集起来,让各个手机都可以顺利的处理这些问题。
另外说几点,怎么提升你脚本的兼容性。因为在Testin里边,你录一个脚本基本要求是能通过600个手机,600个手机是我们交付的一个标准,每做一个功能都是这样去做的。我们的做法这里边有几点,比如说每个控件在每个步骤生成的时候,我们可以生成多个Xpath,每个Xpath适用不同的场景。比如说有一些在跑的时候,文本是变化,比如说实时更新的信息。另外,有一些手机有ID,有些手机没有ID,6点几的手机同样的应用,有些手机有ID,有些手机是没有的。然后你用的好好的文本,有可能也不行了,因为有些手机完全无法识别,你需要用OCR识别,当控件找不到的时候,利用OCR解决,OCR就是文本的识别,利用图片来进行识别。最后利用控件的样图做图像识别,图像识别不是一个万能的方法,这些方法,控件,OCR和图像识别不是一个万能的方法。不能百分百解决问题,但是能够互补起来的话,你的问题就会变小了,大概就是这些。
然后有两个简单的演示。这是要做一个case,输入错误的用户名密码验证提示语是否正确,这个是用UIAutomator实现的,获取控件,然后输入东西生成一些步骤。这是对完全没有经验的人来说,直接就可以用的,这是输入文本,这是自己做的一个输入法,验证关键的文字 。
下一个是差不多的演示,用的是不一样的方式,用了OCR,图像识别。这是一个弹框,OCR类似于有近视眼的人看东西,有些东西看不清楚,可以在用的时候需要配合着调焦去进行操作。在回放的时候,会有自动的调整参数,确保能够在600百个手机上通过 。
好,今天的分享到此结束,谢谢大家。各位有没有什么问题吗?
提问:你好,请问一下,你们需要验证码吗?
谢春鸿:验证码,短信验证码,还是图型验证码?我们内部有一个服务,利用AI识别图型验证码,把这个字拆开一个一个识别这个字是什么,像特别厉害的验证码是做不了,像你说的那些只要能把这个切开就是没有问题的。
提问:我们前期也是合作比较多的,类似于为特殊APP做的安全键盘输入, 以后都会加入到新版本吗?
谢春鸿:这些都是普遍的需求,现在我们做成标准的功能,所有的产品都会有安全键盘输入,这个是一个标准的功能了。
提问:刚才提到验证码,在合作当中短信这块是怎么做的,就是短信验证码,如果不匹配的话,有什么方法。
谢春鸿:有两种方式可以解决,一种方式,如果你们自己有一个服务的话,可以直接用web请求来做。第二种方式,我们现在如果你们这个手机里边有sim卡的话,是直接可以获取到的。我们其实也不是用手机里边本身的数据库,因为这个有各种限制,没有办法获取验证码,我们通过UI跳到短信应用去获取,然后再回到应用上来。
提问:我有一个问题,在录制脚本过程中,可能有一些元素没有办法通过Xpath的时候,只能通过其他的来识别,类似这种可能在不同手机上可能存在不兼容的情况,那请问一下,这样怎么处理呢?
谢春鸿:比如说你提到Xpath里边可以用控件之间的相邻关系,这是一种解决方式,你这个控件不好识别,你用一个很好识别的,用相邻关系识别这个不好识别的控件。另外一种是类似的,我们有一个偏移点击的方式,这个控件不好识别,我们找一个好识别的,偏移找到你真正要识别的控修的点击它,还有像OCR,图像识别在必要的时候是好用的。大概有三种解决方式。
提问:你好,我问一下,OCR是怎么实现的,能不能详细的介绍一下。第二个问题,OCR占比有多大。
谢春鸿:OCR在我们交付里边应用的话,占百分之二三十,因为手机有些能获取,有些不能获取,所以这个是比较重要的。但是实现的话,我们这边开源做一些优化,正在改进。
提问:识别中文的话,识别率应该不是特别的高?
谢春鸿:这个问题,对于自动化来说,如果对内容,对有一些内容是不要求精度的。比如说确定,识别成石角定,本身有一个相似度,通过字偏旁部首,这个字和这个字是类似的,计算出一些相似度就可以找到的。如果你在界面上找到多个相似的,找一个最相似的。
提问:刚才说只是在比较特定的场景才去用,如果手机差异化越来越大的话,有没有可能全部OCR录制这样的脚本的可能呢?
谢春鸿:后面我们是有一个规划的,会不再用控件的方式,全部用OCR和图像的方式来做,我们未来是这样来做的。
本文来自:2018中国首届云测试峰会,举办方:Testin 云测
Testin云测,让应用更有价值:www.testin.cn