Monkey也许是测试人想要接触自动化测试或是其它技术测试都要先学习的一个工具吧。当然我自己也是这样,虽然学得不多,但是总觉得可以记下来方便自己以后整理。Moneky很单独使用比较简单,但是moneky、monkeyrunner与其它语言配合使用功能很强大的。哈哈,当然那是后话,先记下moneky得一点小知识吧。
1、 moneky 安装
monkey安装实际为Android测试环境搭建,在android搭建好后,执行adb shell 可以验证安装是否成功。(具体怎么样执行了就知道了-_-!)
2、 monkey 命令使用说明
a. 针对某个应用执行monkey命令(如Ctrip app):
adb shell monkey –p ctrip.android.view500
-p 指定手机中的某一应用名称,ctrip.android.view为携程APP包名,500为随机操作500次。
(如果不知道手机中应用包名,可依次执行已下命令可查询到:
adb shell > cddata > cd data > ls )
b. 针对某个应用间隔一段时间随机操作一次(如Ctripapp):
adb shell monkey –pctrip.android.view --throttle 100 500
--throttle 表示执行monkey事件的间隔时间
c.执行moneky时,查看执行的具体操作
adb shell monkey –pctrip.android.view --throttle 100 –v-v-v 500
-v表示打印信息的详细级别,每加一个-v级别越高
d. 执行monkey时,有时候想重复上一次执行的随机事件,可以使用seed值。
如:第一次执行:
adb shell monkey –p ctrip.android.view --throttle100 –s 1314 –v-v-v 500
第二次执行为:
adb shell monkey –p ctrip.android.view --throttle 100 –s 1314 –v-v-v 500
-s为seed的命令。当然也可以在第一次执行monkey时不添加seed值,在执行结束后可以在log中查找到seed值,在第二次执行时加入一样的seed值就可以。
e.存储monkey执行log
adb shell monkey –pctrip.android.view --throttle 100 –v-v-v 500>> D:\log.txt
>>加路径表示log存储的地方
3、 问题定位
在执行完monkey后,打开log搜索crash就可以判断应用是否发出过crash了。Monkey log比较强大,它可以大致定位到有问题的代码位置,应用的断网时间等。
常见问题:
1)、空指针“java.lang.NullPointerException”,手动很难重现
2)、内存溢出“java.lang.OutOfMemoryError”,页面分页加载和图片较多的地方出现可能性较大
3)、点击后crash,只要定位到位置,一般都可以手动重现
附常见3中crash类型:
###########空指针##########
// CRASH: com.android.ctrip.gs (pid 3984)
// Short Msg:java.lang.NullPointerException
// Long Msg:java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.android.ctrip.gs.ui.specialprice.b.b$c.equals
(java.lang.Object)' on a null objectreference
// Build Label:samsung/ja3gzc/ja3g:5.0.1/LRX22C/I9500ZCUJOA3:user/release-keys
// Build Changelist: I9500ZCUJOA3
// Build Time: 1421317162000
// java.lang.NullPointerException: Attemptto invoke virtual method 'booleancom.android.ctrip.gs.ui.specialprice.b.b$c.equals
(java.lang.Object)' on a null objectreference
// atcom.android.ctrip.gs.ui.specialprice.b.l.a(GSSpecialPriceSeletedWindow.java:495)
// atcom.android.ctrip.gs.model.api.a.a(GSApiCallback.java:45)
// atcom.android.ctrip.gs.model.api.d.failure(GSRetrofitCallback.java:50)
// atretrofit.CallbackRunnable$2.run(CallbackRunnable.java:53)
// atandroid.os.Handler.handleCallback(Handler.java:739)
// atandroid.os.Handler.dispatchMessage(Handler.java:95)
// atandroid.os.Looper.loop(Looper.java:145)
// atandroid.app.ActivityThread.main(ActivityThread.java:5944)
// atjava.lang.reflect.Method.invoke(Native Method)
// atjava.lang.reflect.Method.invoke(Method.java:372)
// atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
// atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
############内存溢出#############
/ CRASH: com.android.ctrip.gs (pid 27684)
// Short Msg: java.lang.OutOfMemoryError
// Long Msg: java.lang.OutOfMemoryError:Failed to allocate a 793612 byte allocation with 397352 free bytes and 388KBuntil OOM
// Build Label:samsung/ja3gzc/ja3g:5.0.1/LRX22C/I9500ZCUJOA3:user/release-keys
// Build Changelist: I9500ZCUJOA3
// Build Time: 1421317162000
// java.lang.OutOfMemoryError: Failed toallocate a 793612 byte allocation with 397352 free bytes and 388KB until OOM
// at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
// at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
// at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:747)
// atandroid.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:568)
// atandroid.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1014)
// atandroid.content.res.Resources.loadDrawableForCookie(Resources.java:3730)
// at android.content.res.Resources.loadDrawable(Resources.java:3603)
// at android.content.res.Resources.getDrawable(Resources.java:1852)
// at android.content.res.Resources.getDrawable(Resources.java:1818)
// at com.f.a.b.c.c(DisplayImageOptions.java:142)
// at com.f.a.b.k.run(LoadAndDisplayImageTask.java:348)
// at android.os.Handler.handleCallback(Handler.java:739)
// at android.os.Handler.dispatchMessage(Handler.java:95)
// at android.os.Looper.loop(Looper.java:145)
// at android.app.ActivityThread.main(ActivityThread.java:5944)
// at java.lang.reflect.Method.invoke(Native Method)
// at java.lang.reflect.Method.invoke(Method.java:372)
// atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
// /
// CRASH: com.android.ctrip.gs (pid 10793)
// Short Msg: java.lang.OutOfMemoryError
// Long Msg: java.lang.OutOfMemoryError:OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack available
// Build Label:samsung/ja3gzc/ja3g:5.0.1/LRX22C/I9500ZCUJOA3:user/release-keys
// Build Changelist: I9500ZCUJOA3
// Build Time: 1421317162000
// java.lang.OutOfMemoryError:OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stackavailable
//
############百度地图,没有安装####
// CRASH: com.android.ctrip.gs (pid 7905)
// Short Msg:android.content.ActivityNotFoundException
// Long Msg:android.content.ActivityNotFoundException: No Activity found to handle Intent {act=android.intent.action.VIEW
dat=bdapp://map/direction?origin=latlng:31.219932,121.358215|name:褰撳墠浣嶇疆&destination=latlng:29.1253128051758,116.277709960938|name:涔濇睙
涓庡崡鏄屼箣闂寸殑闀挎睙涓父鍗楀哺&mode=driving&coord_type=gcj02&src=ctrip|ctripWiresspkg=com.baidu.BaiduMap }
// Build Label: samsung/ja3gzc/ja3g:5.0.1/LRX22C/I9500ZCUJOA3:user/release-keys
// Build Changelist: I9500ZCUJOA3
// Build Time: 1421317162000
//android.content.ActivityNotFoundException: No Activity found to handle Intent {act=android.intent.action.VIEW dat=bdapp://map/direction?
origin=latlng:31.219932,121.358215|name:褰撳墠浣嶇疆&destination=latlng:29.1253128051758,116.277709960938|name:涔濇睙涓庡崡鏄屼箣闂寸殑闀挎睙涓
父鍗楀哺&mode=driving&coord_type=gcj02&src=ctrip|ctripWiresspkg=com.baidu.BaiduMap }
// at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1801)
// atandroid.app.Instrumentation.execStartActivity(Instrumentation.java:1499)
// at android.app.Activity.startActivityForResult(Activity.java:3942)
// at android.app.Activity.startActivityForResult(Activity.java:3889)
// atandroid.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:817)
// at android.app.Activity.startActivity(Activity.java:4213)
// at android.app.Activity.startActivity(Activity.java:4181)
// at com.android.ctrip.gs.ui.util.z.a(GSNavigationUtil.java:128)
// at com.android.ctrip.gs.ui.util.aa.a(GSNavigationUtil.java:315)
// atcom.android.ctrip.gs.ui.widget.dialog.c.onClick(GSAlertDialog.java:188)
// at android.view.View.performClick(View.java:5191)
// at android.view.View$PerformClick.run(View.java:21036)
// at android.os.Handler.handleCallback(Handler.java:739)
// at android.os.Handler.dispatchMessage(Handler.java:95)
// at android.os.Looper.loop(Looper.java:145)
// atandroid.app.ActivityThread.main(ActivityThread.java:5944)
// at java.lang.reflect.Method.invoke(Native Method)
// at java.lang.reflect.Method.invoke(Method.java:372)
// at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)