埋点是在应用中特定的流程收集一些信息,用来跟踪应用使用的情况,后续用来进一步优化产品或是提供运营的数据支撑。
埋点重要,但埋点是否有效及正确与否,通过人工测试的方式是效率很低的,常用的方式就是人工操作APP,再通过抓包工具查看是否有埋点接口和参数上报,或者通过查询日志来查看数据是否被保存成功。如果能有一套自动化测试工具,就能极大提升效率,解放人力。
埋点主要有页面曝光和点击等几种类型。通过接口测试的方式基本是没办法测试的,于是考虑到使用APPUI自动化测试方法。
APPUI自动化测试的成本很高,测试环境搭建复杂,且因页面经常变化导致用例失败率较高也是个头疼的问题,很多公司都是中途就放弃开发了。不过考虑到我们只做核心点位的测试,用例数不会太多,主站APP的核心点位在100个以内,这样写用例和维护用例的代价还可以接受。
当前市面上比较流行的APP测试工具是Appium,且同时支持Android和iOS,所以做为首选。二期海拍客APP内置了录制和回放功能,上手容易且效率高,不足之处是复杂场景无法通过写代码做逻辑判断,适合写一些页面相对稳定,逻辑简单的用例。两者可互为补充。
海拍客有埋点数据管理平台redpill,点位经常会有增删改,通过人工去及时检查这些有改动的埋点是不可接受的。于是在redpill应用中额外增加了获取核心埋点的接口,UI测试平台中添加定时任务,每天自动把核心埋点同步过来。
Web端和Server端是部署在容器中的,无法直连和操作手机,于是新增了Client端,部署在连接了手机的物理机上,一边可与Server端通过restapi通信,一边可直接通过命令行的方式操作手机。
除了基本的增删改查功能外,主要介绍其他几个特性。
平台二期对接了使用海拍客APP内置的录制回放功能。平台需要能接收保存APP录制后传上来的脚本。
录制的脚本,本身没有功能描述信息,可以自行添加描述信息说明脚本对应的功能,便于关联用例。
除了用例可以关联脚本外,脚本管理界面也可以反向关联用例,并即时展示关联关系。
一个APP有上千个埋点,每天都有可能变化,人工维护基本是不可能的。平台添加了定时任务功能,每天自动从埋点数据平台同步海拍客APP的核心点位。
如果有些特殊的点位不属于核心,但根据需要仍需要覆盖用例的,平台也支持手动添加,且添加时只需要填写埋点字段,其他字段如模块、点位名、点位类型、是否核心等信息会帮你自动获取并保存。
iOS手机:因为iOSrelease版本只能通过AppStore下载安装,如果需要完全自动化测试,只能安装test版本。需要在连接的物理机上安装ideviceinstaller工具,使用“ideviceinstaller-i$filePath”安装下载的ipa文件。
设备Host:对应物理机的ip,平台支持部署多套物理机环境,每台物理机都可以连接若干台Android和iOS手机
设备选择:支持使用指定的手机执行测试。后续会添加设备管理模块,可支持自动选择可用的空闲手机执行测试
执行设备:手机序列号,主要用途是用adb连接手机进行版本安装,及appium需要用其执行测试
UI自动化测试,经常会因为网络问题导致预期的页面还未加载完成,或者获取页面元素时失败,为了增强整个测试任务的稳定性,对每条用例都添加了失败重试功能。默认设置3次,只有该用例连续三次都执行失败时才标记为失败。
若某个场景配置的手机是空闲状态,该场景显示执行按钮,点击可开始测试。测试完成后,会显示用例数统计。
真机测试和虚拟机比,相对不太稳定,可能因为物理机ip变化、误碰了数据线导致连接断开、手机系统原因导致连接不上等原因,无法测试。此时就需要有个能监控设备在线状态的功能。
对于Android设备来说,使用adbdevices能方便的知道设备连接状态,但iOS手机就没这么直接能通过命令行的方式去检查。而且还有个问题,真机测试需要在物理机上部署Appium、xCode等多个程序,这些程序如果有问题,也会导致无法测试。
想到Appium本身有连接真机的功能,能否利用这个特性来开发一个自动监控的工具呢?
利用目前的场景执行功能,稍加改造就能达到。
Appium框架支持用Java或Python语言编写和执行用例,用例代码以文件的形式保存在代码所在工程中,测试时编译运行是可以的。但如果需要能让测试平台保存和维护这些用例代码,同时通过平台能触发这些用例执行呢?我们引入了Groovy。
用到的工具类:UIUtil(封装了Appium对APP的操作方法),LogUtil(封装了日志操作),PointUtil(封装了埋点验证方法)
//获取GroovyShell对象的contextBindingbinding=context.getGroovyShell().getContext();//封装用例用到的变量Map
privatevoidexeGroovyShell(GroovyShellgroovyShell,Stringscript){Classclazz=testScriptAO.parseScriptClass(script,groovyShell.getClassLoader());ObjectvalidResult=InvokerHelper.createScript(clazz,groovyShell.getContext()).run();AssertUtil.isTrue(validResult==null||((Boolean)validResult),"校验失败,结果为false");}用例示例执行Groovy脚本时就可以通过绑定的Java对象做各种操作,并把结果返回给测试平台。
iOS使用APP自带的录制工具录制脚本后,通过命令ios-deploy-L-b./Payload/*.app--args"taskId=$1"可以回放成功。但是发现每条用例执行都需要一分钟以上。
一次任务包含许多用例,是不需要每条用例都重新安装app的。于是首先考虑到的就是安装步骤和执行用例步骤分离开。
于是沟通后由开发在安装命令和执行用例命令上,均添加exit=1参数,这样重新安装版本后app自动退出,每次执行用例后app也自动退出,不会影响下条用例的执行。
因平台现在是支持通过Appium执行用例和回放由APP录制的用例两种方式的,把两种用例放到一个任务中执行时,会偶现执行失败。后发现一种情况,当先回放用例后,再执行Appium的用例,就会提示session创建失败。
目前为止,埋点测试用例已完成了130+条,覆盖核心埋点90+个,有效的保证了埋点上报功能的有效性。
APPUI测试平台除了验证埋点是否正常上报外,还可以模拟真实用户针对其他的主要场景进行测试,是单元测试、接口测试的有效补充。平台支持的Appium脚本编写及录制回放两种方式互为补充,有效保证了用例编写的效率及执行的稳定性。
web端和APP端UI自动化测试是现在很多公司使用较多的UI测试类型,随着海拍客在小程序端的发力,接下来小程序端UI自动化测试平台也已规划并在开发中。