monkey并不算自动化测试,它的原理就是到处乱点,帮我们发现程序崩溃bug,并不能发现流程逻辑上面的漏洞。
使用总结:
1、使用小米手机时,总是测试失败,需要打开USB调试(安全设置),如下图:
2、最简单应用,测试指定包名的应用
E:\SVN\target\xxx>adb shell monkey -p 包名 -v 10
:Monkey: seed=1499203165061 count=10
:AllowPackage: 包名
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Event percentages:
// 0: 15.0%
// 1: 10.0%
// 2: 2.0%
// 3: 15.0%
// 4: -0.0%
// 5: -0.0%
// 6: 25.0%
// 7: 15.0%
// 8: 2.0%
// 9: 2.0%
// 10: 1.0%
// 11: 13.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=包名/.init.ActivityLoading;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=包名/.init.ActivityLoading } in package 包名
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=包名/.init.ActivityLoading } in package 包名
:Sending Touch (ACTION_DOWN): 0:(953.0,1467.0)
:Sending rotation degree=0, persist=false
可以看到信息很简单,甚至连Monkey finished都没有,使用-v -v -v可以输出详细信息。
E:\SVN\target\xxx>adb shell monkey -p 包名 -v -v -v 10
:Monkey: seed=1499202844204 count=10
:AllowPackage: 包名
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Selecting main activities from category android.intent.category.LAUNCHER
// - NOT USING main activity com.android.contacts.activities.PeopleActivity (from package com.android.contacts)
// - NOT USING main activity com.android.contacts.activities.TwelveKeyDialer (from package com.android.contacts)
// - NOT USING main activity com.android.camera.Camera (from package com.android.camera)
// - NOT USING main activity com.miui.gallery.activity.HomePageActivity (from package com.miui.gallery)
// - NOT USING main activity com.android.mms.ui.MmsTabActivity (from package com.android.mms)
// - NOT USING main activity com.android.settings.MainSettings (from package com.android.settings)
// - NOT USING main activity com.android.deskclock.DeskClockTabActivity (from package com.android.deskclock)
// - NOT USING main activity com.android.email.activity.Welcome (from package com.android.email)
// - NOT USING main activity com.miui.notes.ui.NotesListActivity (from package com.miui.notes)
// - NOT USING main activity com.android.thememanager.ThemeResourceTabActivity (from package com.android.thememanager)
// - NOT USING main activity com.mipay.wallet.ui.MipayEntryActivity (from package com.mipay.wallet)
// - NOT USING main activity com.android.calendar.homepage.AllInOneActivity (from package com.android.calendar)
// - NOT USING main activity com.miui.calculator.cal.CalculatorActivity (from package com.miui.calculator)
// - NOT USING main activity com.miui.weather2.ActivityWeatherMain (from package com.miui.weather2)
// - NOT USING main activity com.android.fileexplorer.FileExplorerTabActivity (from package com.android.fileexplorer)
// - NOT USING main activity com.xiaomi.market.ui.MarketTabActivity (from package com.xiaomi.market)
// - NOT USING main activity com.xiaomi.scanner.app.ScanActivity (from package com.xiaomi.scanner)
// - NOT USING main activity com.android.browser.BrowserActivity (from package com.android.browser)
// - NOT USING main activity com.xiaomi.jr.CTAActivity (from package com.xiaomi.jr)
// - NOT USING main activity com.miui.securityscan.MainActivity (from package com.miui.securitycenter)
// - NOT USING main activity com.android.stk.StkMain (from package com.android.stk)
// - NOT USING main activity com.miui.virtualsim.ui.MainActivity (from package com.miui.virtualsim)
// - NOT USING main activity com.miui.bugreport.ui.MainTabActivity (from package com.miui.bugreport)
// - NOT USING main activity com.miui.fmradio.FmActivity (from package com.miui.fm)
// - NOT USING main activity com.miui.compass.CompassActivity (from package com.miui.compass)
// - NOT USING main activity com.android.soundrecorder.SoundRecorder (from package com.android.soundrecorder)
// - NOT USING main activity com.android.updater.MainActivity (from package com.android.updater)
// - NOT USING main activity com.xiaomi.account.ui.AccountSettingsActivity (from package com.xiaomi.account)
// - NOT USING main activity com.miui.player.ui.MusicBrowserActivity (from package com.miui.player)
// - NOT USING main activity com.xiaomi.gamecenter.ui.MainTabActivity (from package com.xiaomi.gamecenter)
// - NOT USING main activity com.miui.voiceassist.CTAAlertActivity (from package com.miui.voiceassist)
// - NOT USING main activity com.android.providers.downloads.ui.DownloadList (from package com.android.providers.downloads.ui)
// - NOT USING main activity com.miui.video.HomeActivity (from package com.miui.video)
// - NOT USING main activity com.ht.xinge.MainActivity (from package com.ht.xinge)
// - NOT USING main activity com.ht.test.MainActivity (from package com.ht.test)
// - NOT USING main activity com.keniu.security.main.MainActivity (from package com.cleanmaster.mguard_cn)
// - NOT USING main activity com.hiten.hec.initAct (from package com.hiten.epc)
// - NOT USING main activity com.duokan.reader.DkReaderActivity (from package com.duokan.reader)
// - NOT USING main activity com.mi.vtalk.business.MiVTalkMainActivity (from package com.mi.vtalk)
// - NOT USING main activity com.tencent.mobileqq.activity.SplashActivity (from package com.tencent.mobileqq)
// - NOT USING main activity com.ht.testtouch.MainActivity (from package com.ht.testtouch)
// - NOT USING main activity com.hiten.ble.LoginAct (from package com.hiten.ble)
// - NOT USING main activity com.getui.demo.GetuiSdkDemoActivity (from package com.getui.demo)
// - NOT USING main activity com.ht.websocket.MainActivity (from package com.ht.websocket)
// - NOT USING main activity com.qiyi.video.WelcomeActivity (from package com.qiyi.video)
// - NOT USING main activity com.ht.amap.MainActivity (from package com.ht.amap)
// - NOT USING main activity com.sina.weibo.SplashActivity (from package com.sina.weibo)
// - NOT USING main activity com.yidian.xiaomi.ui.guide.UserGuideActivity (from package com.yidian.xiaomi)
// - NOT USING main activity com.ximalaya.ting.android.activity.account.WelComeActivity (from package com.ximalaya.ting.android)
// - NOT USING main activity com.github.florent37.beautifulparallax.sample.MainActivity (from package com.github.florent37.beautifulparallax.sample)
// - NOT USING main activity com.xiaomi.mitv.phone.remotecontroller.HoriWidgetMainActivityV2 (from package com.duokan.phone.remotecontroller)
// - NOT USING main activity com.xiaomi.shop.activity.MainTabActivity (from package com.xiaomi.shop)
// - NOT USING main activity com.xiaomi.smarthome.SmartHomeMainActivity (from package com.xiaomi.smarthome)
// - NOT USING main activity com.xiaomi.o2o.activity.O2OTabActivity (from package com.xiaomi.o2o)
// - NOT USING main activity com.xiaomi.channel.ui.ChannelLauncherActivity (from package com.xiaomi.channel)
// - NOT USING main activity com.wali.live.main.LiveMainActivity (from package com.wali.live)
// - NOT USING main activity com.autonavi.map.activity.SplashActivity (from package com.autonavi.minimap)
// - NOT USING main activity cn.wps.moffice.documentmanager.PreStartActivity (from package cn.wps.moffice_eng)
// - NOT USING main activity com.mqunar.splash.SplashActivity (from package com.Qunar)
// + Using main activity xxx.init.ActivityLoading (from package xxx)
// Selecting main activities from category android.intent.category.MONKEY
// - NOT USING main activity com.miui.mipub.ui.cvlist.ConversationListActivity (from package com.miui.mipub)
// - NOT USING main activity com.miui.home.launcher.Launcher (from package com.miui.home)
// - NOT USING main activity com.mipay.wallet.ui.MipayEntryActivity (from package com.mipay.wallet)
// - NOT USING main activity com.xiaomi.payment.MiliCenterEntryActivity (from package com.xiaomi.payment)
// - NOT USING main activity com.miui.virtualsim.monkeyentry.MonkeyActivity (from package com.miui.virtualsim)
// - NOT USING main activity com.xiaomi.vip.ui.monkeyentry.MonkeyActivity (from package com.xiaomi.vip)
// Seeded: 1499202844204
// Event percentages:
// 0: 15.0%
// 1: 10.0%
// 2: 2.0%
// 3: 15.0%
// 4: -0.0%
// 5: -0.0%
// 6: 25.0%
// 7: 15.0%
// 8: 2.0%
// 9: 2.0%
// 10: 1.0%
// 11: 13.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=xxx/.init.ActivityLoading;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=xxx/.init.ActivityLoading } in package xxx
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=xxx/.init.ActivityLoading } in package xxx
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 11 // KEYCODE_4
:Sending Key (ACTION_UP): 11 // KEYCODE_4
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 23 // KEYCODE_DPAD_CENTER
:Sending Key (ACTION_UP): 23 // KEYCODE_DPAD_CENTER
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 21 // KEYCODE_DPAD_LEFT
:Sending Key (ACTION_UP): 21 // KEYCODE_DPAD_LEFT
Sleeping for 0 milliseconds
:Sending Touch (ACTION_DOWN): 0:(863.0,1678.0)
:Sending Touch (ACTION_MOVE): 0:(864.73267,1664.1354)
:Sending Touch (ACTION_MOVE): 0:(867.6645,1649.1085)
Events injected: 10
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=58ms (0ms mobile, 0ms wifi, 58ms not connected)
// Monkey finished
3、设置每次模拟点击时间间隔
E:\SVN\target\xxx>adb shell monkey -p 包名 -v -v -v --throttle 100 1000
间隔100毫秒,执行1000次
4、如何停止monkey测试
在adb shell中执行:
ps | grep monkey
上图中可以看到,有monkey进程在后台运行,id为15248,然后我们可以运行kill命令,来杀死该进程。执行如下命令:
kill pid(如上图中的15248)即可。
5、自动测试我们不可能随时盯着terminal看log日志输出,我们需要系统自动帮我们完成测试,我们只需要知道测试过程中发生的异常,以后复现异常并解决它。
E:\SVN\target\xxx>adb shell monkey -p 包名 -v --ignore-crashes -s 20170704 --throttle 100 1000 >monkeytest.txt
这段代码的意思就是:
--ignore-crashes 忽略异常,就算碰到异常不会停止测试,有助于我们完整的测试;
-s 20170704 设置一个seed值,monkey测试的操作次序是伪随机生成的,所以设置相同的seed可以保证两次测试操作次序完全一致,有助于我们复现和验证bug;
>monkeytest.txt 生成一个txt文件放在项目的根目录下,所有的异常可以在这里找到。
6、日志分析
正常情况, 如果Monkey测试顺利执行完成, 在log的最后, 会打印出当前执行事件的次数和所花费的时间; // Monkey finished 代表执行完成。
Monkey 测试出现错误后,一般的分析步骤:
看Monkey的日志 (注意第一个swith以及异常信息等)
1. 程序无响应的问题: 在日志中搜索 “ANR”;
2. 崩溃问题:在日志中搜索 “Exception” (如果出现空指针, NullPointerException) 肯定是有bug。
Monkey 执行中断, 在log最后也能看到当前执行次数。
参考:
http://www.cnblogs.com/TankXiao/p/4815134.html