android java 调试工具_【网易云捕技术分享】Android自动化测试工具实现简述

前言

自动化测试在产品开发和测试中都有着非常重要的作用。在产品开发阶段,可靠又重复性地运行以确保没有引进回归问题;在产品测试阶段,可以节省人力成本和时间成本,并能保证更大范围的覆盖。Android自动化测试工具同样可以节省不少人力和时间成本,对其研究和实现对于提高测试效率具有一定的意义。目前市面上也有不少Android自动化测试工具,本人在现有工具的基础上,加上自己的理解和实践向大家介绍自动化测试工具的原理和实现。

了解自动化测试的一定对Robotium并不陌生,Robotium是一款国外的Android自动化测试框架,提供APK录制和播放相关的API,不仅可以获取APK运行时view相关的数据,还能模拟点击、输入、滑动等等操作,本文的自动化测试工具是基于Robotium的二次开发。

自动化测试工具大体上可以分为录制、播放、测试APK生成三部分,下面将通过分别介绍这三部分原理和实现。

一、录制模块 录制模块,顾名思义为录下APK所有界面操作,并保存相应的操作过程,包括延时、点击、输入、滑动等。下面以“邮箱大师”登陆为例讲述主要的技术。

1 、遍历所有view

使用“uiautomatorviewer”工具,可以查看当前界面所有的view,同样可以使用Robotium提供的API获取当前所有view,然后遍历所有view,对不同的view做相应的操作。

2 、view事件的监听

根据view的不同,选择不同的侦听方法,view包括EditText、ExpandableListView、WebView、Button等等,最后获取相应的测试代码。监听方法:获取并保存原始的view监听器,然后为view注册新的监听器,继承原始监听器,并实现相应的录制功能。

若为EditText,则添加TextWatcher 监听文本变化,并记录下对应edittext的index、text、resource-id等信息。

若为登陆Button,则添加点击监听事件,获取所有点击事件,并记录下当前resource-id、class、text等信息。

监听所有的view,当监听事件触发时,保存当前view信息,最后可以更好的根据获取的录制信息,播放相应的录制事件。

3 、view的查找

在实际的录制中,并不是所有的view都能获取到“resource-id”,因此需要通过记录其他信息,以便播放时查找到正确的view。

1)resource-id,id信息是最好的标示view的方法

2)familyString,在id无法获取或者无法定位的情况下,可以通过查找该view家庭关系链(view在其父view的index,然后父 view的父view,直到父view为null)反向获取正确的view。

3)textName,在以上方法都失效的情况下,可以通过view的text文本字符串查找view。

4)坐标,在所有方法均无法定位的情况下,可以通过坐标去定位,这样就不能兼容不同的分辨率。

4 、录制脚本生成

通过监听所有的view的操作,最后生成一个记录了所有操作的脚本文件,用于播放测试。

sleep(1000);

dragPercent(0.2515625f, 0.2515625f, 0.2107381f, 0.2107381f, 4);

sleep(7921);

enterText(0, "xxxx@163.com", false,"id/editor_email");

sleep(1298);

dragPercent(0.40390626f, 0.40390626f, 0.25851882f, 0.25851882f, 4);

sleep(7796);

enterText(1, "xxxxxxxx", false,"id/editor_password");

sleep(5690);

clickOn("id/button_login", "0", false);

二、播放模块

根据录制的脚本文件,使用测试apk生成工具,即可生成一个播放apk,用于控制目标apk按照脚本一步一步的执行。

与录制模块中获取view相关的信息是反过程,播放模块是根据脚本中的view信息找到对应的view。播放用很多操作,包括dragPercent,clickOn,scrollListToLine,scrollScrollViewTo,enterText,clickOnExpandableListView,clickInList,sendKey,sleep等等。

若为“dragpercent”滑动操作,则可以直接调用Robotium中滑动的api:public void drag(float fromX, float toX, float fromY, float toY, int stepCount),实现从X点滑动到Y点,并定义了速度等级。滑动的播放在实际处理中也存在不少问题,特别是在一些翻页操作中,滑动的快慢直接影响到滑动几个页面,因此录制时速度确定也很关键。

若为clickOn点击,则可通过参数获取获取到view,然后调用performClick模拟点击,clickOn("id/button_login", "0", false),Robotium提供根据id获取view的api,当然也可以通过familyString和className来获取目标view,例如clickOn("android.widget.FrameLayout", "4-0-1-1-0-0-0-1-0-1-0-0-0-0-1", true);这样通过familyString反向查找。只要定位到view,就可以完成点击或者长按等操作。

对于view的获取除了上面已经提到的id,familyString,还有index还有文本等,在Robotium中有相关的api,因此在录制时可尽量多的保存view相关的信息,以便在播放时更容易的查找到对应的view。

若为clickInList列表点击,clickInList(position, resourceId),则需要先根据resource-id或者familyString找到listview的view,然后通过position选择对应的postion,最后调用performClick,即可点击对应list的列表。

