移动测试基础 脚本录制

360qa · 2018年05月18日 · 最后由 iqianxing 回复于 2018年05月25日 · 2479 次阅读

一、需求背景

        现今针对移动端的UI的测试的平台,用户进行用例测试的需要先进行测试用例脚本的编写(多种语言的,如lua、java)。这些脚本用来进行UI操作的,编写完成后放到测试平台上运行。
这种方法的缺点是用例需要测试人员自行编写,难度大,成本高。

二、实现效果

         通过屏幕录制,将使用者对手机的操作记录下来,然后自动生成可放在平台上面运行的用例脚本。这种方法可以解决上述的缺点。

         当前我们实现了自动脚本录制并生成Python用例脚本。

三、使用介绍

         1.平台支持:http://opentest.360.cn/phonerenter.html

         2.使用前提:打开云真机平台的某台设备进行使用,选择脚本录制

         3.使用步骤:

                (1)上传APK(选择需要进行测试的apk并进行上传)
                (2)查看控件信息(鼠标移到屏幕的手机的控件上,可查看该控件信息)
                (3)录制脚本(记录鼠标在屏幕上的动作;添加操作不可达表示的动作)
                (4)脚本回放(回放脚本,查看脚本可否正常执行;可修改参数)
                (5)保存脚本(脚本能正常执行后可以进行保存至用户的脚本列表中)

四、技术实现

1、上传APK

         前端上传,节点机器下载

         上传:adb push …
         准备:adb pm clear packagename(清除历史数据)
                    adb pm uninstall packagename(卸载之前的APK)
         安装:adb pm install –r apkpath
         运行:adb am start –n packagename/activityname

2、查看控件信息

使用可视化的工具: UI Automator Viewer——功能介绍

查看控件信息——功能显示

查看控件信息——技术实现

         第一版实现:

        

         adb shell uiautomator dump
        

         第二版实现:

         由于第一版方式dump界面时间比较久(脚本录制功能要求高的实时性),故修改为第二种实现。

         使用AccessibilityService(获取当前窗口的根节点,然后获取到整个页面的信息并处理为xml)

AccessibilityService:Google为了让Android系统更实用,为用户提供了无障碍辅助服务。出发点是用来辅助有障碍人士使用手机的,可以模拟一些点击操作等。
拓展:AccessibilityService运行在后台,并且能够收到由系统发出的一些事件(AccessibilityEvent, 这些事件表示用户界面一系列的状态变化), 比如焦点改变, 输入内容变化, 按钮被点击了等等, 该种服务能够请求获取当前活动窗口并查找其中的内容。换言之, 界面中产生的任何变化都会产生一个时间, 并由系统通知给AccessibilityService.这就像监视器监视着界面的一举一动, 一旦界面发生变化, 立刻发出警报.
每个节点的信息包括:md5, index, resource-id,class ,text 等。

         后台服务实现:

         自定义一个服务类AccessibilitySampleService(这个命名可以随意),继承系统的AccessibilityService并覆写onAccessibilityEvent和onInterrupt方法。编写好服务类之后,在系统配置文件(AndroidManifest.xml)中注册服务。完成前面两个步骤就完成了基本发辅助功能服务注册与配置,具体的功能实现需要在onAccessibilityEvent中完成,根据onAccessibilityEvent回调方法传递过来的AccessibilityEvent对象可以对事件进行过滤,结合AccessibilitySampleService本身提供的查找节点与模拟点击相关的接口即可实现权限节点的查找与点击。

         那加入鼠标在网页上滑动或停留一段时间的时候,如何判断区分哪个控件是用户所选择的呢?
        

         通过将AccessibilityService得到的xml-str数据转为xml-dom树,通过鼠标的坐标信息得到对应于该手机的坐标信息,遍历dom树,得到包含这个表标点且面积最小的控件。

3、录制脚本

         记录用户在网页上的手机界面操作

         支持12个动作:
返回、主界面、菜单
根据md5点击、根据md5查找、根据文本点击、根据文本查找
滑动、拖拽、发送文本、点击backspace键、休眠(人为计算两个操作间的时间)

         遇到的问题:

        (1)区分点击,滑屏,拖拽:鼠标在界面上的操作:down, move, up , leave(边界处理)

         解决:
        

         上图表示三个操作的划分:
         A.根据一定的距离来判断是点击还是(滑屏、拖拽),设置合理阈值(鼠标可能发生小抖动)。
当在一定距离以内,则认为是点击;当超过该段距离,则认为是滑屏或拖拽。
         B.上述已区分是点击还是滑屏、拖拽。滑屏与拖拽的区分点是根据鼠标按下的时间来进行区分。Ps:手机上当你在某个区域点击不放时会唤出某些功能,例如APK的卸载功能。
当点击的时间大于设置的阈值时,认为是拖拽行为;小于则任务是滑动行为。
         注:当点击的时候分两种方式点击:如果该控件含有text,则可认为是通过text进行点击;若没有text,程序内部会根据xml树形结构该控件的位置进行计算得出唯一的md5(类似网页上的xpath)

        (2)注意手机当前的旋转以及真实屏幕和前端控件的比例(纵横可能是不同的,注意换算)

         解决:后台监控手机是否旋转,若旋转则在坐标处理时先做旋转处理,再做像素转换。

