移动测试基础 脚本录制

opentest-oper@360.cn · May 18, 2018 · Last by opentest-oper@360.cn replied at July 03, 2019 · 11054 hits

一、需求背景

        现今针对移动端的 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、判断页面上的用户操作要达到一个精准度高的录制,需不断调整阈值至合理水平,满足大多数使用习惯。

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

厉害了

2Floor has deleted

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

4Floor has deleted

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

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

赞一个。

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

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

water 回复

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

water 回复

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

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

12Floor has deleted
water 回复

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

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

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

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

17Floor has deleted

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

water 回复

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

water 回复

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

21Floor has deleted

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

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


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

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

water 回复


这是查看脚本

water 回复


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

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

乾行 回复

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

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

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

写得非常好,有开源的代码吗

陆小小凤 回复

不好意思,没有开源。

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up