还有其他一些操作,均可通过调用Robotium提供的API或者view方法去实现,在此不一一列举。

三、测试APK生成工具

录制模块生成脚本,播放模块根据脚本播放相应操作,但录制apk怎么生成,录制生成的脚本怎么添加到播放模块中呢?测试APK生成工具就能解决这些问题。

由于自动化测试工具是基于Robotium的,Robotium又是基于Instrumentation的二次封装,因此关联测试APK和目标APK,需要目标APK和测试APK使用相同的签名。测试APK分为录制APK和播放APK,显然录制和播放的APK逻辑不同,本人实现的测试APK均基于recordreplay.apk修改而来,此APK实现了所有录制和播放相关的逻辑,只需要修改AndroidManifest.xml和com.mytest.recordreplay.RecordReplay.java文件即可生成不同的录制和播放APK。

修改AndroidManifest.xml和java文件的方法是先将recordreplay.apk使用apktool工具反编译为xml和smali,然后修改AndroidManifest.xml和com.mytest.recordreplay.RecordReplay.smali文件,再编译成具体功能的recordreplay.apk,最后使用目标apk签名文件进行签名。

1、 AndroidManifest.xml

基于Instrumentation均需要在AndroidManifest.xml做相应的申明。

android:targetPackage="com.test.target" /> 同时,还需在Application标签中嵌入如下声明:

只需要根据目标APK的包名修改android:targetPackage的值“com.test.target”就可以完成AndroidManifset.xml文件的修改。

2、 录制RecordReplay.java

录制APK的核心文件RecordReplay.java,只需要修改下“LAUNCHER_ACTIVITY_FULL_CLASSNAME”即可完成对不同APK的处理。如下为一个录制RecordReplay.java的demo。

public class RecordReplay extends TestCase {

private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = " com.test.target.main ";

private static Class> launcherActivityClass;

static {

try {

launcherActivityClass = Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);

} catch (ClassNotFoundException e) {

throw new RuntimeException(e);

}

}

public RecordReplay () {

super(launcherActivityClass);

}

@Override

protected void setUp() throws Exception{

super.setUp();

}

@Override

protected void tearDown() throws Exception{

super.tearDown();

}

public void test_StartRecord() {

baserecordreplay.beginRecordCode();

try {

Thread.sleep(10000000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

3、 播放RecordReplay.java

播放APK的核心文件RecordReplay.java,需要修改“LAUNCHER_ACTIVITY_FULL_CLASSNAME”为目标APK的启动Activity,然后根据录制模块中获取到的脚本文件,转化为方法“testRecorded”,同时可以在每个关键操作函数间添加截图函数,这样可以清楚的看到每一步的状态,当然也可以根据需求,手动编写相应的逻辑。如下为播放APK的demo。

public class RecordReplay extends TestCase {

private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = " com.test.target.main ";

private static Class> launcherActivityClass;

static {

try {

launcherActivityClass = Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);

} catch (ClassNotFoundException e) {

throw new RuntimeException(e);

}

}

public RecordReplay () {

super(launcherActivityClass);

}

@Override

protected void setUp() throws Exception{

super.setUp();

}

@Override

protected void tearDown() throws Exception{

super.tearDown();

}

public void testRecorded() {

baserecordreplay.sleep(1000);

baserecordreplay.screenShotNamed ("0");

baserecordreplay.recordReplay.dragPercent(0.2515625f, 0.2515625f, 0.2107381f, 0.2107381f, 4);

baserecordreplay.sleep(7921);

baserecordreplay.screenShotNamed ("1");

baserecordreplay.enterText(0, "xxxx@163.com", false,"id/editor_email");

baserecordreplay.sleep(1298);

baserecordreplay.screenShotNamed ("2");

baserecordreplay.recordReplay.dragPercent(0.40390626f, 0.40390626f, 0.25851882f, 0.25851882f, 4);

baserecordreplay.sleep(7796);

baserecordreplay.screenShotNamed ("3");

baserecordreplay.enterText(1, "xxxxxxxx", false,"id/editor_password");

baserecordreplay.sleep(5690);

baserecordreplay.screenShotNamed ("4");

baserecordreplay.recordReplay.clickOn("id/button_login", "0", false);

baserecordreplay.sleep(3000);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码下载:完整代码,可直接运行 ;运行版本:2022a或2019b或2014a;若运行有问题,可私信博主; **仿真咨询 1 各类智能优化算法改进及应用** 生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化 **2 机器学习和深度学习方面** 卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断 **3 图像处理方面** 图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知 **4 路径规划方面** 旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化 **5 无人机应用方面** 无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配 **6 无线传感器定位及布局方面** 传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化 **7 信号处理方面** 信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化 **8 电力系统方面** 微电网优化、无功优化、配电网重构、储能配置 **9 元胞自动机方面** 交通流 人群疏散 病毒扩散 晶体生长 **10 雷达方面** 卡尔曼滤波跟踪、航迹关联、航迹融合

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值