天天看點

Android測試-Monkey Test

APP開發過程中,開人員往往自己做一些功能測試和穩定性測試,使用MonkeyTest做壓力測試是常用方法,及時修複ANR、CRASH提高項目組整體的開發效率。

一、Monkey簡介

Monkey是一種指令行工具,這個工具存在于Android系統/system/framework/monkey.jar,Android裝置/模拟器連接配接到PC後通過adb shell使用此工具,monkey測試流程如下。

Android測試-Monkey Test

是以兩種方式使用monkey,第一種在PC端直接運作指令行:

adb shell monkey --[params]
           

第二種進入shell中使用:

adb shell

> [email protected]: monkey --[params]
           

二、基本使用

使用如下指令進行monkey測試:

adb shell monkey -p org.blackist.modulize --throttle 100 -v -v 100 > test.log

           
  • -p org.blackist.modulize:測試包名為org.blackist.modulize
  • –throttle 100:每100ms發送一次事件
  • -v -v:指定日志級别
  • > test.log:輸出日志到檔案

如下是monkey日志中測試到的ANR和CRASH:

Sleeping for 100 milliseconds
:Sending Key (ACTION_DOWN): 23    // KEYCODE_DPAD_CENTER
// CRASH: cn.edu.zstu.sdmp (pid 17698)
// Short Msg: java.lang.NullPointerException
// Long Msg: java.lang.NullPointerException: Attempt to invoke virtual method 'com.wuhenzhizao.titlebar.widget.CommonTitleBar cn.edu.zstu.sdmp.manage.view.ManageActivity.getCommonTitle()' on a null object reference
// Build Label: vivo/PD1603/PD1603:5.1.1/LMY47V/compiler07131528:user/release-keys
// Build Changelist: eng.compiler.20180713.152451
// Build Time: 1531466945000
// java.lang.NullPointerException: Attempt to invoke virtual method 'com.wuhenzhizao.titlebar.widget.CommonTitleBar cn.edu.zstu.sdmp.manage.view.ManageActivity.getCommonTitle()' on a null object reference
//      at cn.edu.zstu.sdmp.manage.view.repair.RepairDetailFragment.initView(RepairDetailFragment.java:153)
//      at cn.edu.zstu.sdmp.manage.view.repair.RepairDetailFragment.initViewAndData(RepairDetailFragment.java:113)
//      at cn.edu.zstu.sdmp.common.base.BaseFragment.onCreateView(BaseFragment.java:135)
//      at android.support.v4.app.Fragment.performCreateView(Fragment.java:2354)
//      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1419)
//      at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740)
//      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1809)
//      at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799)
//      at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2580)
//      at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2367)
//      at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2322)
//      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2229)
//      at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:700)
//      at android.os.Handler.handleCallback(Handler.java:739)
//      at android.os.Handler.dispatchMessage(Handler.java:95)
//      at android.os.Looper.loop(Looper.java:135)
//      at android.app.ActivityThread.main(ActivityThread.java:5418)
//      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:1037)
//      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
//
// NOT RESPONDING: cn.edu.zstu.sdmp (pid 17698)
ANR in cn.edu.zstu.sdmp (cn.edu.zstu.sdmp/.manage.view.ManageActivity)
PID: 17698
Reason: Input dispatching timed out (Waiting to send key event because the focused window has not finished processing all of the input events that were previously delivered to it.  Outbound queue length: 0.  Wait queue length: 1.)

           

可以清楚分析出錯誤所在的地方,是以monkey是個物美價廉的測試工具啊~

三、參數說明

monkey工具參數如下(圖檔來源):

Android測試-Monkey Test

3.1 基礎參數

-p <允許的包名清單>

用此參數指定一個或多個包。指定包之後,monkey将隻允許系統啟動指定的app。如果不指定包, monkey将允許系統啟動裝置中的所有app。

指定一個包:adb shell monkey -p org.blackist.modulize 100

指定多個包:adb shell monkey -p org.blackist.modulize –p org.blackist.brouter 100

-v

用亍指定回報資訊級别(資訊級别就是日志的詳細程度),總共分3個級别,分别對應的參數如下:

Level 0 : adb shell monkey -p org.blackist.modulize -v 100 // 預設值,僅提供啟動提示、測試完成和最終結果等少量資訊

Level 1 : adb shell monkey -p org.blackist.modulize -v -v 100 // 提供較為詳細的日志,包括每個發送到Activity的事件資訊

Level 2 : adb shell monkey -p org.blackist.modulize -v -v -v 100 // 最詳細的日志,包括了測試中選中/未選中的Activity資訊

一般來說,使用Level0即可。

-s (随機數種子)

用亍指定僞随機數生成器的seed值,如果seed相同,則兩次Monkey測試所産生的事件序列也相同的。 示例:

monkey測試1:adb shell monkey -p org.blackist.modulize –s 101 100

monkey測試2:adb shell monkey -p org.blackist.modulize –s 101 100

這個參數其實比較重要,比如我們隻看日志不容易确定錯誤位置,需要結合monkey的UI測試過程,這時需要執行相同的随機序列複現步驟。

–throttle (延時ms)

用亍指定使用者操作(即事件)間的時延,機關是毫秒;如果不指定這個參數,monkey會盡可能快地生成和發送消息。 示例:

adb shell monkey -p org.blackist.modulize --throttle 3000 100

3.2 發送的事件類型

–pct-touch (點選事件)

參數percent為此事件的百分比,比如要求monkey完成10次點選事件:

adb shell monkey -p org.blackist.modulize -v --pct-touch 100 10
           

可以看到如下日志,Event percentages是事件百分比,點選事件100%,其餘都是0:

:Monkey: seed=1552849997195 count=10
:AllowPackage: cn.edu.zstu.sdmp
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Event percentages:
//   0: 100.0%
//   1: 0.0%
//   2: 0.0%
//   3: 0.0%
//   4: -0.0%
//   5: 0.0%
//   6: 0.0%
//   7: 0.0%
//   8: 0.0%
//   9: 0.0%
//   10: 0.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=cn.edu.zstu.sdmp/.main.view.SplashActivity;end
    // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.edu.zstu.sdmp/.main.view.SplashActivity } in package cn.edu.zstu.sdmp
           

–pct-motion (動作事件)

–pct-trackball (軌迹球事件)

–pct-nav (基本導航事件,輸入裝置的上、下、左、右)

–pct-majornav (主要導航事件,相容中間鍵,傳回鍵,菜單按鍵)

–pct-syskeys (系統導航事件,HOME、BACK及撥号音量鍵)

–pct-appswitch (啟動App事件)

–pct-anyevent (不常用事件)

–ignore-crashes (忽略崩潰事件 CRASH)

–ignore-timeouts (忽略逾時事件 ANR)

日志分析

monkey test 執行後分析儲存的日志,可以搜尋CRASH、ANR、Exception等關鍵字檢視錯誤資訊,詳細的日志分析參考http://www.cnblogs.com/wfh1988/archive/2010/11/16/1878224.html

參考

https://yuti.site/2019/03/02/MonkeyTesting/?tdsourcetag=s_pctim_aiomsg

https://www.cnblogs.com/TankXiao/p/4815134.html

https://blog.csdn.net/gzh0222/article/details/6631988

https://blog.csdn.net/viewsky11/article/details/53889143

https://www.cnblogs.com/TankXiao/p/4815134.html

https://blog.csdn.net/MTbaby/article/details/78792215

(完)