在做移动端稳定性测试的时候,Monkey测试是首选的方案,但是在执行测试过程中也会存在问题。比如说,Monkey测试是随机执行的,如果在执行过程中跳出了要执行的App,打开的系统页面或是其他应用的页面。有的应用有地图页面,debug包的话也会有Debug工具等,直接影响Monkey的执行结果。为了达到测试指定App的效果,希望Monkey在App内的页面上执行,是否有相应的方案呢?
一,修改测试App
通过在网上调研相关的技术,发现可以通过adb shell am start ActiviyName可以打开指定的页面。但是,出于安全考虑,正常开发的App是不能通过这个命令打开页面的,会报如下错误:
所以需要对被测试的App做修改,请参考:Andoird开发调试时不修改Manifest直接启动任意Activity的方法(https://www.jianshu.com/p/54fd9627860a)。经过测试,从gitlab上下载一个可以运行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测试用例
在做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测试的一个使用场景,希望能给你带来帮助。