在做移动端稳定性测试的时候,Monkey 测试是首选的方案,但是在执行测试过程中也会存在问题。比如说,Monkey 测试是随机执行的,如果在执行过程中跳出了要执行的 App,打开的系统页面或是其他应用的页面。有的应用有地图页面,debug 包的话也会有 Debug 工具等,直接影响 Monkey 的执行结果。为了达到测试指定 App 的效果,希望 Monkey 在 App 内的页面上执行,是否有相应的方案呢?
通过在网上调研相关的技术,发现可以通过 adb shell am start ActiviyName 可以打开指定的页面。但是,出于安全考虑,正常开发的 App 是不能通过这个命令打开页面的,会报如下错误:
所以需要对被测试的 App 做修改,请参考:Andoird 开发调试时不修改 Manifest 直接启动任意 Activity 的方法(https://www.jianshu.com/p/54fd9627860agitlab 上下载一个可以运行 Android)。经过测试,从 App Demo,通过 Android Studio 打开项目,在 app 模块的 build.gradle 文件下的 android{}最后添加如下代码:
同时在最后添加:
// 启动android:exported="true"的Activity
task startExportedTestActivity(type: Exec, dependsOn: 'installDebug') {
commandLine 'cmd', '/c', 'adb', 'shell', 'am', 'start', '-n', 'cn.easydone.componentizationapp/com.linked.erfli.moduleb.news.NewsListActivity'
}
其中的 Activity 可以修改成你自己 App 的 Activity。重新打 debug 安装到手机上,就可以通过 adb shell am start 打开相应的页面。
在做 Monkey 测试的时候,肯定不能直接使用命令行的方式来执行。需要借助于自动化测试框架,如 Appium 来进行操作。这样做的好处是:1,可以为 Monkey 测试做一些准备操作,如构造测试数据,登录被测 App 等。2,监控 Monkey 的执行,如对执行过程进行截图,检测当前执行的页面等。
而要将 Monkey 在指定的页面下执行,可以按如下思路来处理:
1,设置页面白名单
通过配置文件或是常量来指定要覆盖的页面白名单,如下所示:
//文件名:Constant.java
//页面 Activity 白名单
public static String[] actlist={
"cn.easydone.componentizationapp/cn.easydone.componentizationapp.MainActivity",
"cn.easydone.componentizationapp/cn.easydone.modulea.LibraryActivity",
"cn.easydone.componentizationapp/com.linked.erfli.moduleb.news.NewsListActivity"
};
2,检测当前页面是否在白名单中
检测当前页面是否在白名单中,如果当前页面在白名单中,则继续执行 Monkey 测试,否则随机打开白名单中的一个页面。实现代码如下:
/**
* 如果当前页面不是指定的页面,启动app中的页面
* @param actname
*/
public void startActiviyInApp(String actname){
//System.out.println("当前页面是:"+actname);
String[] actlist= Constant.actlist;
List<String> activitylist= Arrays.asList(actlist);
//当前页面不是白名单中的页面
if(!activitylist.contains(actname))
{
int actindex=(int)(Math.random()*actlist.length);
//System.out.println("获取第:"+actindex+"个页面!");
String cmd = "adb -s " + Udid + " shell am start " + actlist[actindex];
LocalCommandLine.execute(cmd, 20000, true);
}
else
{
System.out.println("*****当前页面在指定页面范围中*******");
}
}
3,异步多线程启动 Monkey
在执行智能 Monkey 测试的时候,可以通过 java 编写多线程来进行执行。一个线程执行你设置的 Monkey 测试,如:
adb shell monkey -p com.jddl.rbr --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 100000
,让 Monkey 按指定的时间去执行。另外启动一个线程,去检测当前的 activity,对应的 adb 命令是:adb shell dumpsys window | grep mCurrentFocus,处理一下当前获取的页面内容。
根据你的测试需要,如每间隔 3 分钟检测一下,调用上面编写的函数,检测当前页面是否在白名单中,如果不在记随机启动白名单的页面,继续执行 Monkey 测试。从而实现控制 Monkey 在指定的页面范围中执行。
稳定性测试在移动端专项中占居重要位置,所以在不少移动测试平台中会集成智能 Monkey 测试。借助于一定的移动端测试框架,不管是开源的 Appium 还是公司对移动框架做的二次开发,实现对 Monkey 测试的封装,异步多线程去执行 Monkey 测试。结合公司产品的特点,做前置的数据准备,登录,或是其他操作是比较常规的手段。本文介绍了智能 Monkey 测试的一个使用场景,希望能给你带来帮助。