4、脚本回放

根据保存的动作信息去调相应接口执行相应动作

5、保存脚本

保存已经重放成功的脚本,可自动生成python脚本,在开测的脚本管理页面看到刚刚保存的脚本,并可以在平台上执行。

五、总结

1、dump的操作考虑到功能的要求,必须在实时性上进行一定的优化。
2、判断页面上的用户操作要达到一个精准度高的录制,需不断调整阈值至合理水平,满足大多数使用习惯。

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

厉害了

2楼 已删除

欢迎意见反馈,使用页有用户手册

4楼 已删除

录制的功能还行,就是不太好用。
1,安装的时候各种弹窗问题未处理。
2,每次都要求重新安装,这个有点蛋疼,结合第一个问题,就无法回放了。
3,脚本无法保存,按钮一直是灰的。

4,换了一台华为mate10之后,可以安装和录制,重放也可以了,但是重放完之后没有自动停止,只能手动停止重放,然后保存脚本的按钮也是一只灰的。

赞一个。

弹框这里我们配置过了,如有弹框可能是新弹框,未在配置文件中,你可选择其他手机进行操作(有的品牌手机弹框较多)。你方便的话可提供弹框内容我们这边进行配置即可

360qa 回复

重放无法停止怎么破?跑完所有步骤都没自动停止,无法保存

weamylady 回复

第一个问题:配置弹框是人工配置,可能有个别弹框还未配置;第二个问题:脚本录制的技术背景就是测试某个apk,所以第一步全是安装apk,如有异议,我们会考虑使用情况。第三个问题、第四个问题:产品的逻辑确实有缺陷。保存脚本是在重放脚本成功后(弹框显示重放成功)会变亮

360qa #10 · 2018年05月21日 作者
weamylady 回复

保存脚本的操作只能在重放成功后才可保存,无法自动停止回放的说明重放不成功。故无法保存,重放无法停止这个问题我们这边查看一下,有回复告诉您

360qa 回复

重放的步骤我看都跑完了,没有停止

12楼 已删除
360qa #13 · 2018年05月22日 作者
weamylady 回复

请您再试试,我们已优化界面显示,绿色可看到当前重放进度

360qa #14 · 2018年05月22日 作者

功能实现方面,我们的功能更多。内部实现完全不一样

360qa 回复

录制完成了,可以点击保存成功,但是成功提示在当前页面点击脚本按钮,我找了半天没找到这个按钮,不知道脚本放哪儿去了……
而且每次录制都得重新上传apk……很烦

360qa 回复

首页进行自定义脚本测试,没看到有共有设备啊?我已经租用了一台手机,但是看不到

17楼 已删除
360qa #18 · 2018年05月22日 作者

你指的是充电方面吗,是通过重启解决的。

360qa #19 · 2018年05月22日 作者
weamylady 回复

这部分功能正在完善中,所以未开放手机给您使用。

360qa #20 · 2018年05月22日 作者
weamylady 回复

每次上传apk这个,你可以通过修改脚本来实现重新录制,删除不需要的录制操作,然后重新录制就行;

21楼 已删除
360qa #22 · 2018年05月22日 作者

这个是从经验角度来分析的,过充都是因为充电时间过长导致的 重启就把时间中断了

360qa #23 · 2018年05月22日 作者

不过,我们之前从软件的角度去调研过充电问题,你可以看看 :https://developer.android.com/studio/profile/battery-historian

360qa #24 · 2018年05月22日 作者


我们实现了电池功能,获取电量消耗的,通过上述文档。软件的断电不充电后来证明是无效的。

360qa 回复

我找了半天都没找到查看和修改脚本在哪里???????????????????

360qa #26 · 2018年05月24日 作者
weamylady 回复


这是查看脚本

360qa #27 · 2018年05月24日 作者
weamylady 回复


修改脚本指的是添加操作和删除操作,脚本的生成是后台完成的。所以脚本的修改在前端修改操作手机的流程就可以达到修改脚本的效果了

这并不是最高效的方案:
1、想想为什么需要录制?
2、录制的元数据是怎样的?

360qa #29 · 2018年05月25日 作者
iqianxing 回复

产品的设计主要解决两个问题:1、降低ui自动化测试脚本的编写门槛 2、自动生成的脚本可在开测中测试兼容性(该功能现在正在维修,无法使用)。3、定制化测试的ui测试步骤。
你说的第一个问题:录制的原因就是可以拿来在别的设备上进行重放测试

第二个问题:只要达到录制的目的(测试ui),录制的元数据不是测试所关心的,您有什么更好的见解吗

360qa 回复

1、录制过程中产生的数据一定UI界面的元数据,不是非要生成脚本,生成的脚本只是利用一个代码模板生成的一个文件,能把元数据保存下来,为何非要生成一个非结构化文件?
2、录制可能也是点点点,点的数据是有规律的,你只需要一个循环便可实现点点点!

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