Java+MotionEvent实现埋点自动化

导读:本文旨在帮助测试人员“0”代码完成UI自动操作以及埋点自动校验,基于现状,埋点测试以及每次发版需要花费大量时间验证相关埋点,并且随着业务发展,埋点数量只会越来越多,很难做到每次发版将全部埋点回归验证一遍,虽然线上有埋点数据监控系统,但是发现埋点数据异常时已处于外网阶段,因此需要一套机制降低埋点问题逃逸率,同时降低测试负担,提高测试效率。

一、架构总览

埋点自动化整体分为两部分,第一部分是客户端操作录制功能,第二部分是服务端回放以及埋点校验功能

注:服务端部署在本地,进行UI操作回放时需要通过数据线连接手机,进而在手机上回放已录制操作

二、客户端

UI自动化一般都是通过元素定位的方式实现,但是这种方式维护成本极高,为了简化UI自动操作,通过录制的方式完成,操作主要包含两种:点击和滑动,分别基于事件类型及事件坐标进行录制

事件坐标  

每个触摸事件都代表用户在屏幕上的一个动作,每个动作都有其发生的位置。在MotionEvent中就有一系列与标触摸事件发生位置相关的函数:

  1. getX()和getY():由这两个函数获得的x,y值是相对的坐标值,相对于消费这个事件的视图的左上点的坐标。
  2. getAction():获取当前触摸的事件类型。

事件类型  

事件类型就是指MotionEvent对象所代表的动作。当你的一个手指在屏幕上滑动一下时,系统会产生一系列的触摸事件对象,他们所代表的动作有所不同。有的事件代表你手指按下这个动作,有的事件代表你手指在屏幕上滑动,还有的事件代表你手指离开屏幕,这些事件的事件类型就分别为ACTION_DOWN,ACTION_MOVE,和ACTION_UP。上述这个动作所产生的一系列事件,被称为一个事件流,它包括一个ACTION_DOWN事件,很多个ACTION_MOVE事件,和一个ACTION_UP事件。

a.用户普通点击的事件行为
b.用户普通滑动的事件行为

因此只需记录用户ACTION_DOWN和ACTION_UP时的坐标即可,若两个坐标的x, y值相等,则为点击事件tap;若不相等则为滑动事件swipe。

最终的录制文件格式如下图:操作类型-坐标,保存为txt格式。

三、服务端

1.接口简介

a.路由/readCommond,传参为fileName,用来标识UI操作文件和待校验埋点数据文件;
b.定义埋点实体类如下:

2.需要注意的是操作录制文件和待检验埋点数据文件命名必须一致,根据接收到的fileName去查对应txt文件执行UI操作,再去查filename所对应的xlsx文件读取待校验埋点数据

  • 循环遍历读取txt操作文件,通过adb执行对应操作
  • 读取xslx文件获取待校验埋点数据,存到List<BurialPoint> pointList

3.异步处理埋点日志

调试的时候发现如果等待指令执行完成后再去处理埋点日志的话,会因为手机日志量大导致日志丢失,因此需要添加异步线程处理日志,这里使用CompletableFuture来创建一个异步线程

  • 为了可以在接口/readCommond返回日志埋点校验结果,通过future.get()获取异步线程的校验结果

4.循环校验埋点数据pointList中的每个埋点

5.将测试结果写到filename.excel文件内

四、使用方法

1、服务端部署在本地,因此需要先启动本地服务,再进行以下步骤:

a.手机安装app debug包,并且确保手机和电脑已连接,可以使用adb devices确认
b.浏览器内输入http://localhost:8080/readCommond?fileName=${filename},开始UI操作回放
c.接口返回有问题的埋点数据

2、保存测试结果到filename-result,详情如下:

展示评论